| From: Isabella Basso <isabbasso@riseup.net> |
| Subject: hash.h: remove unused define directive |
| |
| Patch series "test_hash.c: refactor into KUnit", v3. |
| |
| We refactored the lib/test_hash.c file into KUnit as part of the student |
| group LKCAMP [1] introductory hackathon for kernel development. |
| |
| This test was pointed to our group by Daniel Latypov [2], so its full |
| conversion into a pure KUnit test was our goal in this patch series, but |
| we ran into many problems relating to it not being split as unit tests, |
| which complicated matters a bit, as the reasoning behind the original |
| tests is quite cryptic for those unfamiliar with hash implementations. |
| |
| Some interesting developments we'd like to highlight are: |
| |
| - In patch 1/5 we noticed that there was an unused define directive that |
| could be removed. |
| - In patch 4/5 we noticed how stringhash and hash tests are all under |
| the lib/test_hash.c file, which might cause some confusion, and we |
| also broke those kernel config entries up. |
| |
| Overall KUnit developments have been made in the other patches in this |
| series: |
| |
| In patches 2/5, 3/5 and 5/5 we refactored the lib/test_hash.c file so as |
| to make it more compatible with the KUnit style, whilst preserving the |
| original idea of the maintainer who designed it (i.e. George Spelvin), |
| which might be undesirable for unit tests, but we assume it is enough for |
| a first patch. |
| |
| |
| This patch (of 5): |
| |
| Currently, there exist hash_32() and __hash_32() functions, which were |
| introduced in a patch [1] targeting architecture specific optimizations. |
| These functions can be overridden on a per-architecture basis to achieve |
| such optimizations. They must set their corresponding define directive |
| (HAVE_ARCH_HASH_32 and HAVE_ARCH__HASH_32, respectively) so that header |
| files can deal with these overrides properly. |
| |
| As the supported 32-bit architectures that have their own hash function |
| implementation (i.e. m68k, Microblaze, H8/300, pa-risc) have only been |
| making use of the (more general) __hash_32() function (which only lacks a |
| right shift operation when compared to the hash_32() function), remove the |
| define directive corresponding to the arch-specific hash_32() |
| implementation. |
| |
| [1] https://lore.kernel.org/lkml/20160525073311.5600.qmail@ns.sciencehorizons.net/ |
| |
| [akpm@linux-foundation.org: hash_32_generic() becomes hash_32()] |
| Link: https://lkml.kernel.org/r/20211208183711.390454-1-isabbasso@riseup.net |
| Link: https://lkml.kernel.org/r/20211208183711.390454-2-isabbasso@riseup.net |
| Reviewed-by: David Gow <davidgow@google.com> |
| Tested-by: David Gow <davidgow@google.com> |
| Co-developed-by: Augusto Durães Camargo <augusto.duraes33@gmail.com> |
| Signed-off-by: Augusto Durães Camargo <augusto.duraes33@gmail.com> |
| Co-developed-by: Enzo Ferreira <ferreiraenzoa@gmail.com> |
| Signed-off-by: Enzo Ferreira <ferreiraenzoa@gmail.com> |
| Signed-off-by: Isabella Basso <isabbasso@riseup.net> |
| Cc: Geert Uytterhoeven <geert@linux-m68k.org> |
| Cc: Brendan Higgins <brendanhiggins@google.com> |
| Cc: Daniel Latypov <dlatypov@google.com> |
| Cc: Shuah Khan <skhan@linuxfoundation.org> |
| Cc: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com> |
| Cc: kernel test robot <lkp@intel.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| drivers/infiniband/sw/rxe/rxe_qp.c | 3 +-- |
| include/linux/hash.h | 5 +---- |
| lib/test_hash.c | 24 +----------------------- |
| tools/include/linux/hash.h | 5 +---- |
| 4 files changed, 4 insertions(+), 33 deletions(-) |
| |
| --- a/drivers/infiniband/sw/rxe/rxe_qp.c~hashh-remove-unused-define-directive |
| +++ a/drivers/infiniband/sw/rxe/rxe_qp.c |
| @@ -217,8 +217,7 @@ static int rxe_qp_init_req(struct rxe_de |
| * the port number must be in the Dynamic Ports range |
| * (0xc000 - 0xffff). |
| */ |
| - qp->src_port = RXE_ROCE_V2_SPORT + |
| - (hash_32_generic(qp_num(qp), 14) & 0x3fff); |
| + qp->src_port = RXE_ROCE_V2_SPORT + (hash_32(qp_num(qp), 14) & 0x3fff); |
| qp->sq.max_wr = init->cap.max_send_wr; |
| |
| /* These caps are limited by rxe_qp_chk_cap() done by the caller */ |
| --- a/include/linux/hash.h~hashh-remove-unused-define-directive |
| +++ a/include/linux/hash.h |
| @@ -62,10 +62,7 @@ static inline u32 __hash_32_generic(u32 |
| return val * GOLDEN_RATIO_32; |
| } |
| |
| -#ifndef HAVE_ARCH_HASH_32 |
| -#define hash_32 hash_32_generic |
| -#endif |
| -static inline u32 hash_32_generic(u32 val, unsigned int bits) |
| +static inline u32 hash_32(u32 val, unsigned int bits) |
| { |
| /* High bits are more random, so use them. */ |
| return __hash_32(val) >> (32 - bits); |
| --- a/lib/test_hash.c~hashh-remove-unused-define-directive |
| +++ a/lib/test_hash.c |
| @@ -94,22 +94,7 @@ test_int_hash(unsigned long long h64, u3 |
| pr_err("hash_32(%#x, %d) = %#x > %#x", h0, k, h1, m); |
| return false; |
| } |
| -#ifdef HAVE_ARCH_HASH_32 |
| - h2 = hash_32_generic(h0, k); |
| -#if HAVE_ARCH_HASH_32 == 1 |
| - if (h1 != h2) { |
| - pr_err("hash_32(%#x, %d) = %#x != hash_32_generic() " |
| - " = %#x", h0, k, h1, h2); |
| - return false; |
| - } |
| -#else |
| - if (h2 > m) { |
| - pr_err("hash_32_generic(%#x, %d) = %#x > %#x", |
| - h0, k, h1, m); |
| - return false; |
| - } |
| -#endif |
| -#endif |
| + |
| /* Test hash_64 */ |
| hash_or[1][k] |= h1 = hash_64(h64, k); |
| if (h1 > m) { |
| @@ -227,13 +212,6 @@ test_hash_init(void) |
| #else |
| pr_info("__hash_32() has no arch implementation to test."); |
| #endif |
| -#ifdef HAVE_ARCH_HASH_32 |
| -#if HAVE_ARCH_HASH_32 != 1 |
| - pr_info("hash_32() is arch-specific; not compared to generic."); |
| -#endif |
| -#else |
| - pr_info("hash_32() has no arch implementation to test."); |
| -#endif |
| #ifdef HAVE_ARCH_HASH_64 |
| #if HAVE_ARCH_HASH_64 != 1 |
| pr_info("hash_64() is arch-specific; not compared to generic."); |
| --- a/tools/include/linux/hash.h~hashh-remove-unused-define-directive |
| +++ a/tools/include/linux/hash.h |
| @@ -62,10 +62,7 @@ static inline u32 __hash_32_generic(u32 |
| return val * GOLDEN_RATIO_32; |
| } |
| |
| -#ifndef HAVE_ARCH_HASH_32 |
| -#define hash_32 hash_32_generic |
| -#endif |
| -static inline u32 hash_32_generic(u32 val, unsigned int bits) |
| +static inline u32 hash_32(u32 val, unsigned int bits) |
| { |
| /* High bits are more random, so use them. */ |
| return __hash_32(val) >> (32 - bits); |
| _ |