VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
09c434b8a0047 (Thomas Gleixner    2019-05-19 13:08:20 +0100   1) // SPDX-License-Identifier: GPL-2.0-only
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400   2) /*
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400   3)  * Test cases for <linux/hash.h> and <linux/stringhash.h>
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400   4)  * This just verifies that various ways of computing a hash
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400   5)  * produce the same thing and, for cases where a k-bit hash
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400   6)  * value is requested, is of the requested size.
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400   7)  *
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400   8)  * We fill a buffer with a 255-byte null-terminated string,
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400   9)  * and use both full_name_hash() and hashlen_string() to hash the
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  10)  * substrings from i to j, where 0 <= i < j < 256.
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  11)  *
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  12)  * The returned values are used to check that __hash_32() and
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  13)  * __hash_32_generic() compute the same thing.  Likewise hash_32()
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  14)  * and hash_64().
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  15)  */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  16) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  17) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt "\n"
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  18) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  19) #include <linux/compiler.h>
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  20) #include <linux/types.h>
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  21) #include <linux/module.h>
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  22) #include <linux/hash.h>
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  23) #include <linux/stringhash.h>
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  24) #include <linux/printk.h>
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  25) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  26) /* 32-bit XORSHIFT generator.  Seed must not be zero. */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  27) static u32 __init __attribute_const__
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  28) xorshift(u32 seed)
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  29) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  30) 	seed ^= seed << 13;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  31) 	seed ^= seed >> 17;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  32) 	seed ^= seed << 5;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  33) 	return seed;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  34) }
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  35) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  36) /* Given a non-zero x, returns a non-zero byte. */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  37) static u8 __init __attribute_const__
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  38) mod255(u32 x)
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  39) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  40) 	x = (x & 0xffff) + (x >> 16);	/* 1 <= x <= 0x1fffe */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  41) 	x = (x & 0xff) + (x >> 8);	/* 1 <= x <= 0x2fd */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  42) 	x = (x & 0xff) + (x >> 8);	/* 1 <= x <= 0x100 */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  43) 	x = (x & 0xff) + (x >> 8);	/* 1 <= x <= 0xff */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  44) 	return x;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  45) }
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  46) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  47) /* Fill the buffer with non-zero bytes. */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  48) static void __init
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  49) fill_buf(char *buf, size_t len, u32 seed)
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  50) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  51) 	size_t i;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  52) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  53) 	for (i = 0; i < len; i++) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  54) 		seed = xorshift(seed);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  55) 		buf[i] = mod255(seed);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  56) 	}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  57) }
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  58) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  59) /*
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  60)  * Test the various integer hash functions.  h64 (or its low-order bits)
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  61)  * is the integer to hash.  hash_or accumulates the OR of the hash values,
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  62)  * which are later checked to see that they cover all the requested bits.
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  63)  *
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  64)  * Because these functions (as opposed to the string hashes) are all
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  65)  * inline, the code being tested is actually in the module, and you can
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  66)  * recompile and re-test the module without rebooting.
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  67)  */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  68) static bool __init
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  69) test_int_hash(unsigned long long h64, u32 hash_or[2][33])
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  70) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  71) 	int k;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  72) 	u32 h0 = (u32)h64, h1, h2;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  73) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  74) 	/* Test __hash32 */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  75) 	hash_or[0][0] |= h1 = __hash_32(h0);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  76) #ifdef HAVE_ARCH__HASH_32
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  77) 	hash_or[1][0] |= h2 = __hash_32_generic(h0);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  78) #if HAVE_ARCH__HASH_32 == 1
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  79) 	if (h1 != h2) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  80) 		pr_err("__hash_32(%#x) = %#x != __hash_32_generic() = %#x",
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  81) 			h0, h1, h2);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  82) 		return false;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  83) 	}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  84) #endif
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  85) #endif
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  86) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  87) 	/* Test k = 1..32 bits */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  88) 	for (k = 1; k <= 32; k++) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  89) 		u32 const m = ((u32)2 << (k-1)) - 1;	/* Low k bits set */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  90) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  91) 		/* Test hash_32 */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  92) 		hash_or[0][k] |= h1 = hash_32(h0, k);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  93) 		if (h1 > m) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  94) 			pr_err("hash_32(%#x, %d) = %#x > %#x", h0, k, h1, m);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  95) 			return false;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  96) 		}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  97) #ifdef HAVE_ARCH_HASH_32
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  98) 		h2 = hash_32_generic(h0, k);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400  99) #if HAVE_ARCH_HASH_32 == 1
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 100) 		if (h1 != h2) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 101) 			pr_err("hash_32(%#x, %d) = %#x != hash_32_generic() "
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 102) 				" = %#x", h0, k, h1, h2);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 103) 			return false;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 104) 		}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 105) #else
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 106) 		if (h2 > m) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 107) 			pr_err("hash_32_generic(%#x, %d) = %#x > %#x",
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 108) 				h0, k, h1, m);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 109) 			return false;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 110) 		}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 111) #endif
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 112) #endif
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 113) 		/* Test hash_64 */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 114) 		hash_or[1][k] |= h1 = hash_64(h64, k);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 115) 		if (h1 > m) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 116) 			pr_err("hash_64(%#llx, %d) = %#x > %#x", h64, k, h1, m);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 117) 			return false;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 118) 		}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 119) #ifdef HAVE_ARCH_HASH_64
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 120) 		h2 = hash_64_generic(h64, k);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 121) #if HAVE_ARCH_HASH_64 == 1
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 122) 		if (h1 != h2) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 123) 			pr_err("hash_64(%#llx, %d) = %#x != hash_64_generic() "
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 124) 				"= %#x", h64, k, h1, h2);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 125) 			return false;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 126) 		}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 127) #else
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 128) 		if (h2 > m) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 129) 			pr_err("hash_64_generic(%#llx, %d) = %#x > %#x",
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 130) 				h64, k, h1, m);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 131) 			return false;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 132) 		}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 133) #endif
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 134) #endif
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 135) 	}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 136) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 137) 	(void)h2;	/* Suppress unused variable warning */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 138) 	return true;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 139) }
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 140) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 141) #define SIZE 256	/* Run time is cubic in SIZE */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 142) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 143) static int __init
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 144) test_hash_init(void)
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 145) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 146) 	char buf[SIZE+1];
ed76b7a131f41 (Geert Uytterhoeven 2016-09-01 16:14:50 -0700 147) 	u32 string_or = 0, hash_or[2][33] = { { 0, } };
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 148) 	unsigned tests = 0;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 149) 	unsigned long long h64 = 0;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 150) 	int i, j;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 151) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 152) 	fill_buf(buf, SIZE, 1);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 153) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 154) 	/* Test every possible non-empty substring in the buffer. */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 155) 	for (j = SIZE; j > 0; --j) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 156) 		buf[j] = '\0';
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 157) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 158) 		for (i = 0; i <= j; i++) {
8387ff2577eb9 (Linus Torvalds     2016-06-10 07:51:30 -0700 159) 			u64 hashlen = hashlen_string(buf+i, buf+i);
8387ff2577eb9 (Linus Torvalds     2016-06-10 07:51:30 -0700 160) 			u32 h0 = full_name_hash(buf+i, buf+i, j-i);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 161) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 162) 			/* Check that hashlen_string gets the length right */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 163) 			if (hashlen_len(hashlen) != j-i) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 164) 				pr_err("hashlen_string(%d..%d) returned length"
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 165) 					" %u, expected %d",
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 166) 					i, j, hashlen_len(hashlen), j-i);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 167) 				return -EINVAL;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 168) 			}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 169) 			/* Check that the hashes match */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 170) 			if (hashlen_hash(hashlen) != h0) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 171) 				pr_err("hashlen_string(%d..%d) = %08x != "
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 172) 					"full_name_hash() = %08x",
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 173) 					i, j, hashlen_hash(hashlen), h0);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 174) 				return -EINVAL;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 175) 			}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 176) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 177) 			string_or |= h0;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 178) 			h64 = h64 << 32 | h0;	/* For use with hash_64 */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 179) 			if (!test_int_hash(h64, hash_or))
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 180) 				return -EINVAL;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 181) 			tests++;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 182) 		} /* i */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 183) 	} /* j */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 184) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 185) 	/* The OR of all the hash values should cover all the bits */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 186) 	if (~string_or) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 187) 		pr_err("OR of all string hash results = %#x != %#x",
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 188) 			string_or, -1u);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 189) 		return -EINVAL;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 190) 	}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 191) 	if (~hash_or[0][0]) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 192) 		pr_err("OR of all __hash_32 results = %#x != %#x",
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 193) 			hash_or[0][0], -1u);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 194) 		return -EINVAL;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 195) 	}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 196) #ifdef HAVE_ARCH__HASH_32
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 197) #if HAVE_ARCH__HASH_32 != 1	/* Test is pointless if results match */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 198) 	if (~hash_or[1][0]) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 199) 		pr_err("OR of all __hash_32_generic results = %#x != %#x",
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 200) 			hash_or[1][0], -1u);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 201) 		return -EINVAL;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 202) 	}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 203) #endif
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 204) #endif
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 205) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 206) 	/* Likewise for all the i-bit hash values */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 207) 	for (i = 1; i <= 32; i++) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 208) 		u32 const m = ((u32)2 << (i-1)) - 1;	/* Low i bits set */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 209) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 210) 		if (hash_or[0][i] != m) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 211) 			pr_err("OR of all hash_32(%d) results = %#x "
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 212) 				"(%#x expected)", i, hash_or[0][i], m);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 213) 			return -EINVAL;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 214) 		}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 215) 		if (hash_or[1][i] != m) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 216) 			pr_err("OR of all hash_64(%d) results = %#x "
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 217) 				"(%#x expected)", i, hash_or[1][i], m);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 218) 			return -EINVAL;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 219) 		}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 220) 	}
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 221) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 222) 	/* Issue notices about skipped tests. */
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 223) #ifdef HAVE_ARCH__HASH_32
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 224) #if HAVE_ARCH__HASH_32 != 1
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 225) 	pr_info("__hash_32() is arch-specific; not compared to generic.");
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 226) #endif
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 227) #else
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 228) 	pr_info("__hash_32() has no arch implementation to test.");
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 229) #endif
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 230) #ifdef HAVE_ARCH_HASH_32
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 231) #if HAVE_ARCH_HASH_32 != 1
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 232) 	pr_info("hash_32() is arch-specific; not compared to generic.");
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 233) #endif
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 234) #else
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 235) 	pr_info("hash_32() has no arch implementation to test.");
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 236) #endif
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 237) #ifdef HAVE_ARCH_HASH_64
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 238) #if HAVE_ARCH_HASH_64 != 1
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 239) 	pr_info("hash_64() is arch-specific; not compared to generic.");
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 240) #endif
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 241) #else
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 242) 	pr_info("hash_64() has no arch implementation to test.");
e6173ba42bbdb (Geert Uytterhoeven 2016-09-01 16:14:53 -0700 243) #endif
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 244) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 245) 	pr_notice("%u tests passed.", tests);
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 246) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 247) 	return 0;
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 248) }
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 249) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 250) static void __exit test_hash_exit(void)
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 251) {
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 252) }
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 253) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 254) module_init(test_hash_init);	/* Does everything */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 255) module_exit(test_hash_exit);	/* Does nothing */
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 256) 
468a9428521e7 (George Spelvin     2016-05-26 22:11:51 -0400 257) MODULE_LICENSE("GPL");