Linux Audio

Check our new training course

Loading...
v5.14.15
  1# SPDX-License-Identifier: GPL-2.0-only
  2
  3config HAVE_ARCH_KCSAN
  4	bool
  5
  6config HAVE_KCSAN_COMPILER
  7	def_bool (CC_IS_CLANG && $(cc-option,-fsanitize=thread -mllvm -tsan-distinguish-volatile=1)) || \
  8		 (CC_IS_GCC && $(cc-option,-fsanitize=thread --param tsan-distinguish-volatile=1))
  9	help
 10	  For the list of compilers that support KCSAN, please see
 11	  <file:Documentation/dev-tools/kcsan.rst>.
 12
 13config KCSAN_KCOV_BROKEN
 14	def_bool KCOV && CC_HAS_SANCOV_TRACE_PC
 15	depends on CC_IS_CLANG
 16	depends on !$(cc-option,-Werror=unused-command-line-argument -fsanitize=thread -fsanitize-coverage=trace-pc)
 17	help
 18	  Some versions of clang support either KCSAN and KCOV but not the
 19	  combination of the two.
 20	  See https://bugs.llvm.org/show_bug.cgi?id=45831 for the status
 21	  in newer releases.
 22
 23menuconfig KCSAN
 24	bool "KCSAN: dynamic data race detector"
 25	depends on HAVE_ARCH_KCSAN && HAVE_KCSAN_COMPILER
 26	depends on DEBUG_KERNEL && !KASAN
 27	depends on !KCSAN_KCOV_BROKEN
 28	select STACKTRACE
 29	help
 30	  The Kernel Concurrency Sanitizer (KCSAN) is a dynamic
 31	  data-race detector that relies on compile-time instrumentation.
 32	  KCSAN uses a watchpoint-based sampling approach to detect races.
 33
 34	  While KCSAN's primary purpose is to detect data races, it
 35	  also provides assertions to check data access constraints.
 36	  These assertions can expose bugs that do not manifest as
 37	  data races.
 38
 39	  See <file:Documentation/dev-tools/kcsan.rst> for more details.
 40
 41if KCSAN
 42
 43# Compiler capabilities that should not fail the test if they are unavailable.
 44config CC_HAS_TSAN_COMPOUND_READ_BEFORE_WRITE
 45	def_bool (CC_IS_CLANG && $(cc-option,-fsanitize=thread -mllvm -tsan-compound-read-before-write=1)) || \
 46		 (CC_IS_GCC && $(cc-option,-fsanitize=thread --param tsan-compound-read-before-write=1))
 
 
 
 
 
 47
 48config KCSAN_VERBOSE
 49	bool "Show verbose reports with more information about system state"
 50	depends on PROVE_LOCKING
 51	help
 52	  If enabled, reports show more information about the system state that
 53	  may help better analyze and debug races. This includes held locks and
 54	  IRQ trace events.
 55
 56	  While this option should generally be benign, we call into more
 57	  external functions on report generation; if a race report is
 58	  generated from any one of them, system stability may suffer due to
 59	  deadlocks or recursion.  If in doubt, say N.
 60
 61config KCSAN_DEBUG
 62	bool "Debugging of KCSAN internals"
 63
 64config KCSAN_SELFTEST
 65	bool "Perform short selftests on boot"
 66	default y
 67	help
 68	  Run KCSAN selftests on boot. On test failure, causes the kernel to
 69	  panic. Recommended to be enabled, ensuring critical functionality
 70	  works as intended.
 71
 72config KCSAN_KUNIT_TEST
 73	tristate "KCSAN test for integrated runtime behaviour" if !KUNIT_ALL_TESTS
 74	default KUNIT_ALL_TESTS
 75	depends on TRACEPOINTS && KUNIT
 76	select TORTURE_TEST
 77	help
 78	  KCSAN test focusing on behaviour of the integrated runtime. Tests
 79	  various race scenarios, and verifies the reports generated to
 80	  console. Makes use of KUnit for test organization, and the Torture
 81	  framework for test thread control.
 82
 83	  Each test case may run at least up to KCSAN_REPORT_ONCE_IN_MS
 84	  milliseconds. Test run duration may be optimized by building the
 85	  kernel and KCSAN test with KCSAN_REPORT_ONCE_IN_MS set to a lower
 86	  than default value.
 87
 88	  Say Y here if you want the test to be built into the kernel and run
 89	  during boot; say M if you want the test to build as a module; say N
 90	  if you are unsure.
 91
 92config KCSAN_EARLY_ENABLE
 93	bool "Early enable during boot"
 94	default y
 95	help
 96	  If KCSAN should be enabled globally as soon as possible. KCSAN can
 97	  later be enabled/disabled via debugfs.
 98
 99config KCSAN_NUM_WATCHPOINTS
