root/include/linux/raid/pq.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. cpu_relax
  2. raid6_jiffies

   1 /* SPDX-License-Identifier: GPL-2.0-or-later */
   2 /* -*- linux-c -*- ------------------------------------------------------- *
   3  *
   4  *   Copyright 2003 H. Peter Anvin - All Rights Reserved
   5  *
   6  * ----------------------------------------------------------------------- */
   7 
   8 #ifndef LINUX_RAID_RAID6_H
   9 #define LINUX_RAID_RAID6_H
  10 
  11 #ifdef __KERNEL__
  12 
  13 /* Set to 1 to use kernel-wide empty_zero_page */
  14 #define RAID6_USE_EMPTY_ZERO_PAGE 0
  15 #include <linux/blkdev.h>
  16 
  17 /* We need a pre-zeroed page... if we don't want to use the kernel-provided
  18    one define it here */
  19 #if RAID6_USE_EMPTY_ZERO_PAGE
  20 # define raid6_empty_zero_page empty_zero_page
  21 #else
  22 extern const char raid6_empty_zero_page[PAGE_SIZE];
  23 #endif
  24 
  25 #else /* ! __KERNEL__ */
  26 /* Used for testing in user space */
  27 
  28 #include <errno.h>
  29 #include <inttypes.h>
  30 #include <stddef.h>
  31 #include <sys/mman.h>
  32 #include <sys/time.h>
  33 #include <sys/types.h>
  34 
  35 /* Not standard, but glibc defines it */
  36 #define BITS_PER_LONG __WORDSIZE
  37 
  38 typedef uint8_t  u8;
  39 typedef uint16_t u16;
  40 typedef uint32_t u32;
  41 typedef uint64_t u64;
  42 
  43 #ifndef PAGE_SIZE
  44 # define PAGE_SIZE 4096
  45 #endif
  46 extern const char raid6_empty_zero_page[PAGE_SIZE];
  47 
  48 #define __init
  49 #define __exit
  50 #ifndef __attribute_const__
  51 # define __attribute_const__ __attribute__((const))
  52 #endif
  53 #define noinline __attribute__((noinline))
  54 
  55 #define preempt_enable()
  56 #define preempt_disable()
  57 #define cpu_has_feature(x) 1
  58 #define enable_kernel_altivec()
  59 #define disable_kernel_altivec()
  60 
  61 #undef  EXPORT_SYMBOL
  62 #define EXPORT_SYMBOL(sym)
  63 #undef  EXPORT_SYMBOL_GPL
  64 #define EXPORT_SYMBOL_GPL(sym)
  65 #define MODULE_LICENSE(licence)
  66 #define MODULE_DESCRIPTION(desc)
  67 #define subsys_initcall(x)
  68 #define module_exit(x)
  69 
  70 #define IS_ENABLED(x) (x)
  71 #define CONFIG_RAID6_PQ_BENCHMARK 1
  72 #endif /* __KERNEL__ */
  73 
  74 /* Routine choices */
  75 struct raid6_calls {
  76         void (*gen_syndrome)(int, size_t, void **);
  77         void (*xor_syndrome)(int, int, int, size_t, void **);
  78         int  (*valid)(void);    /* Returns 1 if this routine set is usable */
  79         const char *name;       /* Name of this routine set */
  80         int prefer;             /* Has special performance attribute */
  81 };
  82 
  83 /* Selected algorithm */
  84 extern struct raid6_calls raid6_call;
  85 
  86 /* Various routine sets */
  87 extern const struct raid6_calls raid6_intx1;
  88 extern const struct raid6_calls raid6_intx2;
  89 extern const struct raid6_calls raid6_intx4;
  90 extern const struct raid6_calls raid6_intx8;
  91 extern const struct raid6_calls raid6_intx16;
  92 extern const struct raid6_calls raid6_intx32;
  93 extern const struct raid6_calls raid6_mmxx1;
  94 extern const struct raid6_calls raid6_mmxx2;
  95 extern const struct raid6_calls raid6_sse1x1;
  96 extern const struct raid6_calls raid6_sse1x2;
  97 extern const struct raid6_calls raid6_sse2x1;
  98 extern const struct raid6_calls raid6_sse2x2;
  99 extern const struct raid6_calls raid6_sse2x4;
 100 extern const struct raid6_calls raid6_altivec1;
 101 extern const struct raid6_calls raid6_altivec2;
 102 extern const struct raid6_calls raid6_altivec4;
 103 extern const struct raid6_calls raid6_altivec8;
 104 extern const struct raid6_calls raid6_avx2x1;
 105 extern const struct raid6_calls raid6_avx2x2;
 106 extern const struct raid6_calls raid6_avx2x4;
 107 extern const struct raid6_calls raid6_avx512x1;
 108 extern const struct raid6_calls raid6_avx512x2;
 109 extern const struct raid6_calls raid6_avx512x4;
 110 extern const struct raid6_calls raid6_s390vx8;
 111 extern const struct raid6_calls raid6_vpermxor1;
 112 extern const struct raid6_calls raid6_vpermxor2;
 113 extern const struct raid6_calls raid6_vpermxor4;
 114 extern const struct raid6_calls raid6_vpermxor8;
 115 
 116 struct raid6_recov_calls {
 117         void (*data2)(int, size_t, int, int, void **);
 118         void (*datap)(int, size_t, int, void **);
 119         int  (*valid)(void);
 120         const char *name;
 121         int priority;
 122 };
 123 
 124 extern const struct raid6_recov_calls raid6_recov_intx1;
 125 extern const struct raid6_recov_calls raid6_recov_ssse3;
 126 extern const struct raid6_recov_calls raid6_recov_avx2;
 127 extern const struct raid6_recov_calls raid6_recov_avx512;
 128 extern const struct raid6_recov_calls raid6_recov_s390xc;
 129 extern const struct raid6_recov_calls raid6_recov_neon;
 130 
 131 extern const struct raid6_calls raid6_neonx1;
 132 extern const struct raid6_calls raid6_neonx2;
 133 extern const struct raid6_calls raid6_neonx4;
 134 extern const struct raid6_calls raid6_neonx8;
 135 
 136 /* Algorithm list */
 137 extern const struct raid6_calls * const raid6_algos[];
 138 extern const struct raid6_recov_calls *const raid6_recov_algos[];
 139 int raid6_select_algo(void);
 140 
 141 /* Return values from chk_syndrome */
 142 #define RAID6_OK        0
 143 #define RAID6_P_BAD     1
 144 #define RAID6_Q_BAD     2
 145 #define RAID6_PQ_BAD    3
 146 
 147 /* Galois field tables */
 148 extern const u8 raid6_gfmul[256][256] __attribute__((aligned(256)));
 149 extern const u8 raid6_vgfmul[256][32] __attribute__((aligned(256)));
 150 extern const u8 raid6_gfexp[256]      __attribute__((aligned(256)));
 151 extern const u8 raid6_gflog[256]      __attribute__((aligned(256)));
 152 extern const u8 raid6_gfinv[256]      __attribute__((aligned(256)));
 153 extern const u8 raid6_gfexi[256]      __attribute__((aligned(256)));
 154 
 155 /* Recovery routines */
 156 extern void (*raid6_2data_recov)(int disks, size_t bytes, int faila, int failb,
 157                        void **ptrs);
 158 extern void (*raid6_datap_recov)(int disks, size_t bytes, int faila,
 159                         void **ptrs);
 160 void raid6_dual_recov(int disks, size_t bytes, int faila, int failb,
 161                       void **ptrs);
 162 
 163 /* Some definitions to allow code to be compiled for testing in userspace */
 164 #ifndef __KERNEL__
 165 
 166 # define jiffies        raid6_jiffies()
 167 # define printk         printf
 168 # define pr_err(format, ...) fprintf(stderr, format, ## __VA_ARGS__)
 169 # define pr_info(format, ...) fprintf(stdout, format, ## __VA_ARGS__)
 170 # define GFP_KERNEL     0
 171 # define __get_free_pages(x, y) ((unsigned long)mmap(NULL, PAGE_SIZE << (y), \
 172                                                      PROT_READ|PROT_WRITE,   \
 173                                                      MAP_PRIVATE|MAP_ANONYMOUS,\
 174                                                      0, 0))
 175 # define free_pages(x, y)       munmap((void *)(x), PAGE_SIZE << (y))
 176 
 177 static inline void cpu_relax(void)
 178 {
 179         /* Nothing */
 180 }
 181 
 182 #undef  HZ
 183 #define HZ 1000
 184 static inline uint32_t raid6_jiffies(void)
 185 {
 186         struct timeval tv;
 187         gettimeofday(&tv, NULL);
 188         return tv.tv_sec*1000 + tv.tv_usec/1000;
 189 }
 190 
 191 #endif /* ! __KERNEL__ */
 192 
 193 #endif /* LINUX_RAID_RAID6_H */

/* [<][>][^][v][top][bottom][index][help] */