kcsan: Support compounded read-write instrumentation
authorMarco Elver <elver@google.com>
Fri, 24 Jul 2020 07:00:01 +0000 (09:00 +0200)
committerPaul E. McKenney <paulmck@kernel.org>
Mon, 24 Aug 2020 22:09:32 +0000 (15:09 -0700)
commit14e2ac8de0f91f12122a49f09897b0cd05256460
tree938e24729e65eb3eed3403e7f084fbcfa8dbbcdc
parentf9ea63193135473ed6b6ff06f016eb6248100041
kcsan: Support compounded read-write instrumentation

Add support for compounded read-write instrumentation if supported by
the compiler. Adds the necessary instrumentation functions, and a new
type which is used to generate a more descriptive report.

Furthermore, such compounded memory access instrumentation is excluded
from the "assume aligned writes up to word size are atomic" rule,
because we cannot assume that the compiler emits code that is atomic for
compound ops.

LLVM/Clang added support for the feature in:
https://github.com/llvm/llvm-project/commit/785d41a261d136b64ab6c15c5d35f2adc5ad53e3

The new instrumentation is emitted for sets of memory accesses in the
same basic block to the same address with at least one read appearing
before a write. These typically result from compound operations such as
++, --, +=, -=, |=, &=, etc. but also equivalent forms such as "var =
var + 1". Where the compiler determines that it is equivalent to emit a
call to a single __tsan_read_write instead of separate __tsan_read and
__tsan_write, we can then benefit from improved performance and better
reporting for such access patterns.

The new reports now show that the ops are both reads and writes, for
example:

read-write to 0xffffffff90548a38 of 8 bytes by task 143 on cpu 3:
 test_kernel_rmw_array+0x45/0xa0
 access_thread+0x71/0xb0
 kthread+0x21e/0x240
 ret_from_fork+0x22/0x30

read-write to 0xffffffff90548a38 of 8 bytes by task 144 on cpu 2:
 test_kernel_rmw_array+0x45/0xa0
 access_thread+0x71/0xb0
 kthread+0x21e/0x240
 ret_from_fork+0x22/0x30

Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Marco Elver <elver@google.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
include/linux/kcsan-checks.h
kernel/kcsan/core.c
kernel/kcsan/report.c
scripts/Makefile.kcsan