raid6: hide internals

Split out two new headers from the public pq.h:

 - lib/raid/raid6/algos.h contains the algorithm lists private to
   lib/raid/raid6
 - include/linux/raid/pq_tables.h contains the tables also used by
   async_tx providers.

The public include/linux/pq.h is now limited to the public interface for
the consumers of the RAID6 PQ API.

[hch@lst.de: remove duplicate ccflags-y line]
  Link: https://lore.kernel.org/20260527074539.2292913-2-hch@lst.de
Link: https://lore.kernel.org/20260518051804.462141-10-hch@lst.de
Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Tested-by: Ard Biesheuvel <ardb@kernel.org> # kunit only on arm64
Cc: Albert Ou <aou@eecs.berkeley.edu>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Alexandre Ghiti <alex@ghiti.fr>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: "Borislav Petkov (AMD)" <bp@alien8.de>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Chris Mason <clm@fb.com>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: David Sterba <dsterba@suse.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Li Nan <linan122@huawei.com>
Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Song Liu <song@kernel.org>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: WANG Xuerui <kernel@xen0n.name>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Christoph Hellwig
2026-05-18 07:17:52 +02:00
committed by Andrew Morton
parent 2790045a62
commit 769d603fc4
29 changed files with 149 additions and 103 deletions

View File

@@ -8,6 +8,7 @@
#include <linux/module.h>
#include <linux/dma-mapping.h>
#include <linux/raid/pq.h>
#include <linux/raid/pq_tables.h>
#include <linux/async_tx.h>
#include <linux/gfp.h>

View File

@@ -11,6 +11,7 @@
#include <linux/module.h>
#include <linux/dma-mapping.h>
#include <linux/raid/pq.h>
#include <linux/raid/pq_tables.h>
#include <linux/async_tx.h>
#include <linux/dmaengine.h>

View File

@@ -40,6 +40,7 @@
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/raid/pq.h>
#include <linux/raid/pq_tables.h>
#include "dmaengine.h"

View File

