Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /* -*- linux-c -*- ------------------------------------------------------- *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *   Copyright 2002-2007 H. Peter Anvin - All Rights Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * ----------------------------------------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  * raid6test.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  * Test RAID-6 recovery with various algorithms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <stdlib.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <stdio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <linux/raid/pq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #define NDISKS		16	/* Including P and Q */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) const char raid6_empty_zero_page[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) char *dataptrs[NDISKS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) char data[NDISKS][PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) char recovi[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) char recovj[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) static void makedata(int start, int stop)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	int i, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	for (i = start; i <= stop; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 		for (j = 0; j < PAGE_SIZE; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 			data[i][j] = rand();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 		dataptrs[i] = data[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) static char disk_type(int d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	switch (d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	case NDISKS-2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 		return 'P';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	case NDISKS-1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 		return 'Q';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 		return 'D';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) static int test_disks(int i, int j)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	int erra, errb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	memset(recovi, 0xf0, PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	memset(recovj, 0xba, PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	dataptrs[i] = recovi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	dataptrs[j] = recovj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	raid6_dual_recov(NDISKS, PAGE_SIZE, i, j, (void **)&dataptrs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	erra = memcmp(data[i], recovi, PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	errb = memcmp(data[j], recovj, PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	if (i < NDISKS-2 && j == NDISKS-1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 		/* We don't implement the DQ failure scenario, since it's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 		   equivalent to a RAID-5 failure (XOR, then recompute Q) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		erra = errb = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 		printf("algo=%-8s  faila=%3d(%c)  failb=%3d(%c)  %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 		       raid6_call.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 		       i, disk_type(i),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		       j, disk_type(j),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 		       (!erra && !errb) ? "OK" :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 		       !erra ? "ERRB" :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 		       !errb ? "ERRA" : "ERRAB");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	dataptrs[i] = data[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	dataptrs[j] = data[j];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	return erra || errb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) int main(int argc, char *argv[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	const struct raid6_calls *const *algo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	const struct raid6_recov_calls *const *ra;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	int i, j, p1, p2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	makedata(0, NDISKS-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	for (ra = raid6_recov_algos; *ra; ra++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 		if ((*ra)->valid  && !(*ra)->valid())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 		raid6_2data_recov = (*ra)->data2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 		raid6_datap_recov = (*ra)->datap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 		printf("using recovery %s\n", (*ra)->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 		for (algo = raid6_algos; *algo; algo++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 			if ((*algo)->valid && !(*algo)->valid())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 			raid6_call = **algo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 			/* Nuke syndromes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 			memset(data[NDISKS-2], 0xee, 2*PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 			/* Generate assumed good syndrome */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 			raid6_call.gen_syndrome(NDISKS, PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 						(void **)&dataptrs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 			for (i = 0; i < NDISKS-1; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 				for (j = i+1; j < NDISKS; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 					err += test_disks(i, j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 			if (!raid6_call.xor_syndrome)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 			for (p1 = 0; p1 < NDISKS-2; p1++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 				for (p2 = p1; p2 < NDISKS-2; p2++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 					/* Simulate rmw run */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 					raid6_call.xor_syndrome(NDISKS, p1, p2, PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 								(void **)&dataptrs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 					makedata(p1, p2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 					raid6_call.xor_syndrome(NDISKS, p1, p2, PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)                                                                 (void **)&dataptrs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 					for (i = 0; i < NDISKS-1; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 						for (j = i+1; j < NDISKS; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 							err += test_disks(i, j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 		printf("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	printf("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	/* Pick the best algorithm test */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	raid6_select_algo();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 		printf("\n*** ERRORS FOUND ***\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }