mm: add Kernel Electric-Fence infrastructure
[linux-block.git] / lib / Kconfig.kfence
diff --git a/lib/Kconfig.kfence b/lib/Kconfig.kfence
new file mode 100644 (file)
index 0000000..b88ac9d
--- /dev/null
@@ -0,0 +1,67 @@
+# 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 && !KASAN && (SLAB || SLUB)
+       select STACKTRACE
+       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.
+
+         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_STATIC_KEYS
+       bool "Use static keys to set up allocations"
+       default y
+       depends on JUMP_LABEL # To ensure performance, require jump labels
+       help
+         Use static keys (static branches) to set up KFENCE allocations. Using
+         static keys is normally recommended, because it avoids a dynamic
+         branch in the allocator's fast path. However, with very low sample
+         intervals, or on systems that do not support jump labels, a dynamic
+         branch may still be an acceptable performance trade-off.
+
+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_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.
+
+endif # KFENCE