/* * RAID-6 data recovery in dual failure mode based on the XC instruction. * * Copyright IBM Corp. 2016 * Author(s): Martin Schwidefsky */ #include #include static inline void xor_block(u8 *p1, u8 *p2) { typedef struct { u8 _[256]; } addrtype; asm volatile( " xc 0(256,%[p1]),0(%[p2])\n" : "+m" (*(addrtype *) p1) : "m" (*(addrtype *) p2), [p1] "a" (p1), [p2] "a" (p2) : "cc"); } /* Recover two failed data blocks. */ static void raid6_2data_recov_s390xc(int disks, size_t bytes, int faila, int failb, void **ptrs) { u8 *p, *q, *dp, *dq; const u8 *pbmul; /* P multiplier table for B data */ const u8 *qmul; /* Q multiplier table (for both) */ int i; p = (u8 *)ptrs[disks-2]; q = (u8 *)ptrs[disks-1]; /* Compute syndrome with zero for the missing data pages Use the dead data pages as temporary storage for delta p and delta q */ dp = (u8 *)ptrs[faila]; ptrs[faila] = (void *)raid6_empty_zero_page; ptrs[disks-2] = dp; dq = (u8 *)ptrs[failb]; ptrs[failb] = (void *)raid6_empty_zero_page; ptrs[disks-1] = dq; raid6_call.gen_syndrome(disks, bytes, ptrs); /* Restore pointer table */ ptrs[faila] = dp; ptrs[failb] = dq; ptrs[disks-2] = p; ptrs[disks-1] = q; /* Now, pick the proper data tables */ pbmul = raid6_gfmul[raid6_gfexi[failb-faila]]; qmul = raid6_gfmul[raid6_gfinv[raid6_gfexp[faila]^raid6_gfexp[failb]]]; /* Now do it... */ while (bytes) { xor_block(dp, p); xor_block(dq, q); for (i = 0; i < 256; i++) dq[i] = pbmul[dp[i]] ^ qmul[dq[i]]; xor_block(dp, dq); p += 256; q += 256; dp += 256; dq += 256; bytes -= 256; } } /* Recover failure of one data block plus the P block */ static void raid6_datap_recov_s390xc(int disks, size_t bytes, int faila, void **ptrs) { u8 *p, *q, *dq; const u8 *qmul; /* Q multiplier table */ int i; p = (u8 *)ptrs[disks-2]; q = (u8 *)ptrs[disks-1]; /* Compute syndrome with zero for the missing data page Use the dead data page as temporary storage for delta q */ dq = (u8 *)ptrs[faila]; ptrs[faila] = (void *)raid6_empty_zero_page; ptrs[disks-1] = dq; raid6_call.gen_syndrome(disks, bytes, ptrs); /* Restore pointer table */ ptrs[faila] = dq; ptrs[disks-1] = q; /* Now, pick the proper data tables */ qmul = raid6_gfmul[raid6_gfinv[raid6_gfexp[faila]]]; /* Now do it... */ while (bytes) { xor_block(dq, q); for (i = 0; i < 256; i++) dq[i] = qmul[dq[i]]; xor_block(p, dq); p += 256; q += 256; dq += 256; bytes -= 256; } } const struct raid6_recov_calls raid6_recov_s390xc = { .data2 = raid6_2data_recov_s390xc, .datap = raid6_datap_recov_s390xc, .valid = NULL, .name = "s390xc", .priority = 1, }; git.cgi/linux/net-next.git/commit/?id=6ea17ed15d9a343c2d17d76b99501fcad204f309'>root/include/trace/syscall.h
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-01-08 11:22:00 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2017-01-08 11:22:00 -0800
commit6ea17ed15d9a343c2d17d76b99501fcad204f309 (patch)
tree17a8ce6b61906d57a79e20639bc6330d0b805cc6 /include/trace/syscall.h
parentea07b862ac8ef9b8c8358517d2e39f847dda6659 (diff)
parent01d0f715869161dc70e2bf66fcdf6533a6a782cd (diff)
Merge tag 'staging-4.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
Pull staging/IIO fixes from Greg KH: "Here are some staging and IIO driver fixes for 4.10-rc3. Most of these are minor IIO fixes of reported issues, along with one network driver fix to resolve an issue. And a MAINTAINERS update with a new mailing list. All of these, except the MAINTAINERS file update, have been in linux-next with no reported issues (the MAINTAINERS patch happened on Friday...)" * tag 'staging-4.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: MAINTAINERS: add greybus subsystem mailing list staging: octeon: Call SET_NETDEV_DEV() iio: accel: st_accel: fix LIS3LV02 reading and scaling iio: common: st_sensors: fix channel data parsing iio: max44000: correct value in illuminance_integration_time_available iio: adc: TI_AM335X_ADC should depend on HAS_DMA iio: bmi160: Fix time needed to sleep after command execution iio: 104-quad-8: Fix active level mismatch for the preset enable option iio: 104-quad-8: Fix off-by-one errors when addressing IOR iio: 104-quad-8: Fix index control configuration
Diffstat (limited to 'include/trace/syscall.h')