100	int "Number of available watchpoints"
101	default 64
102	help
103	  Total number of available watchpoints. An address range maps into a
104	  specific watchpoint slot as specified in kernel/kcsan/encoding.h.
105	  Although larger number of watchpoints may not be usable due to
106	  limited number of CPUs, a larger value helps to improve performance
107	  due to reducing cache-line contention. The chosen default is a
108	  conservative value; we should almost never observe "no_capacity"
109	  events (see /sys/kernel/debug/kcsan).
110
111config KCSAN_UDELAY_TASK
112	int "Delay in microseconds (for tasks)"
113	default 80
114	help
115	  For tasks, the microsecond delay after setting up a watchpoint.
116
117config KCSAN_UDELAY_INTERRUPT
118	int "Delay in microseconds (for interrupts)"
119	default 20
120	help
121	  For interrupts, the microsecond delay after setting up a watchpoint.
122	  Interrupts have tighter latency requirements, and their delay should
123	  be lower than for tasks.
124
125config KCSAN_DELAY_RANDOMIZE
126	bool "Randomize above delays"
127	default y
128	help
129	  If delays should be randomized, where the maximum is KCSAN_UDELAY_*.
130	  If false, the chosen delays are always the KCSAN_UDELAY_* values
131	  as defined above.
132
133config KCSAN_SKIP_WATCH
134	int "Skip instructions before setting up watchpoint"
135	default 4000
136	help
137	  The number of per-CPU memory operations to skip, before another
138	  watchpoint is set up, i.e. one in KCSAN_WATCH_SKIP per-CPU
139	  memory operations are used to set up a watchpoint. A smaller value
140	  results in more aggressive race detection, whereas a larger value
141	  improves system performance at the cost of missing some races.
142
143config KCSAN_SKIP_WATCH_RANDOMIZE
144	bool "Randomize watchpoint instruction skip count"
145	default y
146	help
147	  If instruction skip count should be randomized, where the maximum is
148	  KCSAN_WATCH_SKIP. If false, the chosen value is always
149	  KCSAN_WATCH_SKIP.
150
151config KCSAN_INTERRUPT_WATCHER
152	bool "Interruptible watchers"
 
153	help
154	  If enabled, a task that set up a watchpoint may be interrupted while
155	  delayed. This option will allow KCSAN to detect races between
156	  interrupted tasks and other threads of execution on the same CPU.
157
158	  Currently disabled by default, because not all safe per-CPU access
159	  primitives and patterns may be accounted for, and therefore could
160	  result in false positives.
161
162config KCSAN_REPORT_ONCE_IN_MS
163	int "Duration in milliseconds, in which any given race is only reported once"
164	default 3000
165	help
166	  Any given race is only reported once in the defined time window.
167	  Different races may still generate reports within a duration that is
168	  smaller than the duration defined here. This allows rate limiting
169	  reporting to avoid flooding the console with reports.  Setting this
170	  to 0 disables rate limiting.
171
172# The main purpose of the below options is to control reported data races (e.g.
173# in fuzzer configs), and are not expected to be switched frequently by other
174# users. We could turn some of them into boot parameters, but given they should
175# not be switched normally, let's keep them here to simplify configuration.
176#
177# The defaults below are chosen to be very conservative, and may miss certain
178# bugs.
179
180config KCSAN_REPORT_RACE_UNKNOWN_ORIGIN
181	bool "Report races of unknown origin"
182	default y
183	help
184	  If KCSAN should report races where only one access is known, and the
185	  conflicting access is of unknown origin. This type of race is
186	  reported if it was only possible to infer a race due to a data value
187	  change while an access is being delayed on a watchpoint.
188
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
189config KCSAN_REPORT_VALUE_CHANGE_ONLY
190	bool "Only report races where watcher observed a data value change"
191	default y
 
192	help
193	  If enabled and a conflicting write is observed via a watchpoint, but
194	  the data value of the memory location was observed to remain
195	  unchanged, do not report the data race.
196
197config KCSAN_ASSUME_PLAIN_WRITES_ATOMIC
198	bool "Assume that plain aligned writes up to word size are atomic"
199	default y
 
