| # SPDX-License-Identifier: GPL-2.0-only | |
| config HAVE_ARCH_KFENCE | |
| bool | |
| menuconfig KFENCE | |
| bool "KFENCE: low-overhead sampling-based memory safety error detector" | |
| depends on HAVE_ARCH_KFENCE | |
| select STACKTRACE | |
| select IRQ_WORK | |
| help | |
| KFENCE is a low-overhead sampling-based detector of heap out-of-bounds | |
| access, use-after-free, and invalid-free errors. KFENCE is designed | |
| to have negligible cost to permit enabling it in production | |
| environments. | |
| See <file:Documentation/dev-tools/kfence.rst> for more details. | |
| Note that, KFENCE is not a substitute for explicit testing with tools | |
| such as KASAN. KFENCE can detect a subset of bugs that KASAN can | |
| detect, albeit at very different performance profiles. If you can | |
| afford to use KASAN, continue using KASAN, for example in test | |
| environments. If your kernel targets production use, and cannot | |
| enable KASAN due to its cost, consider using KFENCE. | |
| if KFENCE | |
| config KFENCE_SAMPLE_INTERVAL | |
| int "Default sample interval in milliseconds" | |
| default 100 | |
| help | |
| The KFENCE sample interval determines the frequency with which heap | |
| allocations will be guarded by KFENCE. May be overridden via boot | |
| parameter "kfence.sample_interval". | |
| Set this to 0 to disable KFENCE by default, in which case only | |
| setting "kfence.sample_interval" to a non-zero value enables KFENCE. | |
| config KFENCE_NUM_OBJECTS | |
| int "Number of guarded objects available" | |
| range 1 65535 | |
| default 255 | |
| help | |
| The number of guarded objects available. For each KFENCE object, 2 | |
| pages are required; with one containing the object and two adjacent | |
| ones used as guard pages. | |
| config KFENCE_DEFERRABLE | |
| bool "Use a deferrable timer to trigger allocations" | |
| help | |
| Use a deferrable timer to trigger allocations. This avoids forcing | |
| CPU wake-ups if the system is idle, at the risk of a less predictable | |
| sample interval. | |
| Warning: The KUnit test suite fails with this option enabled - due to | |
| the unpredictability of the sample interval! | |
| Say N if you are unsure. | |
| config KFENCE_STATIC_KEYS | |
| bool "Use static keys to set up allocations" if EXPERT | |
| depends on JUMP_LABEL | |
| help | |
| Use static keys (static branches) to set up KFENCE allocations. This | |
| option is only recommended when using very large sample intervals, or | |
| performance has carefully been evaluated with this option. | |
| Using static keys comes with trade-offs that need to be carefully | |
| evaluated given target workloads and system architectures. Notably, | |
| enabling and disabling static keys invoke IPI broadcasts, the latency | |
| and impact of which is much harder to predict than a dynamic branch. | |
| Say N if you are unsure. | |
| config KFENCE_STRESS_TEST_FAULTS | |
| int "Stress testing of fault handling and error reporting" if EXPERT | |
| default 0 | |
| help | |
| The inverse probability with which to randomly protect KFENCE object | |
| pages, resulting in spurious use-after-frees. The main purpose of | |
| this option is to stress test KFENCE with concurrent error reports | |
| and allocations/frees. A value of 0 disables stress testing logic. | |
| Only for KFENCE testing; set to 0 if you are not a KFENCE developer. | |
| config KFENCE_KUNIT_TEST | |
| tristate "KFENCE integration test suite" if !KUNIT_ALL_TESTS | |
| default KUNIT_ALL_TESTS | |
| depends on TRACEPOINTS && KUNIT | |
| help | |
| Test suite for KFENCE, testing various error detection scenarios with | |
| various allocation types, and checking that reports are correctly | |
| output to console. | |
| Say Y here if you want the test to be built into the kernel and run | |
| during boot; say M if you want the test to build as a module; say N | |
| if you are unsure. | |
| endif # KFENCE |