Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp3186198imm; Mon, 16 Jul 2018 23:58:49 -0700 (PDT) X-Google-Smtp-Source: AAOMgpflj4ZMmAlq7g2Xx7v+3bBMd3C50y3Rq3GYGuwWMIAOIeUF/5f27FV8DlgjkwFY7CuO/2lV X-Received: by 2002:a63:a70f:: with SMTP id d15-v6mr420934pgf.168.1531810729224; Mon, 16 Jul 2018 23:58:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531810729; cv=none; d=google.com; s=arc-20160816; b=e88QRCsjOsHGr56If4rnbp12mmJhfgca9c3g2xyj8+UCMVWpfE1bhLbyhhcTP5GuQm DsZCuzjhW489nt4klAvdpuh+7QmOcjgL7SoHbJIoUVVYeR2ieYa+FCW06Fiqyup2818n WotdhmQaPptDs+NMoTv2Yi9A5ShbJ89uOdReJ4oyenIYs5eGUXOIeRc7D73+NF//5JTA VItrEwFu4ETpeooV+ZxD7OVLtm14UemGT1YSEU6PpmTWVmv7Yf3oYr6RIdcH9nAVd6tv H8wtU3jESyB/6ZRJOXTyxVsDT+CopAZZTe7gCbAyn0FW2hFQNIVy9ixylwpzwverAIVr /XMA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=rcWiQ5/zLB6y6MUA4F2fbTczRdZISX0Z1YbUhuCkjs8=; b=IUxkLme+HpR9SvQHBpOTt/h3OhA5G4Br3vjiRuXWjlHdZ3JiO3p5eimrCSW5myxW99 HqReMLHSUHyrcZ/tF6DTWEKV/+Fn4h6xycn30c4vYWx76wfouXi522BXJRIFI/G9lPl8 mJNq7zWetqoNISkotu5l0If5cZwlNvxE+E3PaGui6xbL9wH8mw4Bb8w0VckFlSQBsBRI PD/7SgGHkvPsIdxr0jAldYdqvmSBCBceidx+fT/6qPkxovz9U/UkLHRn6xMeUdZSepS1 jY5XxSxhlfhe0iJFZ0BCwrzTngTaREriMGPf9NGWGAQ9PuDSsx2tt7LynG4c6raiJgVK 0O1g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h5-v6si246601pfd.112.2018.07.16.23.58.34; Mon, 16 Jul 2018 23:58:49 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729682AbeGQH2l (ORCPT + 99 others); Tue, 17 Jul 2018 03:28:41 -0400 Received: from mx2.suse.de ([195.135.220.15]:49458 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727961AbeGQH2k (ORCPT ); Tue, 17 Jul 2018 03:28:40 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 9B2E9AD09; Tue, 17 Jul 2018 06:57:32 +0000 (UTC) From: Coly Li To: linux-kernel@vger.kernel.org Cc: linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, Coly Li , Greg Kroah-Hartman , Linus Torvalds , Thomas Gleixner , Kate Stewart Subject: [PATCH v2 3/3] lib/test_crc: Add test cases for crc calculation Date: Tue, 17 Jul 2018 14:57:11 +0800 Message-Id: <20180717065711.28281-4-colyli@suse.de> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180717065711.28281-1-colyli@suse.de> References: <20180717065711.28281-1-colyli@suse.de> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch adds a kernel module to test the consistency of multiple crc calculation in Linux kernel. It is enabled with CONFIG_TEST_CRC enabled. The test results are printed into kernel message, which look like, test_crc: crc64_le: PASSED (0x4e6b1ff972fa8c55, expval 0x4e6b1ff972fa8c55) test_crc: crc64_le_bch: PASSED (0x0e4f1391d7a4a62e, expval 0x0e4f1391d7a4a62e) test_crc: crc64_le_update: FAILED (0x03d4d0d85685d9a1, expval 0x3d4d0d85685d9a1f) kernel 0day system has framework to check kernel message, then the above result can be handled by 0day system. If crc calculation inconsistency happens, it can be detected quite soon. lib/test_crc.c is a testing frame work for many crc consistency testings. For now, there are only test caes for 3 crc routines, - crc64_le() - crc64_le_bch() - crc64_le_update() Signed-off-by: Coly Li Reviewed-by: Hannes Reinecke Cc: Greg Kroah-Hartman Cc: Linus Torvalds Cc: Thomas Gleixner Cc: Kate Stewart --- lib/Kconfig.debug | 11 ++++ lib/Makefile | 1 + lib/test_crc.c | 133 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+) create mode 100644 lib/test_crc.c diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 8838d1158d19..de7bddd23c30 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -1911,6 +1911,17 @@ config TEST_SYSCTL If unsure, say N. +config TEST_CRC + tristate "CRC calculation test driver" + depends on CRC64 + default n + help + This builds the "test_crc" module. This driver enables to test the + CRC calculation consistency to make sure new modification does not + break existing checksum calculation. + + if unsure, say N. + config TEST_UDELAY tristate "udelay test driver" default n diff --git a/lib/Makefile b/lib/Makefile index 40c215181687..224d047d026a 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -49,6 +49,7 @@ obj-$(CONFIG_FIND_BIT_BENCHMARK) += find_bit_benchmark.o obj-$(CONFIG_TEST_BPF) += test_bpf.o obj-$(CONFIG_TEST_FIRMWARE) += test_firmware.o obj-$(CONFIG_TEST_SYSCTL) += test_sysctl.o +obj-$(CONFIG_TEST_CRC) += test_crc.o obj-$(CONFIG_TEST_HASH) += test_hash.o test_siphash.o obj-$(CONFIG_TEST_KASAN) += test_kasan.o CFLAGS_test_kasan.o += -fno-builtin diff --git a/lib/test_crc.c b/lib/test_crc.c new file mode 100644 index 000000000000..3a793005b813 --- /dev/null +++ b/lib/test_crc.c @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * CRC test driver + * + * Copyright (C) 2018 Coly Li + * + * This module provides an simple framework to check the consistency of + * Linux kernel CRC calculation routines in lib/crc*.c. This driver + * requires CONFIG_CRC* items to be enabled if the associated routines are + * tested here. The test results will be printed to kernel message + * when this test driver is loaded. + * + * Current test routines are, + * - crc64_le() + * - crc64_le_bch() + * - crc64_le_update() + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct crc_test_record { + char *name; + __le64 data[4]; + __le64 initval; + __le64 expval; + int (*handler)(struct crc_test_record *rec); +}; + +static int chk_and_msg(const char *name, __le64 crc, __le64 expval) +{ + int ret = 0; + + if (crc == expval) { + pr_info("test_crc: %s: PASSED:(0x%016llx, expected 0x%016llx)", + name, crc, expval); + } else { + pr_err("test_crc: %s: FAILED:(0x%016llx, expected 0x%016llx)", + name, crc, expval); + ret = -EINVAL; + } + + return ret; +} + +/* Add your crc test cases here */ +static int test_crc64_le(struct crc_test_record *rec) +{ + __le64 crc; + + crc = crc64_le(rec->data, sizeof(rec->data)); + return chk_and_msg(rec->name, crc, rec->expval); +} + +static int test_crc64_le_bch(struct crc_test_record *rec) +{ + __le64 crc; + + crc = crc64_le_bch(rec->data, sizeof(rec->data)); + return chk_and_msg(rec->name, crc, rec->expval); +} + +static int test_crc64_le_update(struct crc_test_record *rec) +{ + __le64 crc = rec->initval; + + crc = crc64_le_update(crc, rec->data, sizeof(rec->data)); + return chk_and_msg(rec->name, crc, rec->expval); +} + +/* + * Set up your crc test initial data here. + * Do not change the existing items, they are hard coded with + * pre-calculated values. + */ +static struct crc_test_record test_data[] = { + { .name = "crc64_le", + .data = { 0x42F0E1EBA9EA3693, 0x85E1C3D753D46D26, + 0xC711223CFA3E5BB5, 0x493366450E42ECDF }, + .initval = 0, + .expval = 0xe2b9911e7b997201, + .handler = test_crc64_le, + }, + { .name = "crc64_le_bch", + .data = { 0x42F0E1EBA9EA3693, 0x85E1C3D753D46D26, + 0xC711223CFA3E5BB5, 0x493366450E42ECDF }, + .initval = 0, + .expval = 0xd2753a20fd862892, + .handler = test_crc64_le_bch, + }, + { .name = "crc64_le_update", + .data = { 0x42F0E1EBA9EA3693, 0x85E1C3D753D46D26, + 0xC711223CFA3E5BB5, 0x493366450E42ECDF }, + .initval = 0x61C8864680B583EB, + .expval = 0xb2c863673f4292bf, + .handler = test_crc64_le_update, + }, + {} +}; + + +static int __init test_crc_init(void) +{ + int i; + int v, ret = 0; + + pr_info("Kernel CRC consitency testing:"); + for (i = 0; test_data[i].name; i++) { + v = test_data[i].handler(&test_data[i]); + if (v < 0 && ret == 0) + ret = -EINVAL; + } + + return ret; +} +late_initcall(test_crc_init); + +static void __exit test_crc_exit(void) { } +module_exit(test_crc_exit); + +MODULE_DESCRIPTION("CRC consistency testing driver"); +MODULE_AUTHOR("Coly Li "); +MODULE_LICENSE("GPL v2"); -- 2.17.1