200	help
201	  Assume that plain aligned writes up to word size are atomic by
202	  default, and also not subject to other unsafe compiler optimizations
203	  resulting in data races. This will cause KCSAN to not report data
204	  races due to conflicts where the only plain accesses are aligned
205	  writes up to word size: conflicts between marked reads and plain
206	  aligned writes up to word size will not be reported as data races;
207	  notice that data races between two conflicting plain aligned writes
208	  will also not be reported.
209
210config KCSAN_IGNORE_ATOMICS
211	bool "Do not instrument marked atomic accesses"
 
212	help
213	  Never instrument marked atomic accesses. This option can be used for
214	  additional filtering. Conflicting marked atomic reads and plain
215	  writes will never be reported as a data race, however, will cause
216	  plain reads and marked writes to result in "unknown origin" reports.
217	  If combined with CONFIG_KCSAN_REPORT_RACE_UNKNOWN_ORIGIN=n, data
218	  races where at least one access is marked atomic will never be
219	  reported.
220
221	  Similar to KCSAN_ASSUME_PLAIN_WRITES_ATOMIC, but including unaligned
222	  accesses, conflicting marked atomic reads and plain writes will not
223	  be reported as data races; however, unlike that option, data races
224	  due to two conflicting plain writes will be reported (aligned and
225	  unaligned, if CONFIG_KCSAN_ASSUME_PLAIN_WRITES_ATOMIC=n).
 
 
 
 
 
 
 
 
 
 
226
227endif # KCSAN
v6.2
  1# SPDX-License-Identifier: GPL-2.0-only
  2
  3config HAVE_ARCH_KCSAN
  4	bool
  5
  6config HAVE_KCSAN_COMPILER
  7	def_bool (CC_IS_CLANG && $(cc-option,-fsanitize=thread -mllvm -tsan-distinguish-volatile=1)) || \
  8		 (CC_IS_GCC && $(cc-option,-fsanitize=thread --param tsan-distinguish-volatile=1))
  9	help
 10	  For the list of compilers that support KCSAN, please see
 11	  <file:Documentation/dev-tools/kcsan.rst>.
 12
 
 
 
 
 
 
 
 
 
 
 13menuconfig KCSAN
 14	bool "KCSAN: dynamic data race detector"
 15	depends on HAVE_ARCH_KCSAN && HAVE_KCSAN_COMPILER
 16	depends on DEBUG_KERNEL && !KASAN
 
 17	select STACKTRACE
 18	help
 19	  The Kernel Concurrency Sanitizer (KCSAN) is a dynamic
 20	  data-race detector that relies on compile-time instrumentation.
 21	  KCSAN uses a watchpoint-based sampling approach to detect races.
 22
 23	  While KCSAN's primary purpose is to detect data races, it
 24	  also provides assertions to check data access constraints.
 25	  These assertions can expose bugs that do not manifest as
 26	  data races.
 27
 28	  See <file:Documentation/dev-tools/kcsan.rst> for more details.
 29
 30if KCSAN
 31
 
 32config CC_HAS_TSAN_COMPOUND_READ_BEFORE_WRITE
 33	def_bool (CC_IS_CLANG && $(cc-option,-fsanitize=thread -mllvm -tsan-compound-read-before-write=1)) || \
 34		 (CC_IS_GCC && $(cc-option,-fsanitize=thread --param tsan-compound-read-before-write=1))
 35	help
 36	  The compiler instruments plain compound read-write operations
 37	  differently (++, --, +=, -=, |=, &=, etc.), which allows KCSAN to
 38	  distinguish them from other plain accesses. This is currently
 39	  supported by Clang 12 or later.
 40
 41config KCSAN_VERBOSE
 42	bool "Show verbose reports with more information about system state"
 43	depends on PROVE_LOCKING
 44	help
 45	  If enabled, reports show more information about the system state that
 46	  may help better analyze and debug races. This includes held locks and
 47	  IRQ trace events.
 48
 49	  While this option should generally be benign, we call into more
 50	  external functions on report generation; if a race report is
 51	  generated from any one of them, system stability may suffer due to
 52	  deadlocks or recursion.  If in doubt, say N.
 53
 
 
 
 54config KCSAN_SELFTEST
 55	bool "Perform short selftests on boot"
 56	default y
 57	help
 58	  Run KCSAN selftests on boot. On test failure, causes the kernel to
 59	  panic. Recommended to be enabled, ensuring critical functionality
 60	  works as intended.
 61
 62config KCSAN_KUNIT_TEST
 63	tristate "KCSAN test for integrated runtime behaviour" if !KUNIT_ALL_TESTS
 64	default KUNIT_ALL_TESTS
 65	depends on TRACEPOINTS && KUNIT
 66	select TORTURE_TEST
 67	help
 68	  KCSAN test focusing on behaviour of the integrated runtime. Tests
 69	  various race scenarios, and verifies the reports generated to
 70	  console. Makes use of KUnit for test organization, and the Torture
 71	  framework for test thread control.
 72
 73	  Each test case may run at least up to KCSAN_REPORT_ONCE_IN_MS
 74	  milliseconds. Test run duration may be optimized by building the
 75	  kernel and KCSAN test with KCSAN_REPORT_ONCE_IN_MS set to a lower
 76	  than default value.
 77
 78	  Say Y here if you want the test to be built into the kernel and run
 79	  during boot; say M if you want the test to build as a module; say N
 80	  if you are unsure.
 81
 82config KCSAN_EARLY_ENABLE
 83	bool "Early enable during boot"
 84	default y
 85	help
 86	  If KCSAN should be enabled globally as soon as possible. KCSAN can
 87	  later be enabled/disabled via debugfs.
 88
 89config KCSAN_NUM_WATCHPOINTS
 90	int "Number of available watchpoints"
 91	default 64
 92	help
 93	  Total number of available watchpoints. An address range maps into a
 94	  specific watchpoint slot as specified in kernel/kcsan/encoding.h.
 95	  Although larger number of watchpoints may not be usable due to
 96	  limited number of CPUs, a larger value helps to improve performance
 97	  due to reducing cache-line contention. The chosen default is a
 98	  conservative value; we should almost never observe "no_capacity"
 99	  events (see /sys/kernel/debug/kcsan).