@@ -1,15 +1,13 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* -*- linux-c -*- ------------------------------------------------------- *
/*
* Copyright 2003 H. Peter Anvin - All Rights Reserved
*
* Copyright 2003 H. Peter Anvin - All Rights Reserved
*
* ----------------------------------------------------------------------- */
* Public interface to the RAID6 P/Q calculation and recovery library.
*/
#ifndef LINUX_RAID_PQ_H
#define LINUX_RAID_PQ_H
#ifndef LINUX_RAID_RAID6_H
#define LINUX_RAID_RAID6_H
#include <linux/blkdev.h>
#include <linux/mm.h>
#include <linux/types.h>
#define RAID6_MIN_DISKS 4
@@ -23,82 +21,4 @@ void raid6_recov_2data(int disks, size_t bytes, int faila, int failb,
void raid6_recov_datap(int disks, size_t bytes, int faila,
void **ptrs);
/* Routine choices */
struct raid6_calls {
void (*gen_syndrome)(int, size_t, void **);
void (*xor_syndrome)(int, int, int, size_t, void **);
int (*valid)(void); /* Returns 1 if this routine set is usable */
const char *name; /* Name of this routine set */
int priority; /* Relative priority ranking if non-zero */
};
/* Various routine sets */
extern const struct raid6_calls raid6_intx1;
extern const struct raid6_calls raid6_intx2;
extern const struct raid6_calls raid6_intx4;
extern const struct raid6_calls raid6_intx8;
extern const struct raid6_calls raid6_mmxx1;
extern const struct raid6_calls raid6_mmxx2;
extern const struct raid6_calls raid6_sse1x1;
extern const struct raid6_calls raid6_sse1x2;
extern const struct raid6_calls raid6_sse2x1;
extern const struct raid6_calls raid6_sse2x2;
extern const struct raid6_calls raid6_sse2x4;
extern const struct raid6_calls raid6_altivec1;
extern const struct raid6_calls raid6_altivec2;
extern const struct raid6_calls raid6_altivec4;
extern const struct raid6_calls raid6_altivec8;
extern const struct raid6_calls raid6_avx2x1;
extern const struct raid6_calls raid6_avx2x2;
extern const struct raid6_calls raid6_avx2x4;
extern const struct raid6_calls raid6_avx512x1;
extern const struct raid6_calls raid6_avx512x2;
extern const struct raid6_calls raid6_avx512x4;
extern const struct raid6_calls raid6_s390vx8;
extern const struct raid6_calls raid6_vpermxor1;
extern const struct raid6_calls raid6_vpermxor2;
extern const struct raid6_calls raid6_vpermxor4;
extern const struct raid6_calls raid6_vpermxor8;
extern const struct raid6_calls raid6_lsx;
extern const struct raid6_calls raid6_lasx;
extern const struct raid6_calls raid6_rvvx1;
extern const struct raid6_calls raid6_rvvx2;
extern const struct raid6_calls raid6_rvvx4;
extern const struct raid6_calls raid6_rvvx8;
struct raid6_recov_calls {
void (*data2)(int, size_t, int, int, void **);
void (*datap)(int, size_t, int, void **);
int (*valid)(void);
const char *name;
int priority;
};
extern const struct raid6_recov_calls raid6_recov_intx1;
extern const struct raid6_recov_calls raid6_recov_ssse3;
extern const struct raid6_recov_calls raid6_recov_avx2;
extern const struct raid6_recov_calls raid6_recov_avx512;
extern const struct raid6_recov_calls raid6_recov_s390xc;
extern const struct raid6_recov_calls raid6_recov_neon;
extern const struct raid6_recov_calls raid6_recov_lsx;
extern const struct raid6_recov_calls raid6_recov_lasx;
extern const struct raid6_recov_calls raid6_recov_rvv;
extern const struct raid6_calls raid6_neonx1;
extern const struct raid6_calls raid6_neonx2;
extern const struct raid6_calls raid6_neonx4;
extern const struct raid6_calls raid6_neonx8;
/* Algorithm list */
extern const struct raid6_calls * const raid6_algos[];
extern const struct raid6_recov_calls *const raid6_recov_algos[];
/* Galois field tables */
extern const u8 raid6_gfmul[256][256] __attribute__((aligned(256)));
extern const u8 raid6_vgfmul[256][32] __attribute__((aligned(256)));
extern const u8 raid6_gfexp[256] __attribute__((aligned(256)));
extern const u8 raid6_gflog[256] __attribute__((aligned(256)));
extern const u8 raid6_gfinv[256] __attribute__((aligned(256)));
extern const u8 raid6_gfexi[256] __attribute__((aligned(256)));
#endif /* LINUX_RAID_RAID6_H */
#endif /* LINUX_RAID_PQ_H */

View File

@@ -0,0 +1,19 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright 2003 H. Peter Anvin - All Rights Reserved
*
* Galois field tables for the Linux RAID6 P/Q parity algorithm.
*/
#ifndef _LINUX_RAID_PQ_TABLES_H
#define _LINUX_RAID_PQ_TABLES_H
#include <linux/types.h>
extern const u8 raid6_gfmul[256][256] __attribute__((aligned(256)));
extern const u8 raid6_vgfmul[256][32] __attribute__((aligned(256)));
extern const u8 raid6_gfexp[256] __attribute__((aligned(256)));
extern const u8 raid6_gflog[256] __attribute__((aligned(256)));
extern const u8 raid6_gfinv[256] __attribute__((aligned(256)));
extern const u8 raid6_gfexi[256] __attribute__((aligned(256)));
#endif /* _LINUX_RAID_PQ_TABLES_H */

View File

@@ -11,10 +11,11 @@
* Algorithm list and algorithm selection for RAID-6
*/
#include <linux/raid/pq.h>
#include <linux/module.h>
#include <linux/gfp.h>
#include <linux/raid/pq.h>
#include <kunit/visibility.h>
#include "algos.h"
static const struct raid6_recov_calls *raid6_recov_algo;

82
lib/raid/raid6/algos.h Normal file
View File

@@ -0,0 +1,82 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright 2003 H. Peter Anvin - All Rights Reserved
*/
#ifndef _PQ_IMPL_H
#define _PQ_IMPL_H
#include <linux/raid/pq_tables.h>
/* Routine choices */
struct raid6_calls {
const char *name;
void (*gen_syndrome)(int disks, size_t bytes, void **ptrs);
void (*xor_syndrome)(int disks, int start, int stop, size_t bytes,
void **ptrs);
int (*valid)(void); /* Returns 1 if this routine set is usable */
int priority; /* Relative priority ranking if non-zero */
};
/* Various routine sets */
extern const struct raid6_calls raid6_intx1;
extern const struct raid6_calls raid6_intx2;
extern const struct raid6_calls raid6_intx4;
extern const struct raid6_calls raid6_intx8;
extern const struct raid6_calls raid6_mmxx1;
extern const struct raid6_calls raid6_mmxx2;
extern const struct raid6_calls raid6_sse1x1;
extern const struct raid6_calls raid6_sse1x2;
extern const struct raid6_calls raid6_sse2x1;
extern const struct raid6_calls raid6_sse2x2;
extern const struct raid6_calls raid6_sse2x4;
extern const struct raid6_calls raid6_altivec1;
extern const struct raid6_calls raid6_altivec2;
extern const struct raid6_calls raid6_altivec4;
extern const struct raid6_calls raid6_altivec8;
extern const struct raid6_calls raid6_avx2x1;
extern const struct raid6_calls raid6_avx2x2;
extern const struct raid6_calls raid6_avx2x4;
extern const struct raid6_calls raid6_avx512x1;
extern const struct raid6_calls raid6_avx512x2;
extern const struct raid6_calls raid6_avx512x4;
extern const struct raid6_calls raid6_s390vx8;
extern const struct raid6_calls raid6_vpermxor1;
extern const struct raid6_calls raid6_vpermxor2;
extern const struct raid6_calls raid6_vpermxor4;
extern const struct raid6_calls raid6_vpermxor8;
extern const struct raid6_calls raid6_lsx;
extern const struct raid6_calls raid6_lasx;
extern const struct raid6_calls raid6_rvvx1;
extern const struct raid6_calls raid6_rvvx2;
extern const struct raid6_calls raid6_rvvx4;
extern const struct raid6_calls raid6_rvvx8;
struct raid6_recov_calls {
const char *name;
void (*data2)(int disks, size_t bytes, int faila, int failb,
void **ptrs);
void (*datap)(int disks, size_t bytes, int faila, void **ptrs);
int (*valid)(void);
int priority;
};
extern const struct raid6_recov_calls raid6_recov_intx1;
extern const struct raid6_recov_calls raid6_recov_ssse3;
extern const struct raid6_recov_calls raid6_recov_avx2;
extern const struct raid6_recov_calls raid6_recov_avx512;
extern const struct raid6_recov_calls raid6_recov_s390xc;
extern const struct raid6_recov_calls raid6_recov_neon;
extern const struct raid6_recov_calls raid6_recov_lsx;
extern const struct raid6_recov_calls raid6_recov_lasx;
extern const struct raid6_recov_calls raid6_recov_rvv;
extern const struct raid6_calls raid6_neonx1;
extern const struct raid6_calls raid6_neonx2;
extern const struct raid6_calls raid6_neonx4;
extern const struct raid6_calls raid6_neonx8;
/* Algorithm list */
extern const struct raid6_calls * const raid6_algos[];
extern const struct raid6_recov_calls *const raid6_recov_algos[];
#endif /* _PQ_IMPL_H */

View File

@@ -5,8 +5,8 @@
* Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org>
*/
#include <linux/raid/pq.h>
#include <asm/simd.h>
#include "algos.h"
/*
* There are 2 reasons these wrappers are kept in a separate compilation unit

View File

@@ -4,8 +4,10 @@
* Copyright (C) 2017 Linaro Ltd. <ard.biesheuvel@linaro.org>
*/
#include <linux/mm.h>
#include <linux/raid/pq.h>
#include <asm/simd.h>
#include "algos.h"
#include "arm/neon.h"
static int raid6_has_neon(void)

View File

@@ -18,7 +18,7 @@
* This file is postprocessed using unroll.awk
*/
#include <linux/raid/pq.h>
#include "algos.h"
/*
* This is the C data type to use

View File

@@ -9,9 +9,9 @@
* Copyright 2002-2004 H. Peter Anvin
*/
#include <linux/raid/pq.h>
#include <asm/cpu-features.h>
#include <asm/fpu.h>
#include "algos.h"
/*
* The vector algorithms are currently priority 0, which means the generic

View File

@@ -10,9 +10,11 @@
* Author: Jim Kukunas <james.t.kukunas@linux.intel.com>
*/
#include <linux/mm.h>
#include <linux/raid/pq.h>
#include <asm/cpu-features.h>
#include <asm/fpu.h>
#include "algos.h"
/*
* Unlike with the syndrome calculation algorithms, there's no boot-time

View File

@@ -57,7 +57,7 @@ int main(int argc, char *argv[])
uint8_t exptbl[256], invtbl[256];
printf("#include <linux/export.h>\n");
printf("#include <linux/raid/pq.h>\n");
printf("#include \"algos.h\"\n");
/* Compute multiplication table */
printf("\nconst u8 __attribute__((aligned(256)))\n"

View File

@@ -22,7 +22,7 @@
* bracked this with preempt_disable/enable or in a lock)
*/
#include <linux/raid/pq.h>
#include "algos.h"
#include <altivec.h>
#include <asm/cputable.h>

View File

@@ -20,11 +20,11 @@
* This instruction was introduced in POWER8 - ISA v2.07.
*/
#include <linux/raid/pq.h>
#include <altivec.h>
#include <asm/ppc-opcode.h>
#include <asm/cputable.h>
#include <asm/switch_to.h>
#include "algos.h"
typedef vector unsigned char unative_t;
#define NSIZE sizeof(unative_t)

View File

@@ -13,7 +13,9 @@
* the syndrome.)
*/
#include <linux/mm.h>
#include <linux/raid/pq.h>
#include "algos.h"
/* Recover two failed data blocks. */
static void raid6_2data_recov_intx1(int disks, size_t bytes, int faila,

View File

@@ -4,7 +4,9 @@
* Author: Chunyan Zhang <zhangchunyan@iscas.ac.cn>
*/
#include <linux/mm.h>
#include <linux/raid/pq.h>
#include "algos.h"
#include "rvv.h"
static void __raid6_2data_recov_rvv(int bytes, u8 *p, u8 *q, u8 *dp,

View File

@@ -7,8 +7,8 @@
* Definitions for RISC-V RAID-6 code
*/
#include <linux/raid/pq.h>
#include <asm/vector.h>
#include "algos.h"
static int rvv_has_vector(void)
{

View File

@@ -6,7 +6,9 @@
* Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
*/
#include <linux/mm.h>
#include <linux/raid/pq.h>
#include "algos.h"
static inline void xor_block(u8 *p1, u8 *p2)
{

View File

@@ -12,8 +12,8 @@
*/
#include <linux/cpufeature.h>
#include <linux/raid/pq.h>
#include <asm/fpu.h>
#include "algos.h"
#define NSIZE 16

View File

@@ -7,7 +7,7 @@
#include <kunit/test.h>
#include <linux/prandom.h>
#include <linux/raid/pq.h>
#include "../algos.h"
MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");

View File

@@ -13,8 +13,9 @@
*
*/
#include <linux/raid/pq.h>
#include <asm/cpufeature.h>
#include <asm/fpu/api.h>
#include "algos.h"
static const struct raid6_avx2_constants {
u64 x1d[4];

View File

@@ -17,8 +17,9 @@
*
*/
#include <linux/raid/pq.h>
#include <asm/cpufeature.h>
#include <asm/fpu/api.h>
#include "algos.h"
static const struct raid6_avx512_constants {
u64 x1d[8];

View File

@@ -11,8 +11,9 @@
* MMX implementation of RAID-6 syndrome functions
*/
#include <linux/raid/pq.h>
#include <asm/cpufeature.h>
#include <asm/fpu/api.h>
#include "algos.h"
/* Shared with raid6/sse1.c */
const struct raid6_mmx_constants {

View File

@@ -4,8 +4,10 @@
* Author: Jim Kukunas <james.t.kukunas@linux.intel.com>
*/
#include <linux/mm.h>
#include <linux/raid/pq.h>
#include <asm/fpu/api.h>
#include "algos.h"
static int raid6_has_avx2(void)
{

View File

@@ -6,8 +6,10 @@
* Author: Megha Dey <megha.dey@linux.intel.com>
*/
#include <linux/mm.h>
#include <linux/raid/pq.h>
#include <asm/fpu/api.h>
#include "algos.h"
static int raid6_has_avx512(void)
{

View File

@@ -3,8 +3,10 @@
* Copyright (C) 2012 Intel Corporation
*/
#include <linux/mm.h>
#include <linux/raid/pq.h>
#include <asm/fpu/api.h>
#include "algos.h"
static int raid6_has_ssse3(void)
{

View File

@@ -16,8 +16,9 @@
* worthwhile as a separate implementation.
*/
#include <linux/raid/pq.h>
#include <asm/cpufeature.h>
#include <asm/fpu/api.h>
#include "algos.h"
/* Defined in raid6/mmx.c */
extern const struct raid6_mmx_constants {

View File

@@ -12,8 +12,9 @@
*
*/
#include <linux/raid/pq.h>
#include <asm/cpufeature.h>
#include <asm/fpu/api.h>
#include "algos.h"
static const struct raid6_sse_constants {
u64 x1d[2];