Merge tag 'iommu-updates-v5.15' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / lib / Kconfig.kcsan
index 0440f37..e0a93ff 100644 (file)
@@ -40,10 +40,14 @@ menuconfig KCSAN
 
 if KCSAN
 
 
 if KCSAN
 
-# Compiler capabilities that should not fail the test if they are unavailable.
 config CC_HAS_TSAN_COMPOUND_READ_BEFORE_WRITE
        def_bool (CC_IS_CLANG && $(cc-option,-fsanitize=thread -mllvm -tsan-compound-read-before-write=1)) || \
                 (CC_IS_GCC && $(cc-option,-fsanitize=thread --param tsan-compound-read-before-write=1))
 config CC_HAS_TSAN_COMPOUND_READ_BEFORE_WRITE
        def_bool (CC_IS_CLANG && $(cc-option,-fsanitize=thread -mllvm -tsan-compound-read-before-write=1)) || \
                 (CC_IS_GCC && $(cc-option,-fsanitize=thread --param tsan-compound-read-before-write=1))
+       help
+         The compiler instruments plain compound read-write operations
+         differently (++, --, +=, -=, |=, &=, etc.), which allows KCSAN to
+         distinguish them from other plain accesses. This is currently
+         supported by Clang 12 or later.
 
 config KCSAN_VERBOSE
        bool "Show verbose reports with more information about system state"
 
 config KCSAN_VERBOSE
        bool "Show verbose reports with more information about system state"
@@ -58,9 +62,6 @@ config KCSAN_VERBOSE
          generated from any one of them, system stability may suffer due to
          deadlocks or recursion.  If in doubt, say N.
 
          generated from any one of them, system stability may suffer due to
          deadlocks or recursion.  If in doubt, say N.
 
-config KCSAN_DEBUG
-       bool "Debugging of KCSAN internals"
-
 config KCSAN_SELFTEST
        bool "Perform short selftests on boot"
        default y
 config KCSAN_SELFTEST
        bool "Perform short selftests on boot"
        default y
@@ -149,7 +150,8 @@ config KCSAN_SKIP_WATCH_RANDOMIZE
          KCSAN_WATCH_SKIP.
 
 config KCSAN_INTERRUPT_WATCHER
          KCSAN_WATCH_SKIP.
 
 config KCSAN_INTERRUPT_WATCHER
-       bool "Interruptible watchers"
+       bool "Interruptible watchers" if !KCSAN_STRICT
+       default KCSAN_STRICT
        help
          If enabled, a task that set up a watchpoint may be interrupted while
          delayed. This option will allow KCSAN to detect races between
        help
          If enabled, a task that set up a watchpoint may be interrupted while
          delayed. This option will allow KCSAN to detect races between
@@ -169,13 +171,9 @@ config KCSAN_REPORT_ONCE_IN_MS
          reporting to avoid flooding the console with reports.  Setting this
          to 0 disables rate limiting.
 
          reporting to avoid flooding the console with reports.  Setting this
          to 0 disables rate limiting.
 
-# The main purpose of the below options is to control reported data races (e.g.
-# in fuzzer configs), and are not expected to be switched frequently by other
-# users. We could turn some of them into boot parameters, but given they should
-# not be switched normally, let's keep them here to simplify configuration.
-#
-# The defaults below are chosen to be very conservative, and may miss certain
-# bugs.
+# The main purpose of the below options is to control reported data races, and
+# are not expected to be switched frequently by non-testers or at runtime.
+# The defaults are chosen to be conservative, and can miss certain bugs.
 
 config KCSAN_REPORT_RACE_UNKNOWN_ORIGIN
        bool "Report races of unknown origin"
 
 config KCSAN_REPORT_RACE_UNKNOWN_ORIGIN
        bool "Report races of unknown origin"
@@ -186,9 +184,17 @@ config KCSAN_REPORT_RACE_UNKNOWN_ORIGIN
          reported if it was only possible to infer a race due to a data value
          change while an access is being delayed on a watchpoint.
 
          reported if it was only possible to infer a race due to a data value
          change while an access is being delayed on a watchpoint.
 
+config KCSAN_STRICT
+       bool "Strict data-race checking"
+       help
+         KCSAN will report data races with the strictest possible rules, which
+         closely aligns with the rules defined by the Linux-kernel memory
+         consistency model (LKMM).
+
 config KCSAN_REPORT_VALUE_CHANGE_ONLY
        bool "Only report races where watcher observed a data value change"
        default y
 config KCSAN_REPORT_VALUE_CHANGE_ONLY
        bool "Only report races where watcher observed a data value change"
        default y
+       depends on !KCSAN_STRICT
        help
          If enabled and a conflicting write is observed via a watchpoint, but
          the data value of the memory location was observed to remain
        help
          If enabled and a conflicting write is observed via a watchpoint, but
          the data value of the memory location was observed to remain
@@ -197,6 +203,7 @@ config KCSAN_REPORT_VALUE_CHANGE_ONLY
 config KCSAN_ASSUME_PLAIN_WRITES_ATOMIC
        bool "Assume that plain aligned writes up to word size are atomic"
        default y
 config KCSAN_ASSUME_PLAIN_WRITES_ATOMIC
        bool "Assume that plain aligned writes up to word size are atomic"
        default y
+       depends on !KCSAN_STRICT
        help
          Assume that plain aligned writes up to word size are atomic by
          default, and also not subject to other unsafe compiler optimizations
        help
          Assume that plain aligned writes up to word size are atomic by
          default, and also not subject to other unsafe compiler optimizations
@@ -209,6 +216,7 @@ config KCSAN_ASSUME_PLAIN_WRITES_ATOMIC
 
 config KCSAN_IGNORE_ATOMICS
        bool "Do not instrument marked atomic accesses"
 
 config KCSAN_IGNORE_ATOMICS
        bool "Do not instrument marked atomic accesses"
+       depends on !KCSAN_STRICT
        help
          Never instrument marked atomic accesses. This option can be used for
          additional filtering. Conflicting marked atomic reads and plain
        help
          Never instrument marked atomic accesses. This option can be used for
          additional filtering. Conflicting marked atomic reads and plain
@@ -224,4 +232,14 @@ config KCSAN_IGNORE_ATOMICS
          due to two conflicting plain writes will be reported (aligned and
          unaligned, if CONFIG_KCSAN_ASSUME_PLAIN_WRITES_ATOMIC=n).
 
          due to two conflicting plain writes will be reported (aligned and
          unaligned, if CONFIG_KCSAN_ASSUME_PLAIN_WRITES_ATOMIC=n).
 
+config KCSAN_PERMISSIVE
+       bool "Enable all additional permissive rules"
+       depends on KCSAN_REPORT_VALUE_CHANGE_ONLY
+       help
+         Enable additional permissive rules to ignore certain classes of data
+         races (also see kernel/kcsan/permissive.h). None of the permissive
+         rules imply that such data races are generally safe, but can be used
+         to further reduce reported data races due to data-racy patterns
+         common across the kernel.
+
 endif # KCSAN
 endif # KCSAN