From: Eric Biggers Date: Tue, 4 Mar 2025 22:39:43 +0000 (-0800) Subject: lib/crc_kunit.c: add test and benchmark for crc7_be() X-Git-Tag: v6.15-rc1~184^2~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7715f8cfe5df822617db618c783db47504adfc90;p=thirdparty%2Fkernel%2Flinux.git lib/crc_kunit.c: add test and benchmark for crc7_be() Wire up crc7_be() to crc_kunit. Previously it had no test. Link: https://lore.kernel.org/r/20250304223943.157493-1-ebiggers@kernel.org Signed-off-by: Eric Biggers --- diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 1af972a92d06f..141855e9d8c43 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -2852,6 +2852,7 @@ config CRC_KUNIT_TEST tristate "KUnit tests for CRC functions" if !KUNIT_ALL_TESTS depends on KUNIT default KUNIT_ALL_TESTS + select CRC7 select CRC16 select CRC_T10DIF select CRC32 diff --git a/lib/crc_kunit.c b/lib/crc_kunit.c index 40b4b41f21847..0e15eb244b20a 100644 --- a/lib/crc_kunit.c +++ b/lib/crc_kunit.c @@ -7,6 +7,7 @@ * Author: Eric Biggers */ #include +#include #include #include #include @@ -32,8 +33,9 @@ static size_t test_buflen; * @poly: The generator polynomial with the highest-order term omitted. * Bit-reversed if @le is true. * @func: The function to compute a CRC. The type signature uses u64 so that it - * can fit any CRC up to CRC-64. The function is expected to *not* - * invert the CRC at the beginning and end. + * can fit any CRC up to CRC-64. The CRC is passed in, and is expected + * to be returned in, the least significant bits of the u64. The + * function is expected to *not* invert the CRC at the beginning and end. * @combine_func: Optional function to combine two CRCs. */ struct crc_variant { @@ -252,6 +254,33 @@ crc_benchmark(struct kunit *test, } } +/* crc7_be */ + +static u64 crc7_be_wrapper(u64 crc, const u8 *p, size_t len) +{ + /* + * crc7_be() left-aligns the 7-bit CRC in a u8, whereas the test wants a + * right-aligned CRC (in a u64). Convert between the conventions. + */ + return crc7_be(crc << 1, p, len) >> 1; +} + +static const struct crc_variant crc_variant_crc7_be = { + .bits = 7, + .poly = 0x9, + .func = crc7_be_wrapper, +}; + +static void crc7_be_test(struct kunit *test) +{ + crc_test(test, &crc_variant_crc7_be); +} + +static void crc7_be_benchmark(struct kunit *test) +{ + crc_benchmark(test, crc7_be_wrapper); +} + /* crc16 */ static u64 crc16_wrapper(u64 crc, const u8 *p, size_t len) @@ -434,6 +463,8 @@ static void crc64_nvme_benchmark(struct kunit *test) } static struct kunit_case crc_test_cases[] = { + KUNIT_CASE(crc7_be_test), + KUNIT_CASE(crc7_be_benchmark), KUNIT_CASE(crc16_test), KUNIT_CASE(crc16_benchmark), KUNIT_CASE(crc_t10dif_test),