kcsan: Make reporting aware of KCSAN tests
authorMarco Elver <elver@google.com>
Fri, 10 Apr 2020 16:44:18 +0000 (18:44 +0200)
committerPaul E. McKenney <paulmck@kernel.org>
Tue, 14 Apr 2020 00:18:16 +0000 (17:18 -0700)
Reporting hides KCSAN runtime functions in the stack trace, with
filtering done based on function names. Currently this included all
functions (or modules) that would match "kcsan_". Make the filter aware
of KCSAN tests, which contain "kcsan_test", and are no longer skipped in
the report.

This is in preparation for adding a KCSAN test module.

Signed-off-by: Marco Elver <elver@google.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/kcsan/report.c

index cf41d63dd0cdfb1669fe0b630aad4dafb521fa36..ac5f8345bae90b19e8761bf6e04499b954837400 100644 (file)
@@ -262,16 +262,32 @@ static const char *get_thread_desc(int task_id)
 static int get_stack_skipnr(const unsigned long stack_entries[], int num_entries)
 {
        char buf[64];
-       int len;
-       int skip = 0;
+       char *cur;
+       int len, skip;
 
-       for (; skip < num_entries; ++skip) {
+       for (skip = 0; skip < num_entries; ++skip) {
                len = scnprintf(buf, sizeof(buf), "%ps", (void *)stack_entries[skip]);
-               if (!strnstr(buf, "csan_", len) &&
-                   !strnstr(buf, "tsan_", len) &&
-                   !strnstr(buf, "_once_size", len))
-                       break;
+
+               /* Never show tsan_* or {read,write}_once_size. */
+               if (strnstr(buf, "tsan_", len) ||
+                   strnstr(buf, "_once_size", len))
+                       continue;
+
+               cur = strnstr(buf, "kcsan_", len);
+               if (cur) {
+                       cur += sizeof("kcsan_") - 1;
+                       if (strncmp(cur, "test", sizeof("test") - 1))
+                               continue; /* KCSAN runtime function. */
+                       /* KCSAN related test. */
+               }
+
+               /*
+                * No match for runtime functions -- @skip entries to skip to
+                * get to first frame of interest.
+                */
+               break;
        }
+
        return skip;
 }