* [PATCH kcsan 0/2] KCSAN updates for v6.11
@ 2024-06-04 20:40 Paul E. McKenney
2024-06-04 20:40 ` [PATCH kcsan 1/2] kcsan: Add example to data_race() kerneldoc header Paul E. McKenney
2024-06-04 20:40 ` [PATCH kcsan 2/2] kcsan: test: add missing MODULE_DESCRIPTION() macro Paul E. McKenney
0 siblings, 2 replies; 3+ messages in thread
From: Paul E. McKenney @ 2024-06-04 20:40 UTC (permalink / raw)
To: linux-kernel, kasan-dev, kernel-team, mingo
Cc: elver, andreyknvl, glider, dvyukov, cai, boqun.feng
Hello!
This series provides KCSAN updates:
1. Add example to data_race() kerneldoc header.
2. Add missing MODULE_DESCRIPTION() macro, courtesy of Jeff
Johnson.
Thanx, Paul
------------------------------------------------------------------------
include/linux/compiler.h | 10 +++++++-
kernel/kcsan/kcsan_test.c | 1
tools/memory-model/Documentation/access-marking.txt | 24 +++++++++++++++++++-
3 files changed, 33 insertions(+), 2 deletions(-)
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH kcsan 1/2] kcsan: Add example to data_race() kerneldoc header
2024-06-04 20:40 [PATCH kcsan 0/2] KCSAN updates for v6.11 Paul E. McKenney
@ 2024-06-04 20:40 ` Paul E. McKenney
2024-06-04 20:40 ` [PATCH kcsan 2/2] kcsan: test: add missing MODULE_DESCRIPTION() macro Paul E. McKenney
1 sibling, 0 replies; 3+ messages in thread
From: Paul E. McKenney @ 2024-06-04 20:40 UTC (permalink / raw)
To: linux-kernel, kasan-dev, kernel-team, mingo
Cc: elver, andreyknvl, glider, dvyukov, cai, boqun.feng,
Paul E. McKenney, Bart Van Assche, Breno Leitao, Jens Axboe
Although the data_race() kerneldoc header accurately states what it does,
some of the implications and usage patterns are non-obvious. Therefore,
add a brief locking example and also state how to have KCSAN ignore
accesses while also preventing the compiler from folding, spindling,
or otherwise mutilating the access.
[ paulmck: Apply Bart Van Assche feedback. ]
[ paulmck: Apply feedback from Marco Elver. ]
Reported-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Cc: Marco Elver <elver@google.com>
Cc: Breno Leitao <leitao@debian.org>
Cc: Jens Axboe <axboe@kernel.dk>
---
include/linux/compiler.h | 10 +++++++-
.../Documentation/access-marking.txt | 24 ++++++++++++++++++-
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index 8c252e073bd81..68a24a3a69799 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -194,9 +194,17 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,
* This data_race() macro is useful for situations in which data races
* should be forgiven. One example is diagnostic code that accesses
* shared variables but is not a part of the core synchronization design.
+ * For example, if accesses to a given variable are protected by a lock,
+ * except for diagnostic code, then the accesses under the lock should
+ * be plain C-language accesses and those in the diagnostic code should
+ * use data_race(). This way, KCSAN will complain if buggy lockless
+ * accesses to that variable are introduced, even if the buggy accesses
+ * are protected by READ_ONCE() or WRITE_ONCE().
*
* This macro *does not* affect normal code generation, but is a hint
- * to tooling that data races here are to be ignored.
+ * to tooling that data races here are to be ignored. If the access must
+ * be atomic *and* KCSAN should ignore the access, use both data_race()
+ * and READ_ONCE(), for example, data_race(READ_ONCE(x)).
*/
#define data_race(expr) \
({ \
diff --git a/tools/memory-model/Documentation/access-marking.txt b/tools/memory-model/Documentation/access-marking.txt
index 65778222183e3..3377d01bb512c 100644
--- a/tools/memory-model/Documentation/access-marking.txt
+++ b/tools/memory-model/Documentation/access-marking.txt
@@ -24,6 +24,11 @@ The Linux kernel provides the following access-marking options:
4. WRITE_ONCE(), for example, "WRITE_ONCE(a, b);"
The various forms of atomic_set() also fit in here.
+5. __data_racy, for example "int __data_racy a;"
+
+6. KCSAN's negative-marking assertions, ASSERT_EXCLUSIVE_ACCESS()
+ and ASSERT_EXCLUSIVE_WRITER(), are described in the
+ "ACCESS-DOCUMENTATION OPTIONS" section below.
These may be used in combination, as shown in this admittedly improbable
example:
@@ -205,6 +210,23 @@ because doing otherwise prevents KCSAN from detecting violations of your
code's synchronization rules.
+Use of __data_racy
+------------------
+
+Adding the __data_racy type qualifier to the declaration of a variable
+causes KCSAN to treat all accesses to that variable as if they were
+enclosed by data_race(). However, __data_racy does not affect the
+compiler, though one could imagine hardened kernel builds treating the
+__data_racy type qualifier as if it was the volatile keyword.
+
+Note well that __data_racy is subject to the same pointer-declaration
+rules as are other type qualifiers such as const and volatile.
+For example:
+
+ int __data_racy *p; // Pointer to data-racy data.
+ int *__data_racy p; // Data-racy pointer to non-data-racy data.
+
+
ACCESS-DOCUMENTATION OPTIONS
============================
@@ -342,7 +364,7 @@ as follows:
Because foo is read locklessly, all accesses are marked. The purpose
of the ASSERT_EXCLUSIVE_WRITER() is to allow KCSAN to check for a buggy
-concurrent lockless write.
+concurrent write, whether marked or not.
Lock-Protected Writes With Heuristic Lockless Reads
--
2.40.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH kcsan 2/2] kcsan: test: add missing MODULE_DESCRIPTION() macro
2024-06-04 20:40 [PATCH kcsan 0/2] KCSAN updates for v6.11 Paul E. McKenney
2024-06-04 20:40 ` [PATCH kcsan 1/2] kcsan: Add example to data_race() kerneldoc header Paul E. McKenney
@ 2024-06-04 20:40 ` Paul E. McKenney
1 sibling, 0 replies; 3+ messages in thread
From: Paul E. McKenney @ 2024-06-04 20:40 UTC (permalink / raw)
To: linux-kernel, kasan-dev, kernel-team, mingo
Cc: elver, andreyknvl, glider, dvyukov, cai, boqun.feng,
Jeff Johnson, Paul E . McKenney
From: Jeff Johnson <quic_jjohnson@quicinc.com>
Fix the warning reported by 'make C=1 W=1':
WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/kcsan/kcsan_test.o
Signed-off-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Reviewed-by: Marco Elver <elver@google.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
kernel/kcsan/kcsan_test.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/kernel/kcsan/kcsan_test.c b/kernel/kcsan/kcsan_test.c
index 0c17b4c83e1ca..117d9d4d3c3bd 100644
--- a/kernel/kcsan/kcsan_test.c
+++ b/kernel/kcsan/kcsan_test.c
@@ -1620,5 +1620,6 @@ static struct kunit_suite kcsan_test_suite = {
kunit_test_suites(&kcsan_test_suite);
+MODULE_DESCRIPTION("KCSAN test suite");
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Marco Elver <elver@google.com>");
--
2.40.1
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2024-06-04 20:40 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-04 20:40 [PATCH kcsan 0/2] KCSAN updates for v6.11 Paul E. McKenney
2024-06-04 20:40 ` [PATCH kcsan 1/2] kcsan: Add example to data_race() kerneldoc header Paul E. McKenney
2024-06-04 20:40 ` [PATCH kcsan 2/2] kcsan: test: add missing MODULE_DESCRIPTION() macro Paul E. McKenney
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®