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");