]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
lib/raid6: replace custom zero page with ZERO_PAGE
authorHerbert Xu <herbert@gondor.apana.org.au>
Mon, 17 Mar 2025 09:02:28 +0000 (17:02 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 10 Jul 2025 05:57:54 +0000 (22:57 -0700)
Use the system-wide zero page instead of a custom zero page.

[herbert@gondor.apana.org.au: update lib/raid6/recov_rvv.c, per Klara]
Link: https://lkml.kernel.org/r/aFkUnXWtxcgOTVkw@gondor.apana.org.au
Link: https://lkml.kernel.org/r/Z9flJNkWQICx0PXk@gondor.apana.org.au
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Song Liu <song@kernel.org>
Cc: Yu Kuai <yukuai3@huawei.com>
Cc: Klara Modin <klarasmodin@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
crypto/async_tx/async_pq.c
crypto/async_tx/async_raid6_recov.c
include/linux/raid/pq.h
lib/raid6/algos.c
lib/raid6/recov.c
lib/raid6/recov_avx2.c
lib/raid6/recov_avx512.c
lib/raid6/recov_loongarch_simd.c
lib/raid6/recov_neon.c
lib/raid6/recov_s390xc.c
lib/raid6/recov_ssse3.c

index 5e2b2680d7dbfa9aa4e99a4b2cadbf5f668cc74a..9e4bb7fbde25e4791742fa051f1de30b8586dbde 100644 (file)
@@ -119,7 +119,7 @@ do_sync_gen_syndrome(struct page **blocks, unsigned int *offsets, int disks,
        for (i = 0; i < disks; i++) {
                if (blocks[i] == NULL) {
                        BUG_ON(i > disks - 3); /* P or Q can't be zero */
-                       srcs[i] = (void*)raid6_empty_zero_page;
+                       srcs[i] = raid6_get_zero_page();
                } else {
                        srcs[i] = page_address(blocks[i]) + offsets[i];
 
index 354b8cd5537f8702b513c9106fbeec91d9ca9ac5..539ea5b378dcd6cba715a10a90e72235163a567c 100644 (file)
@@ -414,7 +414,7 @@ async_raid6_2data_recov(int disks, size_t bytes, int faila, int failb,
                async_tx_quiesce(&submit->depend_tx);
                for (i = 0; i < disks; i++)
                        if (blocks[i] == NULL)
-                               ptrs[i] = (void *) raid6_empty_zero_page;
+                               ptrs[i] = raid6_get_zero_page();
                        else
                                ptrs[i] = page_address(blocks[i]) + offs[i];
 
@@ -497,7 +497,7 @@ async_raid6_datap_recov(int disks, size_t bytes, int faila,
                async_tx_quiesce(&submit->depend_tx);
                for (i = 0; i < disks; i++)
                        if (blocks[i] == NULL)
-                               ptrs[i] = (void*)raid6_empty_zero_page;
+                               ptrs[i] = raid6_get_zero_page();
                        else
                                ptrs[i] = page_address(blocks[i]) + offs[i];
 
index 72ff44cca864b6269f495b5d81452d0311bc248a..2467b3be15c9edeb0b9f4e327047c7b73dc7c206 100644 (file)
 #ifdef __KERNEL__
 
 #include <linux/blkdev.h>
+#include <linux/mm.h>
 
-extern const char raid6_empty_zero_page[PAGE_SIZE];
+/* This should be const but the raid6 code is too convoluted for that. */
+static inline void *raid6_get_zero_page(void)
+{
+       return page_address(ZERO_PAGE(0));
+}
 
 #else /* ! __KERNEL__ */
 /* Used for testing in user space */
@@ -191,6 +196,11 @@ static inline uint32_t raid6_jiffies(void)
        return tv.tv_sec*1000 + tv.tv_usec/1000;
 }
 
+static inline void *raid6_get_zero_page(void)
+{
+       return raid6_empty_zero_page;
+}
+
 #endif /* ! __KERNEL__ */
 
 #endif /* LINUX_RAID_RAID6_H */
index 75ce3e134b7c7a825a69ea96d882af97c64c64c6..799e0e5eac26db3d10c07e79f46537af4ec6f182 100644 (file)
@@ -18,9 +18,6 @@
 #else
 #include <linux/module.h>
 #include <linux/gfp.h>
-/* In .bss so it's zeroed */
-const char raid6_empty_zero_page[PAGE_SIZE] __attribute__((aligned(256)));
-EXPORT_SYMBOL(raid6_empty_zero_page);
 #endif
 
 struct raid6_calls raid6_call;
index a7c1b2bbe40d8b76459a5b6b2e8648a8602b99f0..b5e47c008b41bf7af0bfc12f76ecb014d8bb7a7a 100644 (file)
@@ -31,10 +31,10 @@ static void raid6_2data_recov_intx1(int disks, size_t bytes, int faila,
           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[faila] = raid6_get_zero_page();
        ptrs[disks-2] = dp;
        dq = (u8 *)ptrs[failb];
-       ptrs[failb] = (void *)raid6_empty_zero_page;
+       ptrs[failb] = raid6_get_zero_page();
        ptrs[disks-1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
@@ -72,7 +72,7 @@ static void raid6_datap_recov_intx1(int disks, size_t bytes, int faila,
        /* 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[faila] = raid6_get_zero_page();
        ptrs[disks-1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
index 4e8095403ee2890833da99b7905fd2d177b928a4..97d598d2535ca68d34a92e95a8c524af2885e044 100644 (file)
@@ -28,10 +28,10 @@ static void raid6_2data_recov_avx2(int disks, size_t bytes, int faila,
           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[faila] = raid6_get_zero_page();
        ptrs[disks-2] = dp;
        dq = (u8 *)ptrs[failb];
-       ptrs[failb] = (void *)raid6_empty_zero_page;
+       ptrs[failb] = raid6_get_zero_page();
        ptrs[disks-1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
@@ -196,7 +196,7 @@ static void raid6_datap_recov_avx2(int disks, size_t bytes, int faila,
        /* 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[faila] = raid6_get_zero_page();
        ptrs[disks-1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
index 310c715db313477bce2b470abe7bb6dfda223e0a..7986120ca44429e49b99b8181aa5526114cdd2f9 100644 (file)
@@ -37,10 +37,10 @@ static void raid6_2data_recov_avx512(int disks, size_t bytes, int faila,
         */
 
        dp = (u8 *)ptrs[faila];
-       ptrs[faila] = (void *)raid6_empty_zero_page;
+       ptrs[faila] = raid6_get_zero_page();
        ptrs[disks-2] = dp;
        dq = (u8 *)ptrs[failb];
-       ptrs[failb] = (void *)raid6_empty_zero_page;
+       ptrs[failb] = raid6_get_zero_page();
        ptrs[disks-1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
@@ -238,7 +238,7 @@ static void raid6_datap_recov_avx512(int disks, size_t bytes, int faila,
         */
 
        dq = (u8 *)ptrs[faila];
-       ptrs[faila] = (void *)raid6_empty_zero_page;
+       ptrs[faila] = raid6_get_zero_page();
        ptrs[disks-1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
index 94aeac85e6f75e393363868c6306aff8d4521a5b..93dc515997a14e3356d5ef0b53c4b9961c3929af 100644 (file)
@@ -42,10 +42,10 @@ static void raid6_2data_recov_lsx(int disks, size_t bytes, int faila,
         * delta p and delta q
         */
        dp = (u8 *)ptrs[faila];
-       ptrs[faila] = (void *)raid6_empty_zero_page;
+       ptrs[faila] = raid6_get_zero_page();
        ptrs[disks - 2] = dp;
        dq = (u8 *)ptrs[failb];
-       ptrs[failb] = (void *)raid6_empty_zero_page;
+       ptrs[failb] = raid6_get_zero_page();
        ptrs[disks - 1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
@@ -197,7 +197,7 @@ static void raid6_datap_recov_lsx(int disks, size_t bytes, int faila,
         * Use the dead data page as temporary storage for delta q
         */
        dq = (u8 *)ptrs[faila];
-       ptrs[faila] = (void *)raid6_empty_zero_page;
+       ptrs[faila] = raid6_get_zero_page();
        ptrs[disks - 1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
@@ -316,10 +316,10 @@ static void raid6_2data_recov_lasx(int disks, size_t bytes, int faila,
         * delta p and delta q
         */
        dp = (u8 *)ptrs[faila];
-       ptrs[faila] = (void *)raid6_empty_zero_page;
+       ptrs[faila] = raid6_get_zero_page();
        ptrs[disks - 2] = dp;
        dq = (u8 *)ptrs[failb];
-       ptrs[failb] = (void *)raid6_empty_zero_page;
+       ptrs[failb] = raid6_get_zero_page();
        ptrs[disks - 1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
@@ -436,7 +436,7 @@ static void raid6_datap_recov_lasx(int disks, size_t bytes, int faila,
         * Use the dead data page as temporary storage for delta q
         */
        dq = (u8 *)ptrs[faila];
-       ptrs[faila] = (void *)raid6_empty_zero_page;
+       ptrs[faila] = raid6_get_zero_page();
        ptrs[disks - 1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
index 1bfc14174d4dd50b79580ada71ea7142672f0cd6..70e1404c151292c752a7a7d7ef415dc189fbfe14 100644 (file)
@@ -36,10 +36,10 @@ static void raid6_2data_recov_neon(int disks, size_t bytes, int faila,
         * delta p and delta q
         */
        dp = (u8 *)ptrs[faila];
-       ptrs[faila] = (void *)raid6_empty_zero_page;
+       ptrs[faila] = raid6_get_zero_page();
        ptrs[disks - 2] = dp;
        dq = (u8 *)ptrs[failb];
-       ptrs[failb] = (void *)raid6_empty_zero_page;
+       ptrs[failb] = raid6_get_zero_page();
        ptrs[disks - 1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
@@ -74,7 +74,7 @@ static void raid6_datap_recov_neon(int disks, size_t bytes, int faila,
         * Use the dead data page as temporary storage for delta q
         */
        dq = (u8 *)ptrs[faila];
-       ptrs[faila] = (void *)raid6_empty_zero_page;
+       ptrs[faila] = raid6_get_zero_page();
        ptrs[disks - 1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
index 179eec900cea494f2d2d89a9a4273f0a960764cf..1d32c01261be0695f145b1be091adbe3febae636 100644 (file)
@@ -35,10 +35,10 @@ static void raid6_2data_recov_s390xc(int disks, size_t bytes, int faila,
           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[faila] = raid6_get_zero_page();
        ptrs[disks-2] = dp;
        dq = (u8 *)ptrs[failb];
-       ptrs[failb] = (void *)raid6_empty_zero_page;
+       ptrs[failb] = raid6_get_zero_page();
        ptrs[disks-1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
@@ -82,7 +82,7 @@ static void raid6_datap_recov_s390xc(int disks, size_t bytes, int faila,
        /* 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[faila] = raid6_get_zero_page();
        ptrs[disks-1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
index 4bfa3c6b60de719b05fe7c1d14fa0a7e505afa99..2e849185c32b3caec642e9010b76cb4f777342ad 100644 (file)
@@ -30,10 +30,10 @@ static void raid6_2data_recov_ssse3(int disks, size_t bytes, int faila,
           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[faila] = raid6_get_zero_page();
        ptrs[disks-2] = dp;
        dq = (u8 *)ptrs[failb];
-       ptrs[failb] = (void *)raid6_empty_zero_page;
+       ptrs[failb] = raid6_get_zero_page();
        ptrs[disks-1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);
@@ -203,7 +203,7 @@ static void raid6_datap_recov_ssse3(int disks, size_t bytes, int faila,
        /* 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[faila] = raid6_get_zero_page();
        ptrs[disks-1] = dq;
 
        raid6_call.gen_syndrome(disks, bytes, ptrs);