Skip to content
Permalink
Browse files
lib: add crc64 tests
Provide a module to test the rocksoft crc64 calculations with well known
inputs and exepected values.

Signed-off-by: Keith Busch <kbusch@kernel.org>
  • Loading branch information
keithbusch authored and intel-lab-lkp committed Jan 24, 2022
1 parent e7b9b13 commit d45974b2937922cef5c20b3d5589364bc2d6cd8d
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 0 deletions.
@@ -2212,6 +2212,9 @@ config TEST_UUID
config TEST_XARRAY
tristate "Test the XArray code at runtime"

config TEST_CRC64
tristate "Test the crc64 code at runtime"

config TEST_OVERFLOW
tristate "Test check_*_overflow() functions at runtime"

@@ -102,6 +102,7 @@ obj-$(CONFIG_TEST_HMM) += test_hmm.o
obj-$(CONFIG_TEST_FREE_PAGES) += test_free_pages.o
obj-$(CONFIG_KPROBES_SANITY_TEST) += test_kprobes.o
obj-$(CONFIG_TEST_REF_TRACKER) += test_ref_tracker.o
obj-$(CONFIG_TEST_CRC64) += test_crc64.o
#
# CFLAGS for compiling floating point code inside the kernel. x86/Makefile turns
# off the generation of FPU/SSE* instructions for kernel proper but FPU_FLAGS
@@ -0,0 +1,68 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Tests were selected from NVM Express NVM Command Set Specification 1.0a,
* section 5.2.1.3.5 "64b CRC Test Cases" available here:
*
* https://nvmexpress.org/wp-content/uploads/NVMe-NVM-Command-Set-Specification-1.0a-2021.07.26-Ratified.pdf
*
* Copyright 2022 Keith Busch <kbusch@kernel.org>
*/

#include <linux/crc64.h>
#include <linux/module.h>

static unsigned int tests_passed;
static unsigned int tests_run;

#define ALL_ZEROS 0x6482D367EB22B64EULL
#define ALL_FFS 0xC0DDBA7302ECA3ACULL
#define INC 0x3E729F5F6750449CULL
#define DEC 0x9A2DF64B8E9E517EULL

static u8 buffer[4096];

#define CRC_CHECK(c, v) do { \
tests_run++; \
if (c != v) \
printk("BUG at %s:%d expected:%llx got:%llx\n", \
__func__, __LINE__, v, c); \
else \
tests_passed++; \
} while (0)


static int crc_tests(void)
{
__u64 crc;
int i;

memset(buffer, 0, sizeof(buffer));
crc = crc64_rocksoft(~0ULL, buffer, 4096);
CRC_CHECK(crc, ALL_ZEROS);

memset(buffer, 0xff, sizeof(buffer));
crc = crc64_rocksoft(~0ULL, buffer, 4096);
CRC_CHECK(crc, ALL_FFS);

for (i = 0; i < 4096; i++)
buffer[i] = i & 0xff;
crc = crc64_rocksoft(~0ULL, buffer, 4096);
CRC_CHECK(crc, INC);

for (i = 0; i < 4096; i++)
buffer[i] = 0xff - (i & 0xff);
crc = crc64_rocksoft(~0ULL, buffer, 4096);
CRC_CHECK(crc, DEC);

printk("CRC64: %u of %u tests passed\n", tests_passed, tests_run);
return (tests_run == tests_passed) ? 0 : -EINVAL;
}

static void crc_exit(void)
{
}

module_init(crc_tests);
module_exit(crc_exit);
MODULE_AUTHOR("Keith Busch <kbusch@kernel.org>");
MODULE_LICENSE("GPL");

0 comments on commit d45974b

Please sign in to comment.