Thread (20 messages) 20 messages, 7 authors, 2018-07-24

Re: [PATCH v3 3/3] lib/test_crc: Add test cases for crc calculation

From: Coly Li <hidden>
Date: 2018-07-18 15:28:39
Also in: lkml

On 2018/7/18 1:11 AM, Andy Shevchenko wrote:
On Tue, Jul 17, 2018 at 5:55 PM, Coly Li [off-list ref] wrote:
quoted
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: PASSED (0x4e6b1ff972fa8c55, expected 0x4e6b1ff972fa8c55)
test_crc: crc64_bch: PASSED (0x0e4f1391d7a4a62e, expected 0x0e4f1391d7a4a62e)
test_crc: crc64_update: FAILED (0x03d4d0d85685d9a1, expected 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()
- crc64_bch()
- crc64_update()
Thanks for an update. My comments below.
quoted
Changelog:
v3: Add test cases passed/failed statistic
    More fixes for review comments of v2
v2: Fixes for review comments of v1
v1: Initial version.
Usually this part goes after --- line below.
OK, I change all the patches in this way.
quoted
Signed-off-by: Coly Li <redacted>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Thomas Gleixner <redacted>
Cc: Kate Stewart <redacted>
Please, Cc me as well this one in next version (use my Intel address).
Added :-)
quoted
+#include <linux/async.h>
+#include <linux/delay.h>
+#include <linux/fs.h>
+#include <linux/list.h>
+#include <linux/module.h>
+#include <linux/printk.h>
+#include <linux/miscdevice.h>
+#include <linux/slab.h>
+#include <linux/uaccess.h>
+#include <linux/vmalloc.h>
+#include <linux/crc64.h>
Do we need all of them?
I remove most of them, only keep linux/module.h and linux/crc64.h in v4
series.
quoted
+static int chk_and_msg(const char *name, u64 crc, u64 expval)
+{
quoted
+       int ret = 0;
+
+       if (crc == expval) {
quoted
+               pr_info("test_crc: %s: PASSED:(0x%016llx, expected 0x%016llx)\n",
+                       name, crc, expval);
This doesn't bring anything useful.
quoted
+       } else {
+               pr_err("test_crc: %s: FAILED:(0x%016llx, expected 0x%016llx)\n",
+                       name, crc, expval);
+               ret = -EINVAL;
+       }
+
+       return ret;
I would rewrite entire function as follows:

static void ...(...)
{
  total_tests++;
  if (crc == expval)
    return;

  pr_err(...);
  failed_tests++;
}

quoted
+}
quoted
+static int __init test_crc_init(void)
+{
+       int i;
+       int v, err = 0;
+
+       pr_info("Kernel CRC consitency testing:\n");
quoted
+       for (i = 0; test_data[i].name; i++) {
+               v = test_data[i].handler(&test_data[i]);
+               if (v < 0)
+                       err++;
+       }
...and correct this to simple
for (...)
 test_data[i].handler(...);
quoted
+       if (err == 0)
+               pr_info("test_crc: all %d tests passed\n", i);
+       else
+               pr_err("test_crc: %d cases tested, %d passed, %d failed\n",
+                      i, i - err, err);
...and this accordingly.

Note, that in the future someone can add more test cases one or more
of which could not map 1:1 to i here.
That's why the rationale to have two global variables for test statistics.
Also it allows (as you see above) to get rid of return code from all
of those test. We don't interested in them I believe.
Yes, your code is simpler and more elegant IMHO. I change the code as
you suggested in v4 series.

Thanks.

Coly Li
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help