100
101config KCSAN_UDELAY_TASK
102	int "Delay in microseconds (for tasks)"
103	default 80
104	help
105	  For tasks, the microsecond delay after setting up a watchpoint.
106
107config KCSAN_UDELAY_INTERRUPT
108	int "Delay in microseconds (for interrupts)"
109	default 20
110	help
111	  For interrupts, the microsecond delay after setting up a watchpoint.
112	  Interrupts have tighter latency requirements, and their delay should
113	  be lower than for tasks.
114
115config KCSAN_DELAY_RANDOMIZE
116	bool "Randomize above delays"
117	default y
118	help
119	  If delays should be randomized, where the maximum is KCSAN_UDELAY_*.
120	  If false, the chosen delays are always the KCSAN_UDELAY_* values
121	  as defined above.
122
123config KCSAN_SKIP_WATCH
124	int "Skip instructions before setting up watchpoint"
125	default 4000
126	help
127	  The number of per-CPU memory operations to skip, before another
128	  watchpoint is set up, i.e. one in KCSAN_SKIP_WATCH per-CPU
129	  memory operations are used to set up a watchpoint. A smaller value
130	  results in more aggressive race detection, whereas a larger value
131	  improves system performance at the cost of missing some races.
132
133config KCSAN_SKIP_WATCH_RANDOMIZE
134	bool "Randomize watchpoint instruction skip count"
135	default y
136	help
137	  If instruction skip count should be randomized, where the maximum is
138	  KCSAN_SKIP_WATCH. If false, the chosen value is always
139	  KCSAN_SKIP_WATCH.
140
141config KCSAN_INTERRUPT_WATCHER
142	bool "Interruptible watchers" if !KCSAN_STRICT
143	default KCSAN_STRICT
144	help
145	  If enabled, a task that set up a watchpoint may be interrupted while
146	  delayed. This option will allow KCSAN to detect races between
147	  interrupted tasks and other threads of execution on the same CPU.
148
149	  Currently disabled by default, because not all safe per-CPU access
150	  primitives and patterns may be accounted for, and therefore could
151	  result in false positives.
152
153config KCSAN_REPORT_ONCE_IN_MS
154	int "Duration in milliseconds, in which any given race is only reported once"
155	default 3000
156	help
157	  Any given race is only reported once in the defined time window.
158	  Different races may still generate reports within a duration that is
159	  smaller than the duration defined here. This allows rate limiting
160	  reporting to avoid flooding the console with reports.  Setting this
161	  to 0 disables rate limiting.
162
163# The main purpose of the below options is to control reported data races, and
164# are not expected to be switched frequently by non-testers or at runtime.
165# The defaults are chosen to be conservative, and can miss certain bugs.
 
 
 
 
166
167config KCSAN_REPORT_RACE_UNKNOWN_ORIGIN
168	bool "Report races of unknown origin"
169	default y
170	help
171	  If KCSAN should report races where only one access is known, and the
172	  conflicting access is of unknown origin. This type of race is
173	  reported if it was only possible to infer a race due to a data value
174	  change while an access is being delayed on a watchpoint.
175
176config KCSAN_STRICT
177	bool "Strict data-race checking"
178	help
179	  KCSAN will report data races with the strictest possible rules, which
180	  closely aligns with the rules defined by the Linux-kernel memory
181	  consistency model (LKMM).
182
183config KCSAN_WEAK_MEMORY
184	bool "Enable weak memory modeling to detect missing memory barriers"
185	default y
186	depends on KCSAN_STRICT
187	# We can either let objtool nop __tsan_func_{entry,exit}() and builtin
188	# atomics instrumentation in .noinstr.text, or use a compiler that can
189	# implement __no_kcsan to really remove all instrumentation.
190	depends on !ARCH_WANTS_NO_INSTR || HAVE_NOINSTR_HACK || \
191		   CC_IS_GCC || CLANG_VERSION >= 140000
192	select OBJTOOL if HAVE_NOINSTR_HACK
193	help
194	  Enable support for modeling a subset of weak memory, which allows
195	  detecting a subset of data races due to missing memory barriers.
196
197	  Depends on KCSAN_STRICT, because the options strengthening certain
198	  plain accesses by default (depending on !KCSAN_STRICT) reduce the
199	  ability to detect any data races invoving reordered accesses, in
200	  particular reordered writes.
201
202	  Weak memory modeling relies on additional instrumentation and may
203	  affect performance.
204
205config KCSAN_REPORT_VALUE_CHANGE_ONLY
206	bool "Only report races where watcher observed a data value change"
207	default y
208	depends on !KCSAN_STRICT
209	help
210	  If enabled and a conflicting write is observed via a watchpoint, but
211	  the data value of the memory location was observed to remain
212	  unchanged, do not report the data race.
213
214config KCSAN_ASSUME_PLAIN_WRITES_ATOMIC
215	bool "Assume that plain aligned writes up to word size are atomic"
216	default y
217	depends on !KCSAN_STRICT
218	help
219	  Assume that plain aligned writes up to word size are atomic by
220	  default, and also not subject to other unsafe compiler optimizations
221	  resulting in data races. This will cause KCSAN to not report data
222	  races due to conflicts where the only plain accesses are aligned
223	  writes up to word size: conflicts between marked reads and plain
224	  aligned writes up to word size will not be reported as data races;
225	  notice that data races between two conflicting plain aligned writes
226	  will also not be reported.
227
228config KCSAN_IGNORE_ATOMICS
229	bool "Do not instrument marked atomic accesses"
230	depends on !KCSAN_STRICT
231	help
232	  Never instrument marked atomic accesses. This option can be used for
233	  additional filtering. Conflicting marked atomic reads and plain
234	  writes will never be reported as a data race, however, will cause
235	  plain reads and marked writes to result in "unknown origin" reports.
236	  If combined with CONFIG_KCSAN_REPORT_RACE_UNKNOWN_ORIGIN=n, data
237	  races where at least one access is marked atomic will never be
238	  reported.
239
240	  Similar to KCSAN_ASSUME_PLAIN_WRITES_ATOMIC, but including unaligned
241	  accesses, conflicting marked atomic reads and plain writes will not
242	  be reported as data races; however, unlike that option, data races
243	  due to two conflicting plain writes will be reported (aligned and
244	  unaligned, if CONFIG_KCSAN_ASSUME_PLAIN_WRITES_ATOMIC=n).
245
246config KCSAN_PERMISSIVE
247	bool "Enable all additional permissive rules"
248	depends on KCSAN_REPORT_VALUE_CHANGE_ONLY
249	help
250	  Enable additional permissive rules to ignore certain classes of data
251	  races (also see kernel/kcsan/permissive.h). None of the permissive
252	  rules imply that such data races are generally safe, but can be used
253	  to further reduce reported data races due to data-racy patterns
254	  common across the kernel.
255
256endif # KCSAN