mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

- The 2 patch series "squashfs: Remove page->mapping references" from Matthew Wilcox gets us closer to being able to remove page->mapping. - The 5 patch series "relayfs: misc changes" from Jason Xing does some maintenance and minor feature addition work in relayfs. - The 5 patch series "kdump: crashkernel reservation from CMA" from Jiri Bohac switches us from static preallocation of the kdump crashkernel's working memory over to dynamic allocation. So the difficulty of a-priori estimation of the second kernel's needs is removed and the first kernel obtains extra memory. - The 5 patch series "generalize panic_print's dump function to be used by other kernel parts" from Feng Tang implements some consolidation and rationalizatio of the various ways in which a faiing kernel splats information at the operator. -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQTTMBEPP41GrTpTJgfdBJ7gKXxAjgUCaI+82gAKCRDdBJ7gKXxA jj4JAP9xb+w9DrBY6sa+7KTPIb+aTqQ7Zw3o9O2m+riKQJv6jAEA6aEwRnDA0451 fDT5IqVlCWGvnVikdZHSnvhdD7TGsQ0= =rT71 -----END PGP SIGNATURE----- Merge tag 'mm-nonmm-stable-2025-08-03-12-47' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm Pull non-MM updates from Andrew Morton: "Significant patch series in this pull request: - "squashfs: Remove page->mapping references" (Matthew Wilcox) gets us closer to being able to remove page->mapping - "relayfs: misc changes" (Jason Xing) does some maintenance and minor feature addition work in relayfs - "kdump: crashkernel reservation from CMA" (Jiri Bohac) switches us from static preallocation of the kdump crashkernel's working memory over to dynamic allocation. So the difficulty of a-priori estimation of the second kernel's needs is removed and the first kernel obtains extra memory - "generalize panic_print's dump function to be used by other kernel parts" (Feng Tang) implements some consolidation and rationalization of the various ways in which a failing kernel splats information at the operator * tag 'mm-nonmm-stable-2025-08-03-12-47' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm: (80 commits) tools/getdelays: add backward compatibility for taskstats version kho: add test for kexec handover delaytop: enhance error logging and add PSI feature description samples: Kconfig: fix spelling mistake "instancess" -> "instances" fat: fix too many log in fat_chain_add() scripts/spelling.txt: add notifer||notifier to spelling.txt xen/xenbus: fix typo "notifer" net: mvneta: fix typo "notifer" drm/xe: fix typo "notifer" cxl: mce: fix typo "notifer" KVM: x86: fix typo "notifer" MAINTAINERS: add maintainers for delaytop ucount: use atomic_long_try_cmpxchg() in atomic_long_inc_below() ucount: fix atomic_long_inc_below() argument type kexec: enable CMA based contiguous allocation stackdepot: make max number of pools boot-time configurable lib/xxhash: remove unused functions init/Kconfig: restore CONFIG_BROKEN help text lib/raid6: update recov_rvv.c zero page usage docs: update docs after introducing delaytop ...
116 lines
2.7 KiB
C
116 lines
2.7 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* RAID-6 data recovery in dual failure mode based on the XC instruction.
|
|
*
|
|
* Copyright IBM Corp. 2016
|
|
* Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
|
|
*/
|
|
|
|
#include <linux/raid/pq.h>
|
|
|
|
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] = raid6_get_zero_page();
|
|
ptrs[disks-2] = dp;
|
|
dq = (u8 *)ptrs[failb];
|
|
ptrs[failb] = raid6_get_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] = raid6_get_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,
|
|
};
|