[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20250304223943.157493-1-ebiggers@kernel.org>
Date: Tue, 4 Mar 2025 14:39:43 -0800
From: Eric Biggers <ebiggers@...nel.org>
To: linux-kernel@...r.kernel.org
Cc: linux-crypto@...r.kernel.org,
Ard Biesheuvel <ardb@...nel.org>
Subject: [PATCH] lib/crc_kunit.c: add test and benchmark for crc7_be()
From: Eric Biggers <ebiggers@...gle.com>
Wire up crc7_be() to crc_kunit. Previously it had no test.
Signed-off-by: Eric Biggers <ebiggers@...gle.com>
---
lib/Kconfig.debug | 1 +
lib/crc_kunit.c | 35 +++++++++++++++++++++++++++++++++--
2 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 1af972a92d06f..141855e9d8c43 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -2850,10 +2850,11 @@ config HW_BREAKPOINT_KUNIT_TEST
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
select CRC64
help
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
@@ -5,10 +5,11 @@
* Copyright 2024 Google LLC
*
* Author: Eric Biggers <ebiggers@...gle.com>
*/
#include <kunit/test.h>
+#include <linux/crc7.h>
#include <linux/crc16.h>
#include <linux/crc-t10dif.h>
#include <linux/crc32.h>
#include <linux/crc32c.h>
#include <linux/crc64.h>
@@ -30,12 +31,13 @@ static size_t test_buflen;
* polynomial coefficients in each byte), false if it's a "big endian" CRC
* (natural mapping between bits and polynomial coefficients in each byte)
* @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 {
int bits;
bool le;
@@ -250,10 +252,37 @@ crc_benchmark(struct kunit *test,
kunit_info(test, "len=%zu: %llu MB/s\n",
len, div64_u64((u64)len * num_iters * 1000, t));
}
}
+/* 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)
{
return crc16(crc, p, len);
@@ -432,10 +461,12 @@ static void crc64_nvme_benchmark(struct kunit *test)
{
crc_benchmark(test, crc64_nvme_wrapper);
}
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),
KUNIT_CASE(crc_t10dif_benchmark),
KUNIT_CASE(crc32_le_test),
base-commit: 13f3d13d88b5dcba104a204fcbee61c75f8407d0
--
2.48.1
Powered by blists - more mailing lists