# SPDX-License-Identifier: GPL-2.0-only
menu "Kernel hacking"

menu "printk and dmesg options"

config PRINTK_TIME
	bool "Show timing information on printks"
	depends on PRINTK
	help
	  Selecting this option causes time stamps of the printk()
	  messages to be added to the output of the syslog() system
	  call and at the console.

	  The timestamp is always recorded internally, and exported
	  to /dev/kmsg. This flag just specifies if the timestamp should
	  be included, not that the timestamp is recorded.

	  The behavior is also controlled by the kernel command line
	  parameter printk.time=1. See Documentation/admin-guide/kernel-parameters.rst

config PRINTK_CALLER
	bool "Show caller information on printks"
	depends on PRINTK
	help
	  Selecting this option causes printk() to add a caller "thread id" (if
	  in task context) or a caller "processor id" (if not in task context)
	  to every message.

	  This option is intended for environments where multiple threads
	  concurrently call printk() for many times, for it is difficult to
	  interpret without knowing where these lines (or sometimes individual
	  line which was divided into multiple lines due to race) came from.

	  Since toggling after boot makes the code racy, currently there is
	  no option to enable/disable at the kernel command line parameter or
	  sysfs interface.

config STACKTRACE_BUILD_ID
	bool "Show build ID information in stacktraces"
	depends on PRINTK
	help
	  Selecting this option adds build ID information for symbols in
	  stacktraces printed with the printk format '%p[SR]b'.

	  This option is intended for distros where debuginfo is not easily
	  accessible but can be downloaded given the build ID of the vmlinux or
	  kernel module where the function is located.

config CONSOLE_LOGLEVEL_DEFAULT
	int "Default console loglevel (1-15)"
	range 1 15
	default "7"
	help
	  Default loglevel to determine what will be printed on the console.

	  Setting a default here is equivalent to passing in loglevel=<x> in
	  the kernel bootargs. loglevel=<x> continues to override whatever
	  value is specified here as well.

	  Note: This does not affect the log level of un-prefixed printk()
	  usage in the kernel. That is controlled by the MESSAGE_LOGLEVEL_DEFAULT
	  option.

config CONSOLE_LOGLEVEL_QUIET
	int "quiet console loglevel (1-15)"
	range 1 15
	default "4"
	help
	  loglevel to use when "quiet" is passed on the kernel commandline.

	  When "quiet" is passed on the kernel commandline this loglevel
	  will be used as the loglevel. IOW passing "quiet" will be the
	  equivalent of passing "loglevel=<CONSOLE_LOGLEVEL_QUIET>"

config MESSAGE_LOGLEVEL_DEFAULT
	int "Default message log level (1-7)"
	range 1 7
	default "4"
	help
	  Default log level for printk statements with no specified priority.

	  This was hard-coded to KERN_WARNING since at least 2.6.10 but folks
	  that are auditing their logs closely may want to set it to a lower
	  priority.

	  Note: This does not affect what message level gets printed on the console
	  by default. To change that, use loglevel=<x> in the kernel bootargs,
	  or pick a different CONSOLE_LOGLEVEL_DEFAULT configuration value.

config BOOT_PRINTK_DELAY
	bool "Delay each boot printk message by N milliseconds"
	depends on DEBUG_KERNEL && PRINTK && GENERIC_CALIBRATE_DELAY
	help
	  This build option allows you to read kernel boot messages
	  by inserting a short delay after each one.  The delay is
	  specified in milliseconds on the kernel command line,
	  using "boot_delay=N".

	  It is likely that you would also need to use "lpj=M" to preset
	  the "loops per jiffie" value.
	  See a previous boot log for the "lpj" value to use for your
	  system, and then set "lpj=M" before setting "boot_delay=N".
	  NOTE:  Using this option may adversely affect SMP systems.
	  I.e., processors other than the first one may not boot up.
	  BOOT_PRINTK_DELAY also may cause LOCKUP_DETECTOR to detect
	  what it believes to be lockup conditions.

config DYNAMIC_DEBUG
	bool "Enable dynamic printk() support"
	default n
	depends on PRINTK
	depends on (DEBUG_FS || PROC_FS)
	select DYNAMIC_DEBUG_CORE
	help

	  Compiles debug level messages into the kernel, which would not
	  otherwise be available at runtime. These messages can then be
	  enabled/disabled based on various levels of scope - per source file,
	  function, module, format string, and line number. This mechanism
	  implicitly compiles in all pr_debug() and dev_dbg() calls, which
	  enlarges the kernel text size by about 2%.

	  If a source file is compiled with DEBUG flag set, any
	  pr_debug() calls in it are enabled by default, but can be
	  disabled at runtime as below.  Note that DEBUG flag is
	  turned on by many CONFIG_*DEBUG* options.

	  Usage:

	  Dynamic debugging is controlled via the 'dynamic_debug/control' file,
	  which is contained in the 'debugfs' filesystem or procfs.
	  Thus, the debugfs or procfs filesystem must first be mounted before
	  making use of this feature.
	  We refer the control file as: <debugfs>/dynamic_debug/control. This
	  file contains a list of the debug statements that can be enabled. The
	  format for each line of the file is:

		filename:lineno [module]function flags format

	  filename : source file of the debug statement
	  lineno : line number of the debug statement
	  module : module that contains the debug statement
	  function : function that contains the debug statement
	  flags : '=p' means the line is turned 'on' for printing
	  format : the format used for the debug statement

	  From a live system:

		nullarbor:~ # cat <debugfs>/dynamic_debug/control
		# filename:lineno [module]function flags format
		fs/aio.c:222 [aio]__put_ioctx =_ "__put_ioctx:\040freeing\040%p\012"
		fs/aio.c:248 [aio]ioctx_alloc =_ "ENOMEM:\040nr_events\040too\040high\012"
		fs/aio.c:1770 [aio]sys_io_cancel =_ "calling\040cancel\012"

	  Example usage:

		// enable the message at line 1603 of file svcsock.c
		nullarbor:~ # echo -n 'file svcsock.c line 1603 +p' >
						<debugfs>/dynamic_debug/control

		// enable all the messages in file svcsock.c
		nullarbor:~ # echo -n 'file svcsock.c +p' >
						<debugfs>/dynamic_debug/control

		// enable all the messages in the NFS server module
		nullarbor:~ # echo -n 'module nfsd +p' >
						<debugfs>/dynamic_debug/control

		// enable all 12 messages in the function svc_process()
		nullarbor:~ # echo -n 'func svc_process +p' >
						<debugfs>/dynamic_debug/control

		// disable all 12 messages in the function svc_process()
		nullarbor:~ # echo -n 'func svc_process -p' >
						<debugfs>/dynamic_debug/control

	  See Documentation/admin-guide/dynamic-debug-howto.rst for additional
	  information.

config DYNAMIC_DEBUG_CORE
	bool "Enable core function of dynamic debug support"
	depends on PRINTK
	depends on (DEBUG_FS || PROC_FS)
	help
	  Enable core functional support of dynamic debug. It is useful
	  when you want to tie dynamic debug to your kernel modules with
	  DYNAMIC_DEBUG_MODULE defined for each of them, especially for
	  the case of embedded system where the kernel image size is
	  sensitive for people.

config SYMBOLIC_ERRNAME
	bool "Support symbolic error names in printf"
	default y if PRINTK
	help
	  If you say Y here, the kernel's printf implementation will
	  be able to print symbolic error names such as ENOSPC instead
	  of the number 28. It makes the kernel image slightly larger
	  (about 3KB), but can make the kernel logs easier to read.

config DEBUG_BUGVERBOSE
	bool "Verbose BUG() reporting (adds 70K)" if DEBUG_KERNEL && EXPERT
	depends on BUG && (GENERIC_BUG || HAVE_DEBUG_BUGVERBOSE)
	default y
	help
	  Say Y here to make BUG() panics output the file name and line number
	  of the BUG call as well as the EIP and oops trace.  This aids
	  debugging but costs about 70-100K of memory.

endmenu # "printk and dmesg options"

menu "Compile-time checks and compiler options"

config DEBUG_INFO
	bool "Compile the kernel with debug info"
	depends on DEBUG_KERNEL && !COMPILE_TEST
	help
	  If you say Y here the resulting kernel image will include
	  debugging info resulting in a larger kernel image.
	  This adds debug symbols to the kernel and modules (gcc -g), and
	  is needed if you intend to use kernel crashdump or binary object
	  tools like crash, kgdb, LKCD, gdb, etc on the kernel.
	  Say Y here only if you plan to debug the kernel.

	  If unsure, say N.

if DEBUG_INFO

config DEBUG_INFO_REDUCED
	bool "Reduce debugging information"
	help
	  If you say Y here gcc is instructed to generate less debugging
	  information for structure types. This means that tools that
	  need full debugging information (like kgdb or systemtap) won't
	  be happy. But if you merely need debugging information to
	  resolve line numbers there is no loss. Advantage is that
	  build directory object sizes shrink dramatically over a full
	  DEBUG_INFO build and compile times are reduced too.
	  Only works with newer gcc versions.

config DEBUG_INFO_COMPRESSED
	bool "Compressed debugging information"
	depends on $(cc-option,-gz=zlib)
	depends on $(ld-option,--compress-debug-sections=zlib)
	help
	  Compress the debug information using zlib.  Requires GCC 5.0+ or Clang
	  5.0+, binutils 2.26+, and zlib.

	  Users of dpkg-deb via scripts/package/builddeb may find an increase in
	  size of their debug .deb packages with this config set, due to the
	  debug info being compressed with zlib, then the object files being
	  recompressed with a different compression scheme. But this is still
	  preferable to setting $KDEB_COMPRESS to "none" which would be even
	  larger.

config DEBUG_INFO_SPLIT
	bool "Produce split debuginfo in .dwo files"
	depends on $(cc-option,-gsplit-dwarf)
	help
	  Generate debug info into separate .dwo files. This significantly
	  reduces the build directory size for builds with DEBUG_INFO,
	  because it stores the information only once on disk in .dwo
	  files instead of multiple times in object files and executables.
	  In addition the debug information is also compressed.

	  Requires recent gcc (4.7+) and recent gdb/binutils.
	  Any tool that packages or reads debug information would need
	  to know about the .dwo files and include them.
	  Incompatible with older versions of ccache.

choice
	prompt "DWARF version"
	help
	  Which version of DWARF debug info to emit.

config DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT
	bool "Rely on the toolchain's implicit default DWARF version"
	help
	  The implicit default version of DWARF debug info produced by a
	  toolchain changes over time.

	  This can break consumers of the debug info that haven't upgraded to
	  support newer revisions, and prevent testing newer versions, but
	  those should be less common scenarios.

	  If unsure, say Y.

config DEBUG_INFO_DWARF4
	bool "Generate DWARF Version 4 debuginfo"
	help
	  Generate DWARF v4 debug info. This requires gcc 4.5+ and gdb 7.0+.

	  If you have consumers of DWARF debug info that are not ready for
	  newer revisions of DWARF, you may wish to choose this or have your
	  config select this.

config DEBUG_INFO_DWARF5
	bool "Generate DWARF Version 5 debuginfo"
	depends on !CC_IS_CLANG || (CC_IS_CLANG && (AS_IS_LLVM || (AS_IS_GNU && AS_VERSION >= 23502)))
	depends on !DEBUG_INFO_BTF
	help
	  Generate DWARF v5 debug info. Requires binutils 2.35.2, gcc 5.0+ (gcc
	  5.0+ accepts the -gdwarf-5 flag but only had partial support for some
	  draft features until 7.0), and gdb 8.0+.

	  Changes to the structure of debug info in Version 5 allow for around
	  15-18% savings in resulting image and debug info section sizes as
	  compared to DWARF Version 4. DWARF Version 5 standardizes previous
	  extensions such as accelerators for symbol indexing and the format
	  for fission (.dwo/.dwp) files. Users may not want to select this
	  config if they rely on tooling that has not yet been updated to
	  support DWARF Version 5.

endchoice # "DWARF version"

config DEBUG_INFO_BTF
	bool "Generate BTF typeinfo"
	depends on !DEBUG_INFO_SPLIT && !DEBUG_INFO_REDUCED
	depends on !GCC_PLUGIN_RANDSTRUCT || COMPILE_TEST
	help
	  Generate deduplicated BTF type information from DWARF debug info.
	  Turning this on expects presence of pahole tool, which will convert
	  DWARF type info into equivalent deduplicated BTF type info.

config PAHOLE_HAS_SPLIT_BTF
	def_bool $(success, test `$(PAHOLE) --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/'` -ge "119")

config DEBUG_INFO_BTF_MODULES
	def_bool y
	depends on DEBUG_INFO_BTF && MODULES && PAHOLE_HAS_SPLIT_BTF
	help
	  Generate compact split BTF type information for kernel modules.

config GDB_SCRIPTS
	bool "Provide GDB scripts for kernel debugging"
	help
	  This creates the required links to GDB helper scripts in the
	  build directory. If you load vmlinux into gdb, the helper
	  scripts will be automatically imported by gdb as well, and
	  additional functions are available to analyze a Linux kernel
	  instance. See Documentation/dev-tools/gdb-kernel-debugging.rst
	  for further details.

endif # DEBUG_INFO

config FRAME_WARN
	int "Warn for stack frames larger than"
	range 0 8192
	default 2048 if GCC_PLUGIN_LATENT_ENTROPY
	default 1536 if (!64BIT && (PARISC || XTENSA))
	default 1024 if (!64BIT && !PARISC)
	default 2048 if 64BIT
	help
	  Tell gcc to warn at build time for stack frames larger than this.
	  Setting this too low will cause a lot of warnings.
	  Setting it to 0 disables the warning.

config STRIP_ASM_SYMS
	bool "Strip assembler-generated symbols during link"
	default n
	help
	  Strip internal assembler-generated symbols during a link (symbols
	  that look like '.Lxxx') so they don't pollute the output of
	  get_wchan() and suchlike.

config READABLE_ASM
	bool "Generate readable assembler code"
	depends on DEBUG_KERNEL
	depends on CC_IS_GCC
	help
	  Disable some compiler optimizations that tend to generate human unreadable
	  assembler output. This may make the kernel slightly slower, but it helps
	  to keep kernel developers who have to stare a lot at assembler listings
	  sane.

config HEADERS_INSTALL
	bool "Install uapi headers to usr/include"
	depends on !UML
	help
	  This option will install uapi headers (headers exported to user-space)
	  into the usr/include directory for use during the kernel build.
	  This is unneeded for building the kernel itself, but needed for some
	  user-space program samples. It is also needed by some features such
	  as uapi header sanity checks.

config DEBUG_SECTION_MISMATCH
	bool "Enable full Section mismatch analysis"
	depends on CC_IS_GCC
	help
	  The section mismatch analysis checks if there are illegal
	  references from one section to another section.
	  During linktime or runtime, some sections are dropped;
	  any use of code/data previously in these sections would
	  most likely result in an oops.
	  In the code, functions and variables are annotated with
	  __init,, etc. (see the full list in include/linux/init.h),
	  which results in the code/data being placed in specific sections.
	  The section mismatch analysis is always performed after a full
	  kernel build, and enabling this option causes the following
	  additional step to occur:
	  - Add the option -fno-inline-functions-called-once to gcc commands.
	    When inlining a function annotated with __init in a non-init
	    function, we would lose the section information and thus
	    the analysis would not catch the illegal reference.
	    This option tells gcc to inline less (but it does result in
	    a larger kernel).

config SECTION_MISMATCH_WARN_ONLY
	bool "Make section mismatch errors non-fatal"
	default y
	help
	  If you say N here, the build process will fail if there are any
	  section mismatch, instead of just throwing warnings.

	  If unsure, say Y.

config DEBUG_FORCE_FUNCTION_ALIGN_64B
	bool "Force all function address 64B aligned" if EXPERT
	help
	  There are cases that a commit from one domain changes the function
	  address alignment of other domains, and cause magic performance
	  bump (regression or improvement). Enable this option will help to
	  verify if the bump is caused by function alignment changes, while
	  it will slightly increase the kernel size and affect icache usage.

	  It is mainly for debug and performance tuning use.

#
# Select this config option from the architecture Kconfig, if it
# is preferred to always offer frame pointers as a config
# option on the architecture (regardless of KERNEL_DEBUG):
#
config ARCH_WANT_FRAME_POINTERS
	bool

config FRAME_POINTER
	bool "Compile the kernel with frame pointers"
	depends on DEBUG_KERNEL && (M68K || UML || SUPERH) || ARCH_WANT_FRAME_POINTERS
	default y if (DEBUG_INFO && UML) || ARCH_WANT_FRAME_POINTERS
	help
	  If you say Y here the resulting kernel image will be slightly
	  larger and slower, but it gives very useful debugging information
	  in case of kernel bugs. (precise oopses/stacktraces/warnings)

config STACK_VALIDATION
	bool "Compile-time stack metadata validation"
	depends on HAVE_STACK_VALIDATION
	default n
	help
	  Add compile-time checks to validate stack metadata, including frame
	  pointers (if CONFIG_FRAME_POINTER is enabled).  This helps ensure
	  that runtime stack traces are more reliable.

	  This is also a prerequisite for generation of ORC unwind data, which
	  is needed for CONFIG_UNWINDER_ORC.

	  For more information, see
	  tools/objtool/Documentation/stack-validation.txt.

config VMLINUX_VALIDATION
	bool
	depends on STACK_VALIDATION && DEBUG_ENTRY && !PARAVIRT
	default y

config VMLINUX_MAP
	bool "Generate vmlinux.map file when linking"
	depends on EXPERT
	help
	  Selecting this option will pass "-Map=vmlinux.map" to ld
	  when linking vmlinux. That file can be useful for verifying
	  and debugging magic section games, and for seeing which
	  pieces of code get eliminated with
	  CONFIG_LD_DEAD_CODE_DATA_ELIMINATION.

config DEBUG_FORCE_WEAK_PER_CPU
	bool "Force weak per-cpu definitions"
	depends on DEBUG_KERNEL
	help
	  s390 and alpha require percpu variables in modules to be
	  defined weak to work around addressing range issue which
	  puts the following two restrictions on percpu variable
	  definitions.

	  1. percpu symbols must be unique whether static or not
	  2. percpu variables can't be defined inside a function

	  To ensure that generic code follows the above rules, this
	  option forces all percpu variables to be defined as weak.

endmenu # "Compiler options"

menu "Generic Kernel Debugging Instruments"

config MAGIC_SYSRQ
	bool "Magic SysRq key"
	depends on !UML
	help
	  If you say Y here, you will have some control over the system even
	  if the system crashes for example during kernel debugging (e.g., you
	  will be able to flush the buffer cache to disk, reboot the system
	  immediately or dump some status information). This is accomplished
	  by pressing various keys while holding SysRq (Alt+PrintScreen). It
	  also works on a serial console (on PC hardware at least), if you
	  send a BREAK and then within 5 seconds a command keypress. The
	  keys are documented in <file:Documentation/admin-guide/sysrq.rst>.
	  Don't say Y unless you really know what this hack does.

config MAGIC_SYSRQ_DEFAULT_ENABLE
	hex "Enable magic SysRq key functions by default"
	depends on MAGIC_SYSRQ
	default 0x1
	help
	  Specifies which SysRq key functions are enabled by default.
	  This may be set to 1 or 0 to enable or disable them all, or
	  to a bitmask as described in Documentation/admin-guide/sysrq.rst.

config MAGIC_SYSRQ_SERIAL
	bool "Enable magic SysRq key over serial"
	depends on MAGIC_SYSRQ
	default y
	help
	  Many embedded boards have a disconnected TTL level serial which can
	  generate some garbage that can lead to spurious false sysrq detects.
	  This option allows you to decide whether you want to enable the
	  magic SysRq key.

config MAGIC_SYSRQ_SERIAL_SEQUENCE
	string "Char sequence that enables magic SysRq over serial"
	depends on MAGIC_SYSRQ_SERIAL
	default ""
	help
	  Specifies a sequence of characters that can follow BREAK to enable
	  SysRq on a serial console.

	  If unsure, leave an empty string and the option will not be enabled.

config DEBUG_FS
	bool "Debug Filesystem"
	help
	  debugfs is a virtual file system that kernel developers use to put
	  debugging files into.  Enable this option to be able to read and
	  write to these files.

	  For detailed documentation on the debugfs API, see
	  Documentation/filesystems/.

	  If unsure, say N.

choice
	prompt "Debugfs default access"
	depends on DEBUG_FS
	default DEBUG_FS_ALLOW_ALL
	help
	  This selects the default access restrictions for debugfs.
	  It can be overridden with kernel command line option
	  debugfs=[on,no-mount,off]. The restrictions apply for API access
	  and filesystem registration.

config DEBUG_FS_ALLOW_ALL
	bool "Access normal"
	help
	  No restrictions apply. Both API and filesystem registration
	  is on. This is the normal default operation.

config DEBUG_FS_DISALLOW_MOUNT
	bool "Do not register debugfs as filesystem"
	help
	  The API is open but filesystem is not loaded. Clients can still do
	  their work and read with debug tools that do not need
	  debugfs filesystem.

config DEBUG_FS_ALLOW_NONE
	bool "No access"
	help
	  Access is off. Clients get -PERM when trying to create nodes in
	  debugfs tree and debugfs is not registered as a filesystem.
	  Client can then back-off or continue without debugfs access.

endchoice

source "lib/Kconfig.kgdb"
source "lib/Kconfig.ubsan"
source "lib/Kconfig.kcsan"

endmenu

config DEBUG_KERNEL
	bool "Kernel debugging"
	help
	  Say Y here if you are developing drivers or trying to debug and
	  identify kernel problems.

config DEBUG_MISC
	bool "Miscellaneous debug code"
	default DEBUG_KERNEL
	depends on DEBUG_KERNEL
	help
	  Say Y here if you need to enable miscellaneous debug code that should
	  be under a more specific debug option but isn't.


menu "Memory Debugging"

source "mm/Kconfig.debug"

config DEBUG_OBJECTS
	bool "Debug object operations"
	depends on DEBUG_KERNEL
	help
	  If you say Y here, additional code will be inserted into the
	  kernel to track the life time of various objects and validate
	  the operations on those objects.

config DEBUG_OBJECTS_SELFTEST
	bool "Debug objects selftest"
	depends on DEBUG_OBJECTS
	help
	  This enables the selftest of the object debug code.

config DEBUG_OBJECTS_FREE
	bool "Debug objects in freed memory"
	depends on DEBUG_OBJECTS
	help
	  This enables checks whether a k/v free operation frees an area
	  which contains an object which has not been deactivated
	  properly. This can make kmalloc/kfree-intensive workloads
	  much slower.

config DEBUG_OBJECTS_TIMERS
	bool "Debug timer objects"
	depends on DEBUG_OBJECTS
	help
	  If you say Y here, additional code will be inserted into the
	  timer routines to track the life time of timer objects and
	  validate the timer operations.

config DEBUG_OBJECTS_WORK
	bool "Debug work objects"
	depends on DEBUG_OBJECTS
	help
	  If you say Y here, additional code will be inserted into the
	  work queue routines to track the life time of work objects and
	  validate the work operations.

config DEBUG_OBJECTS_RCU_HEAD
	bool "Debug RCU callbacks objects"
	depends on DEBUG_OBJECTS
	help
	  Enable this to turn on debugging of RCU list heads (call_rcu() usage).

config DEBUG_OBJECTS_PERCPU_COUNTER
	bool "Debug percpu counter objects"
	depends on DEBUG_OBJECTS
	help
	  If you say Y here, additional code will be inserted into the
	  percpu counter routines to track the life time of percpu counter
	  objects and validate the percpu counter operations.

config DEBUG_OBJECTS_ENABLE_DEFAULT
	int "debug_objects bootup default value (0-1)"
	range 0 1
	default "1"
	depends on DEBUG_OBJECTS
	help
	  Debug objects boot parameter default value

config DEBUG_SLAB
	bool "Debug slab memory allocations"
	depends on DEBUG_KERNEL && SLAB
	help
	  Say Y here to have the kernel do limited verification on memory
	  allocation as well as poisoning memory on free to catch use of freed
	  memory. This can make kmalloc/kfree-intensive workloads much slower.

config SLUB_DEBUG_ON
	bool "SLUB debugging on by default"
	depends on SLUB && SLUB_DEBUG
	default n
	help
	  Boot with debugging on by default. SLUB boots by default with
	  the runtime debug capabilities switched off. Enabling this is
	  equivalent to specifying the "slub_debug" parameter on boot.
	  There is no support for more fine grained debug control like
	  possible with slub_debug=xxx. SLUB debugging may be switched
	  off in a kernel built with CONFIG_SLUB_DEBUG_ON by specifying
	  "slub_debug=-".

config SLUB_STATS
	default n
	bool "Enable SLUB performance statistics"
	depends on SLUB && SYSFS
	help
	  SLUB statistics are useful to debug SLUBs allocation behavior in
	  order find ways to optimize the allocator. This should never be
	  enabled for production use since keeping statistics slows down
	  the allocator by a few percentage points. The slabinfo command
	  supports the determination of the most active slabs to figure
	  out which slabs are relevant to a particular load.
	  Try running: slabinfo -DA

config HAVE_DEBUG_KMEMLEAK
	bool

config DEBUG_KMEMLEAK
	bool "Kernel memory leak detector"
	depends on DEBUG_KERNEL && HAVE_DEBUG_KMEMLEAK
	select DEBUG_FS
	select STACKTRACE if STACKTRACE_SUPPORT
	select KALLSYMS
	select CRC32
	help
	  Say Y here if you want to enable the memory leak
	  detector. The memory allocation/freeing is traced in a way
	  similar to the Boehm's conservative garbage collector, the
	  difference being that the orphan objects are not freed but
	  only shown in /sys/kernel/debug/kmemleak. Enabling this
	  feature will introduce an overhead to memory
	  allocations. See Documentation/dev-tools/kmemleak.rst for more
	  details.

	  Enabling DEBUG_SLAB or SLUB_DEBUG may increase the chances
	  of finding leaks due to the slab objects poisoning.

	  In order to access the kmemleak file, debugfs needs to be
	  mounted (usually at /sys/kernel/debug).

config DEBUG_KMEMLEAK_MEM_POOL_SIZE
	int "Kmemleak memory pool size"
	depends on DEBUG_KMEMLEAK
	range 200 1000000
	default 16000
	help
	  Kmemleak must track all the memory allocations to avoid
	  reporting false positives. Since memory may be allocated or
	  freed before kmemleak is fully initialised, use a static pool
	  of metadata objects to track such callbacks. After kmemleak is
	  fully initialised, this memory pool acts as an emergency one
	  if slab allocations fail.

config DEBUG_KMEMLEAK_TEST
	tristate "Simple test for the kernel memory leak detector"
	depends on DEBUG_KMEMLEAK && m
	help
	  This option enables a module that explicitly leaks memory.

	  If unsure, say N.

config DEBUG_KMEMLEAK_DEFAULT_OFF
	bool "Default kmemleak to off"
	depends on DEBUG_KMEMLEAK
	help
	  Say Y here to disable kmemleak by default. It can then be enabled
	  on the command line via kmemleak=on.

config DEBUG_KMEMLEAK_AUTO_SCAN
	bool "Enable kmemleak auto scan thread on boot up"
	default y
	depends on DEBUG_KMEMLEAK
	help
	  Depending on the cpu, kmemleak scan may be cpu intensive and can
	  stall user tasks at times. This option enables/disables automatic
	  kmemleak scan at boot up.

	  Say N here to disable kmemleak auto scan thread to stop automatic
	  scanning. Disabling this option disables automatic reporting of
	  memory leaks.

	  If unsure, say Y.

config DEBUG_STACK_USAGE
	bool "Stack utilization instrumentation"
	depends on DEBUG_KERNEL && !IA64
	help
	  Enables the display of the minimum amount of free stack which each
	  task has ever had available in the sysrq-T and sysrq-P debug output.

	  This option will slow down process creation somewhat.

config SCHED_STACK_END_CHECK
	bool "Detect stack corruption on calls to schedule()"
	depends on DEBUG_KERNEL
	default n
	help
	  This option checks for a stack overrun on calls to schedule().
	  If the stack end location is found to be over written always panic as
	  the content of the corrupted region can no longer be trusted.
	  This is to ensure no erroneous behaviour occurs which could result in
	  data corruption or a sporadic crash at a later stage once the region
	  is examined. The runtime overhead introduced is minimal.

config ARCH_HAS_DEBUG_VM_PGTABLE
	bool
	help
	  An architecture should select this when it can successfully
	  build and run DEBUG_VM_PGTABLE.

config DEBUG_VM
	bool "Debug VM"
	depends on DEBUG_KERNEL
	help
	  Enable this to turn on extended checks in the virtual-memory system
	  that may impact performance.

	  If unsure, say N.

config DEBUG_VM_VMACACHE
	bool "Debug VMA caching"
	depends on DEBUG_VM
	help
	  Enable this to turn on VMA caching debug information. Doing so
	  can cause significant overhead, so only enable it in non-production
	  environments.

	  If unsure, say N.

config DEBUG_VM_RB
	bool "Debug VM red-black trees"
	depends on DEBUG_VM
	help
	  Enable VM red-black tree debugging information and extra validations.

	  If unsure, say N.

config DEBUG_VM_PGFLAGS
	bool "Debug page-flags operations"
	depends on DEBUG_VM
	help
	  Enables extra validation on page flags operations.

	  If unsure, say N.

config DEBUG_VM_PGTABLE
	bool "Debug arch page table for semantics compliance"
	depends on MMU
	depends on ARCH_HAS_DEBUG_VM_PGTABLE
	default y if DEBUG_VM
	help
	  This option provides a debug method which can be used to test
	  architecture page table helper functions on various platforms in
	  verifying if they comply with expected generic MM semantics. This
	  will help architecture code in making sure that any changes or
	  new additions of these helpers still conform to expected
	  semantics of the generic MM. Platforms will have to opt in for
	  this through ARCH_HAS_DEBUG_VM_PGTABLE.

	  If unsure, say N.

config ARCH_HAS_DEBUG_VIRTUAL
	bool

config DEBUG_VIRTUAL
	bool "Debug VM translations"
	depends on DEBUG_KERNEL && ARCH_HAS_DEBUG_VIRTUAL
	help
	  Enable some costly sanity checks in virtual to page code. This can
	  catch mistakes with virt_to_page() and friends.

	  If unsure, say N.

config DEBUG_NOMMU_REGIONS
	bool "Debug the global anon/private NOMMU mapping region tree"
	depends on DEBUG_KERNEL && !MMU
	help
	  This option causes the global tree of anonymous and private mapping
	  regions to be regularly checked for invalid topology.

config DEBUG_MEMORY_INIT
	bool "Debug memory initialisation" if EXPERT
	default !EXPERT
	help
	  Enable this for additional checks during memory initialisation.
	  The sanity checks verify aspects of the VM such as the memory model
	  and other information provided by the architecture. Verbose
	  information will be printed at KERN_DEBUG loglevel depending
	  on the mminit_loglevel= command-line option.

	  If unsure, say Y

config MEMORY_NOTIFIER_ERROR_INJECT
	tristate "Memory hotplug notifier error injection module"
	depends on MEMORY_HOTPLUG_SPARSE && NOTIFIER_ERROR_INJECTION
	help
	  This option provides the ability to inject artificial errors to
	  memory hotplug notifier chain callbacks.  It is controlled through
	  debugfs interface under /sys/kernel/debug/notifier-error-inject/memory

	  If the notifier call chain should be failed with some events
	  notified, write the error code to "actions/<notifier event>/error".

	  Example: Inject memory hotplug offline error (-12 == -ENOMEM)

	  # cd /sys/kernel/debug/notifier-error-inject/memory
	  # echo -12 > actions/MEM_GOING_OFFLINE/error
	  # echo offline > /sys/devices/system/memory/memoryXXX/state
	  bash: echo: write error: Cannot allocate memory

	  To compile this code as a module, choose M here: the module will
	  be called memory-notifier-error-inject.

	  If unsure, say N.

config DEBUG_PER_CPU_MAPS
	bool "Debug access to per_cpu maps"
	depends on DEBUG_KERNEL
	depends on SMP
	help
	  Say Y to verify that the per_cpu map being accessed has
	  been set up. This adds a fair amount of code to kernel memory
	  and decreases performance.

	  Say N if unsure.

config DEBUG_KMAP_LOCAL
	bool "Debug kmap_local temporary mappings"
	depends on DEBUG_KERNEL && KMAP_LOCAL
	help
	  This option enables additional error checking for the kmap_local
	  infrastructure.  Disable for production use.

config ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP
	bool

config DEBUG_KMAP_LOCAL_FORCE_MAP
	bool "Enforce kmap_local temporary mappings"
	depends on DEBUG_KERNEL && ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP
	select KMAP_LOCAL
	select DEBUG_KMAP_LOCAL
	help
	  This option enforces temporary mappings through the kmap_local
	  mechanism for non-highmem pages and on non-highmem systems.
	  Disable this for production systems!

config DEBUG_HIGHMEM
	bool "Highmem debugging"
	depends on DEBUG_KERNEL && HIGHMEM
	select DEBUG_KMAP_LOCAL_FORCE_MAP if ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP
	select DEBUG_KMAP_LOCAL
	help
	  This option enables additional error checking for high memory
	  systems.  Disable for production systems.

config HAVE_DEBUG_STACKOVERFLOW
	bool

config DEBUG_STACKOVERFLOW
	bool "Check for stack overflows"
	depends on DEBUG_KERNEL && HAVE_DEBUG_STACKOVERFLOW
	help
	  Say Y here if you want to check for overflows of kernel, IRQ
	  and exception stacks (if your architecture uses them). This
	  option will show detailed messages if free stack space drops
	  below a certain limit.

	  These kinds of bugs usually occur when call-chains in the
	  kernel get too deep, especially when interrupts are
	  involved.

	  Use this in cases where you see apparently random memory
	  corruption, especially if it appears in 'struct thread_info'

	  If in doubt, say "N".

source "lib/Kconfig.kasan"
source "lib/Kconfig.kfence"

endmenu # "Memory Debugging"

config DEBUG_SHIRQ
	bool "Debug shared IRQ handlers"
	depends on DEBUG_KERNEL
	help
	  Enable this to generate a spurious interrupt just before a shared
	  interrupt handler is deregistered (generating one when registering
	  is currently disabled). Drivers need to handle this correctly. Some
	  don't and need to be caught.

menu "Debug Oops, Lockups and Hangs"

config PANIC_ON_OOPS
	bool "Panic on Oops"
	help
	  Say Y here to enable the kernel to panic when it oopses. This
	  has the same effect as setting oops=panic on the kernel command
	  line.

	  This feature is useful to ensure that the kernel does not do
	  anything erroneous after an oops which could result in data
	  corruption or other issues.

	  Say N if unsure.

config PANIC_ON_OOPS_VALUE
	int
	range 0 1
	default 0 if !PANIC_ON_OOPS
	default 1 if PANIC_ON_OOPS

config PANIC_TIMEOUT
	int "panic timeout"
	default 0
	help
	  Set the timeout value (in seconds) until a reboot occurs when
	  the kernel panics. If n = 0, then we wait forever. A timeout
	  value n > 0 will wait n seconds before rebooting, while a timeout
	  value n < 0 will reboot immediately.

config LOCKUP_DETECTOR
	bool

config SOFTLOCKUP_DETECTOR
	bool "Detect Soft Lockups"
	depends on DEBUG_KERNEL && !S390
	select LOCKUP_DETECTOR
	help
	  Say Y here to enable the kernel to act as a watchdog to detect
	  soft lockups.

	  Softlockups are bugs that cause the kernel to loop in kernel
	  mode for more than 20 seconds, without giving other tasks a
	  chance to run.  The current stack trace is displayed upon
	  detection and the system will stay locked up.

config BOOTPARAM_SOFTLOCKUP_PANIC
	bool "Panic (Reboot) On Soft Lockups"
	depends on SOFTLOCKUP_DETECTOR
	help
	  Say Y here to enable the kernel to panic on "soft lockups",
	  which are bugs that cause the kernel to loop in kernel
	  mode for more than 20 seconds (configurable using the watchdog_thresh
	  sysctl), without giving other tasks a chance to run.

	  The panic can be used in combination with panic_timeout,
	  to cause the system to reboot automatically after a
	  lockup has been detected. This feature is useful for
	  high-availability systems that have uptime guarantees and
	  where a lockup must be resolved ASAP.

	  Say N if unsure.

config BOOTPARAM_SOFTLOCKUP_PANIC_VALUE
	int
	depends on SOFTLOCKUP_DETECTOR
	range 0 1
	default 0 if !BOOTPARAM_SOFTLOCKUP_PANIC
	default 1 if BOOTPARAM_SOFTLOCKUP_PANIC

config HARDLOCKUP_DETECTOR_PERF
	bool
	select SOFTLOCKUP_DETECTOR

#
# Enables a timestamp based low pass filter to compensate for perf based
# hard lockup detection which runs too fast due to turbo modes.
#
config HARDLOCKUP_CHECK_TIMESTAMP
	bool

#
# arch/ can define HAVE_HARDLOCKUP_DETECTOR_ARCH to provide their own hard
# lockup detector rather than the perf based detector.
#
config HARDLOCKUP_DETECTOR
	bool "Detect Hard Lockups"
	depends on DEBUG_KERNEL && !S390
	depends on HAVE_HARDLOCKUP_DETECTOR_PERF || HAVE_HARDLOCKUP_DETECTOR_ARCH
	select LOCKUP_DETECTOR
	select HARDLOCKUP_DETECTOR_PERF if HAVE_HARDLOCKUP_DETECTOR_PERF
	help
	  Say Y here to enable the kernel to act as a watchdog to detect
	  hard lockups.

	  Hardlockups are bugs that cause the CPU to loop in kernel mode
	  for more than 10 seconds, without letting other interrupts have a
	  chance to run.  The current stack trace is displayed upon detection
	  and the system will stay locked up.

config BOOTPARAM_HARDLOCKUP_PANIC
	bool "Panic (Reboot) On Hard Lockups"
	depends on HARDLOCKUP_DETECTOR
	help
	  Say Y here to enable the kernel to panic on "hard lockups",
	  which are bugs that cause the kernel to loop in kernel
	  mode with interrupts disabled for more than 10 seconds (configurable
	  using the watchdog_thresh sysctl).

	  Say N if unsure.

config BOOTPARAM_HARDLOCKUP_PANIC_VALUE
	int
	depends on HARDLOCKUP_DETECTOR
	range 0 1
	default 0 if !BOOTPARAM_HARDLOCKUP_PANIC
	default 1 if BOOTPARAM_HARDLOCKUP_PANIC

config DETECT_HUNG_TASK
	bool "Detect Hung Tasks"
	depends on DEBUG_KERNEL
	default SOFTLOCKUP_DETECTOR
	help
	  Say Y here to enable the kernel to detect "hung tasks",
	  which are bugs that cause the task to be stuck in
	  uninterruptible "D" state indefinitely.

	  When a hung task is detected, the kernel will print the
	  current stack trace (which you should report), but the
	  task will stay in uninterruptible state. If lockdep is
	  enabled then all held locks will also be reported. This
	  feature has negligible overhead.

config DEFAULT_HUNG_TASK_TIMEOUT
	int "Default timeout for hung task detection (in seconds)"
	depends on DETECT_HUNG_TASK
	default 120
	help
	  This option controls the default timeout (in seconds) used
	  to determine when a task has become non-responsive and should
	  be considered hung.

	  It can be adjusted at runtime via the kernel.hung_task_timeout_secs
	  sysctl or by writing a value to
	  /proc/sys/kernel/hung_task_timeout_secs.

	  A timeout of 0 disables the check.  The default is two minutes.
	  Keeping the default should be fine in most cases.

config BOOTPARAM_HUNG_TASK_PANIC
	bool "Panic (Reboot) On Hung Tasks"
	depends on DETECT_HUNG_TASK
	help
	  Say Y here to enable the kernel to panic on "hung tasks",
	  which are bugs that cause the kernel to leave a task stuck
	  in uninterruptible "D" state.

	  The panic can be used in combination with panic_timeout,
	  to cause the system to reboot automatically after a
	  hung task has been detected. This feature is useful for
	  high-availability systems that have uptime guarantees and
	  where a hung tasks must be resolved ASAP.

	  Say N if unsure.

config BOOTPARAM_HUNG_TASK_PANIC_VALUE
	int
	depends on DETECT_HUNG_TASK
	range 0 1
	default 0 if !BOOTPARAM_HUNG_TASK_PANIC
	default 1 if BOOTPARAM_HUNG_TASK_PANIC

config WQ_WATCHDOG
	bool "Detect Workqueue Stalls"
	depends on DEBUG_KERNEL
	help
	  Say Y here to enable stall detection on workqueues.  If a
	  worker pool doesn't make forward progress on a pending work
	  item for over a given amount of time, 30s by default, a
	  warning message is printed along with dump of workqueue
	  state.  This can be configured through kernel parameter
	  "workqueue.watchdog_thresh" and its sysfs counterpart.

config TEST_LOCKUP
	tristate "Test module to generate lockups"
	depends on m
	help
	  This builds the "test_lockup" module that helps to make sure
	  that watchdogs and lockup detectors are working properly.

	  Depending on module parameters it could emulate soft or hard
	  lockup, "hung task", or locking arbitrary lock for a long time.
	  Also it could generate series of lockups with cooling-down periods.

	  If unsure, say N.

endmenu # "Debug lockups and hangs"

menu "Scheduler Debugging"

config SCHED_DEBUG
	bool "Collect scheduler debugging info"
	depends on DEBUG_KERNEL && PROC_FS
	default y
	help
	  If you say Y here, the /proc/sched_debug file will be provided
	  that can help debug the scheduler. The runtime overhead of this
	  option is minimal.

config SCHED_INFO
	bool
	default n

config SCHEDSTATS
	bool "Collect scheduler statistics"
	depends on DEBUG_KERNEL && PROC_FS
	select SCHED_INFO
	help
	  If you say Y here, additional code will be inserted into the
	  scheduler and related routines to collect statistics about
	  scheduler behavior and provide them in /proc/schedstat.  These
	  stats may be useful for both tuning and debugging the scheduler
	  If you aren't debugging the scheduler or trying to tune a specific
	  application, you can say N to avoid the very slight overhead
	  this adds.

endmenu

config DEBUG_TIMEKEEPING
	bool "Enable extra timekeeping sanity checking"
	help
	  This option will enable additional timekeeping sanity checks
	  which may be helpful when diagnosing issues where timekeeping
	  problems are suspected.

	  This may include checks in the timekeeping hotpaths, so this
	  option may have a (very small) performance impact to some
	  workloads.

	  If unsure, say N.

config DEBUG_PREEMPT
	bool "Debug preemptible kernel"
	depends on DEBUG_KERNEL && PREEMPTION && TRACE_IRQFLAGS_SUPPORT
	default y
	help
	  If you say Y here then the kernel will use a debug variant of the
	  commonly used smp_processor_id() function and will print warnings
	  if kernel code uses it in a preemption-unsafe way. Also, the kernel
	  will detect preemption count underflows.

menu "Lock Debugging (spinlocks, mutexes, etc...)"

config LOCK_DEBUGGING_SUPPORT
	bool
	depends on TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT
	default y

config PROVE_LOCKING
	bool "Lock debugging: prove locking correctness"
	depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
	select LOCKDEP
	select DEBUG_SPINLOCK
	select DEBUG_MUTEXES if !PREEMPT_RT
	select DEBUG_RT_MUTEXES if RT_MUTEXES
	select DEBUG_RWSEMS
	select DEBUG_WW_MUTEX_SLOWPATH
	select DEBUG_LOCK_ALLOC
	select PREEMPT_COUNT if !ARCH_NO_PREEMPT
	select TRACE_IRQFLAGS
	default n
	help
	 This feature enables the kernel to prove that all locking
	 that occurs in the kernel runtime is mathematically
	 correct: that under no circumstance could an arbitrary (and
	 not yet triggered) combination of observed locking
	 sequences (on an arbitrary number of CPUs, running an
	 arbitrary number of tasks and interrupt contexts) cause a
	 deadlock.

	 In short, this feature enables the kernel to report locking
	 related deadlocks before they actually occur.

	 The proof does not depend on how hard and complex a
	 deadlock scenario would be to trigger: how many
	 participant CPUs, tasks and irq-contexts would be needed
	 for it to trigger. The proof also does not depend on
	 timing: if a race and a resulting deadlock is possible
	 theoretically (no matter how unlikely the race scenario
	 is), it will be proven so and will immediately be
	 reported by the kernel (once the event is observed that
	 makes the deadlock theoretically possible).

	 If a deadlock is impossible (i.e. the locking rules, as
	 observed by the kernel, are mathematically correct), the
	 kernel reports nothing.

	 NOTE: this feature can also be enabled for rwlocks, mutexes
	 and rwsems - in which case all dependencies between these
	 different locking variants are observed and mapped too, and
	 the proof of observed correctness is also maintained for an
	 arbitrary combination of these separate locking variants.

	 For more details, see Documentation/locking/lockdep-design.rst.

config PROVE_RAW_LOCK_NESTING
	bool "Enable raw_spinlock - spinlock nesting checks"
	depends on PROVE_LOCKING
	default n
	help
	 Enable the raw_spinlock vs. spinlock nesting checks which ensure
	 that the lock nesting rules for PREEMPT_RT enabled kernels are
	 not violated.

	 NOTE: There are known nesting problems. So if you enable this
	 option expect lockdep splats until these problems have been fully
	 addressed which is work in progress. This config switch allows to
	 identify and analyze these problems. It will be removed and the
	 check permanently enabled once the main issues have been fixed.

	 If unsure, select N.

config LOCK_STAT
	bool "Lock usage statistics"
	depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
	select LOCKDEP
	select DEBUG_SPINLOCK
	select DEBUG_MUTEXES if !PREEMPT_RT
	select DEBUG_RT_MUTEXES if RT_MUTEXES
	select DEBUG_LOCK_ALLOC
	default n
	help
	 This feature enables tracking lock contention points

	 For more details, see Documentation/locking/lockstat.rst

	 This also enables lock events required by "perf lock",
	 subcommand of perf.
	 If you want to use "perf lock", you also need to turn on
	 CONFIG_EVENT_TRACING.

	 CONFIG_LOCK_STAT defines "contended" and "acquired" lock events.
	 (CONFIG_LOCKDEP defines "acquire" and "release" events.)

config DEBUG_RT_MUTEXES
	bool "RT Mutex debugging, deadlock detection"
	depends on DEBUG_KERNEL && RT_MUTEXES
	help
	 This allows rt mutex semantics violations and rt mutex related
	 deadlocks (lockups) to be detected and reported automatically.

config DEBUG_SPINLOCK
	bool "Spinlock and rw-lock debugging: basic checks"
	depends on DEBUG_KERNEL
	select UNINLINE_SPIN_UNLOCK
	help
	  Say Y here and build SMP to catch missing spinlock initialization
	  and certain other kinds of spinlock errors commonly made.  This is
	  best used in conjunction with the NMI watchdog so that spinlock
	  deadlocks are also debuggable.

config DEBUG_MUTEXES
	bool "Mutex debugging: basic checks"
	depends on DEBUG_KERNEL && !PREEMPT_RT
	help
	 This feature allows mutex semantics violations to be detected and
	 reported.

config DEBUG_WW_MUTEX_SLOWPATH
	bool "Wait/wound mutex debugging: Slowpath testing"
	depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
	select DEBUG_LOCK_ALLOC
	select DEBUG_SPINLOCK
	select DEBUG_MUTEXES if !PREEMPT_RT
	select DEBUG_RT_MUTEXES if PREEMPT_RT
	help
	 This feature enables slowpath testing for w/w mutex users by
	 injecting additional -EDEADLK wound/backoff cases. Together with
	 the full mutex checks enabled with (CONFIG_PROVE_LOCKING) this
	 will test all possible w/w mutex interface abuse with the
	 exception of simply not acquiring all the required locks.
	 Note that this feature can introduce significant overhead, so
	 it really should not be enabled in a production or distro kernel,
	 even a debug kernel.  If you are a driver writer, enable it.  If
	 you are a distro, do not.

config DEBUG_RWSEMS
	bool "RW Semaphore debugging: basic checks"
	depends on DEBUG_KERNEL
	help
	  This debugging feature allows mismatched rw semaphore locks
	  and unlocks to be detected and reported.

config DEBUG_LOCK_ALLOC
	bool "Lock debugging: detect incorrect freeing of live locks"
	depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
	select DEBUG_SPINLOCK
	select DEBUG_MUTEXES if !PREEMPT_RT
	select DEBUG_RT_MUTEXES if RT_MUTEXES
	select LOCKDEP
	help
	 This feature will check whether any held lock (spinlock, rwlock,
	 mutex or rwsem) is incorrectly freed by the kernel, via any of the
	 memory-freeing routines (kfree(), kmem_cache_free(), free_pages(),
	 vfree(), etc.), whether a live lock is incorrectly reinitialized via
	 spin_lock_init()/mutex_init()/etc., or whether there is any lock
	 held during task exit.

config LOCKDEP
	bool
	depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
	select STACKTRACE
	select KALLSYMS
	select KALLSYMS_ALL

config LOCKDEP_SMALL
	bool

config LOCKDEP_BITS
	int "Bitsize for MAX_LOCKDEP_ENTRIES"
	depends on LOCKDEP && !LOCKDEP_SMALL
	range 10 30
	default 15
	help
	  Try increasing this value if you hit "BUG: MAX_LOCKDEP_ENTRIES too low!" message.

config LOCKDEP_CHAINS_BITS
	int "Bitsize for MAX_LOCKDEP_CHAINS"
	depends on LOCKDEP && !LOCKDEP_SMALL
	range 10 30
	default 16
	help
	  Try increasing this value if you hit "BUG: MAX_LOCKDEP_CHAINS too low!" message.

config LOCKDEP_STACK_TRACE_BITS
	int "Bitsize for MAX_STACK_TRACE_ENTRIES"
	depends on LOCKDEP && !LOCKDEP_SMALL
	range 10 30
	default 19
	help
	  Try increasing this value if you hit "BUG: MAX_STACK_TRACE_ENTRIES too low!" message.

config LOCKDEP_STACK_TRACE_HASH_BITS
	int "Bitsize for STACK_TRACE_HASH_SIZE"
	depends on LOCKDEP && !LOCKDEP_SMALL
	range 10 30
	default 14
	help
	  Try increasing this value if you need large MAX_STACK_TRACE_ENTRIES.

config LOCKDEP_CIRCULAR_QUEUE_BITS
	int "Bitsize for elements in circular_queue struct"
	depends on LOCKDEP
	range 10 30
	default 12
	help
	  Try increasing this value if you hit "lockdep bfs error:-1" warning due to __cq_enqueue() failure.

config DEBUG_LOCKDEP
	bool "Lock dependency engine debugging"
	depends on DEBUG_KERNEL && LOCKDEP
	select DEBUG_IRQFLAGS
	help
	  If you say Y here, the lock dependency engine will do
	  additional runtime checks to debug itself, at the price
	  of more runtime overhead.

config DEBUG_ATOMIC_SLEEP
	bool "Sleep inside atomic section checking"
	select PREEMPT_COUNT
	depends on DEBUG_KERNEL
	depends on !ARCH_NO_PREEMPT
	help
	  If you say Y here, various routines which may sleep will become very
	  noisy if they are called inside atomic sections: when a spinlock is
	  held, inside an rcu read side critical section, inside preempt disabled
	  sections, inside an interrupt, etc...

config DEBUG_LOCKING_API_SELFTESTS
	bool "Locking API boot-time self-tests"
	depends on DEBUG_KERNEL
	help
	  Say Y here if you want the kernel to run a short self-test during
	  bootup. The self-test checks whether common types of locking bugs
	  are detected by debugging mechanisms or not. (if you disable
	  lock debugging then those bugs won't be detected of course.)
	  The following locking APIs are covered: spinlocks, rwlocks,
	  mutexes and rwsems.

config LOCK_TORTURE_TEST
	tristate "torture tests for locking"
	depends on DEBUG_KERNEL
	select TORTURE_TEST
	help
	  This option provides a kernel module that runs torture tests
	  on kernel locking primitives.  The kernel module may be built
	  after the fact on the running kernel to be tested, if desired.

	  Say Y here if you want kernel locking-primitive torture tests
	  to be built into the kernel.
	  Say M if you want these torture tests to build as a module.
	  Say N if you are unsure.

config WW_MUTEX_SELFTEST
	tristate "Wait/wound mutex selftests"
	help
	  This option provides a kernel module that runs tests on the
	  on the struct ww_mutex locking API.

	  It is recommended to enable DEBUG_WW_MUTEX_SLOWPATH in conjunction
	  with this test harness.

	  Say M if you want these self tests to build as a module.
	  Say N if you are unsure.

config SCF_TORTURE_TEST
	tristate "torture tests for smp_call_function*()"
	depends on DEBUG_KERNEL
	select TORTURE_TEST
	help
	  This option provides a kernel module that runs torture tests
	  on the smp_call_function() family of primitives.  The kernel
	  module may be built after the fact on the running kernel to
	  be tested, if desired.

config CSD_LOCK_WAIT_DEBUG
	bool "Debugging for csd_lock_wait(), called from smp_call_function*()"
	depends on DEBUG_KERNEL
	depends on 64BIT
	default n
	help
	  This option enables debug prints when CPUs are slow to respond
	  to the smp_call_function*() IPI wrappers.  These debug prints
	  include the IPI handler function currently executing (if any)
	  and relevant stack traces.

endmenu # lock debugging

config TRACE_IRQFLAGS
	depends on TRACE_IRQFLAGS_SUPPORT
	bool
	help
	  Enables hooks to interrupt enabling and disabling for
	  either tracing or lock debugging.

config TRACE_IRQFLAGS_NMI
	def_bool y
	depends on TRACE_IRQFLAGS
	depends on TRACE_IRQFLAGS_NMI_SUPPORT

config DEBUG_IRQFLAGS
	bool "Debug IRQ flag manipulation"
	help
	  Enables checks for potentially unsafe enabling or disabling of
	  interrupts, such as calling raw_local_irq_restore() when interrupts
	  are enabled.

config STACKTRACE
	bool "Stack backtrace support"
	depends on STACKTRACE_SUPPORT
	help
	  This option causes the kernel to create a /proc/pid/stack for
	  every process, showing its current stack trace.
	  It is also used by various kernel debugging features that require
	  stack trace generation.

config WARN_ALL_UNSEEDED_RANDOM
	bool "Warn for all uses of unseeded randomness"
	default n
	help
	  Some parts of the kernel contain bugs relating to their use of
	  cryptographically secure random numbers before it's actually possible
	  to generate those numbers securely. This setting ensures that these
	  flaws don't go unnoticed, by enabling a message, should this ever
	  occur. This will allow people with obscure setups to know when things
	  are going wrong, so that they might contact developers about fixing
	  it.

	  Unfortunately, on some models of some architectures getting
	  a fully seeded CRNG is extremely difficult, and so this can
	  result in dmesg getting spammed for a surprisingly long
	  time.  This is really bad from a security perspective, and
	  so architecture maintainers really need to do what they can
	  to get the CRNG seeded sooner after the system is booted.
	  However, since users cannot do anything actionable to
	  address this, by default the kernel will issue only a single
	  warning for the first use of unseeded randomness.

	  Say Y here if you want to receive warnings for all uses of
	  unseeded randomness.  This will be of use primarily for
	  those developers interested in improving the security of
	  Linux kernels running on their architecture (or
	  subarchitecture).

config DEBUG_KOBJECT
	bool "kobject debugging"
	depends on DEBUG_KERNEL
	help
	  If you say Y here, some extra kobject debugging messages will be sent
	  to the syslog.

config DEBUG_KOBJECT_RELEASE
	bool "kobject release debugging"
	depends on DEBUG_OBJECTS_TIMERS
	help
	  kobjects are reference counted objects.  This means that their
	  last reference count put is not predictable, and the kobject can
	  live on past the point at which a driver decides to drop it's
	  initial reference to the kobject gained on allocation.  An
	  example of this would be a struct device which has just been
	  unregistered.

	  However, some buggy drivers assume that after such an operation,
	  the memory backing the kobject can be immediately freed.  This
	  goes completely against the principles of a refcounted object.

	  If you say Y here, the kernel will delay the release of kobjects
	  on the last reference count to improve the visibility of this
	  kind of kobject release bug.

config HAVE_DEBUG_BUGVERBOSE
	bool

menu "Debug kernel data structures"

config DEBUG_LIST
	bool "Debug linked list manipulation"
	depends on DEBUG_KERNEL || BUG_ON_DATA_CORRUPTION
	help
	  Enable this to turn on extended checks in the linked-list
	  walking routines.

	  If unsure, say N.

config DEBUG_PLIST
	bool "Debug priority linked list manipulation"
	depends on DEBUG_KERNEL
	help
	  Enable this to turn on extended checks in the priority-ordered
	  linked-list (plist) walking routines.  This checks the entire
	  list multiple times during each manipulation.

	  If unsure, say N.

config DEBUG_SG
	bool "Debug SG table operations"
	depends on DEBUG_KERNEL
	help
	  Enable this to turn on checks on scatter-gather tables. This can
	  help find problems with drivers that do not properly initialize
	  their sg tables.

	  If unsure, say N.

config DEBUG_NOTIFIERS
	bool "Debug notifier call chains"
	depends on DEBUG_KERNEL
	help
	  Enable this to turn on sanity checking for notifier call chains.
	  This is most useful for kernel developers to make sure that
	  modules properly unregister themselves from notifier chains.
	  This is a relatively cheap check but if you care about maximum
	  performance, say N.

config BUG_ON_DATA_CORRUPTION
	bool "Trigger a BUG when data corruption is detected"
	select DEBUG_LIST
	help
	  Select this option if the kernel should BUG when it encounters
	  data corruption in kernel memory structures when they get checked
	  for validity.

	  If unsure, say N.

endmenu

config DEBUG_CREDENTIALS
	bool "Debug credential management"
	depends on DEBUG_KERNEL
	help
	  Enable this to turn on some debug checking for credential
	  management.  The additional code keeps track of the number of
	  pointers from task_structs to any given cred struct, and checks to
	  see that this number never exceeds the usage count of the cred
	  struct.

	  Furthermore, if SELinux is enabled, this also checks that the
	  security pointer in the cred struct is never seen to be invalid.

	  If unsure, say N.

source "kernel/rcu/Kconfig.debug"

config DEBUG_WQ_FORCE_RR_CPU
	bool "Force round-robin CPU selection for unbound work items"
	depends on DEBUG_KERNEL
	default n
	help
	  Workqueue used to implicitly guarantee that work items queued
	  without explicit CPU specified are put on the local CPU.  This
	  guarantee is no longer true and while local CPU is still
	  preferred work items may be put on foreign CPUs.  Kernel
	  parameter "workqueue.debug_force_rr_cpu" is added to force
	  round-robin CPU selection to flush out usages which depend on the
	  now broken guarantee.  This config option enables the debug
	  feature by default.  When enabled, memory and cache locality will
	  be impacted.

config CPU_HOTPLUG_STATE_CONTROL
	bool "Enable CPU hotplug state control"
	depends on DEBUG_KERNEL
	depends on HOTPLUG_CPU
	default n
	help
	  Allows to write steps between "offline" and "online" to the CPUs
	  sysfs target file so states can be stepped granular. This is a debug
	  option for now as the hotplug machinery cannot be stopped and
	  restarted at arbitrary points yet.

	  Say N if your are unsure.

config LATENCYTOP
	bool "Latency measuring infrastructure"
	depends on DEBUG_KERNEL
	depends on STACKTRACE_SUPPORT
	depends on PROC_FS
	depends on FRAME_POINTER || MIPS || PPC || S390 || MICROBLAZE || ARM || ARC || X86
	select KALLSYMS
	select KALLSYMS_ALL
	select STACKTRACE
	select SCHEDSTATS
	help
	  Enable this option if you want to use the LatencyTOP tool
	  to find out which userspace is blocking on what kernel operations.

source "kernel/trace/Kconfig"

config PROVIDE_OHCI1394_DMA_INIT
	bool "Remote debugging over FireWire early on boot"
	depends on PCI && X86
	help
	  If you want to debug problems which hang or crash the kernel early
	  on boot and the crashing machine has a FireWire port, you can use
	  this feature to remotely access the memory of the crashed machine
	  over FireWire. This employs remote DMA as part of the OHCI1394
	  specification which is now the standard for FireWire controllers.

	  With remote DMA, you can monitor the printk buffer remotely using
	  firescope and access all memory below 4GB using fireproxy from gdb.
	  Even controlling a kernel debugger is possible using remote DMA.

	  Usage:

	  If ohci1394_dma=early is used as boot parameter, it will initialize
	  all OHCI1394 controllers which are found in the PCI config space.

	  As all changes to the FireWire bus such as enabling and disabling
	  devices cause a bus reset and thereby disable remote DMA for all
	  devices, be sure to have the cable plugged and FireWire enabled on
	  the debugging host before booting the debug target for debugging.

	  This code (~1k) is freed after boot. By then, the firewire stack
	  in charge of the OHCI-1394 controllers should be used instead.

	  See Documentation/core-api/debugging-via-ohci1394.rst for more information.

source "samples/Kconfig"

config ARCH_HAS_DEVMEM_IS_ALLOWED
	bool

config STRICT_DEVMEM
	bool "Filter access to /dev/mem"
	depends on MMU && DEVMEM
	depends on ARCH_HAS_DEVMEM_IS_ALLOWED || GENERIC_LIB_DEVMEM_IS_ALLOWED
	default y if PPC || X86 || ARM64
	help
	  If this option is disabled, you allow userspace (root) access to all
	  of memory, including kernel and userspace memory. Accidental
	  access to this is obviously disastrous, but specific access can
	  be used by people debugging the kernel. Note that with PAT support
	  enabled, even in this case there are restrictions on /dev/mem
	  use due to the cache aliasing requirements.

	  If this option is switched on, and IO_STRICT_DEVMEM=n, the /dev/mem
	  file only allows userspace access to PCI space and the BIOS code and
	  data regions.  This is sufficient for dosemu and X and all common
	  users of /dev/mem.

	  If in doubt, say Y.

config IO_STRICT_DEVMEM
	bool "Filter I/O access to /dev/mem"
	depends on STRICT_DEVMEM
	help
	  If this option is disabled, you allow userspace (root) access to all
	  io-memory regardless of whether a driver is actively using that
	  range.  Accidental access to this is obviously disastrous, but
	  specific access can be used by people debugging kernel drivers.

	  If this option is switched on, the /dev/mem file only allows
	  userspace access to *idle* io-memory ranges (see /proc/iomem) This
	  may break traditional users of /dev/mem (dosemu, legacy X, etc...)
	  if the driver using a given range cannot be disabled.

	  If in doubt, say Y.

menu "$(SRCARCH) Debugging"

source "arch/$(SRCARCH)/Kconfig.debug"

endmenu

menu "Kernel Testing and Coverage"

source "lib/kunit/Kconfig"

config NOTIFIER_ERROR_INJECTION
	tristate "Notifier error injection"
	depends on DEBUG_KERNEL
	select DEBUG_FS
	help
	  This option provides the ability to inject artificial errors to
	  specified notifier chain callbacks. It is useful to test the error
	  handling of notifier call chain failures.

	  Say N if unsure.

config PM_NOTIFIER_ERROR_INJECT
	tristate "PM notifier error injection module"
	depends on PM && NOTIFIER_ERROR_INJECTION
	default m if PM_DEBUG
	help
	  This option provides the ability to inject artificial errors to
	  PM notifier chain callbacks.  It is controlled through debugfs
	  interface /sys/kernel/debug/notifier-error-inject/pm

	  If the notifier call chain should be failed with some events
	  notified, write the error code to "actions/<notifier event>/error".

	  Example: Inject PM suspend error (-12 = -ENOMEM)

	  # cd /sys/kernel/debug/notifier-error-inject/pm/
	  # echo -12 > actions/PM_SUSPEND_PREPARE/error
	  # echo mem > /sys/power/state
	  bash: echo: write error: Cannot allocate memory

	  To compile this code as a module, choose M here: the module will
	  be called pm-notifier-error-inject.

	  If unsure, say N.

config OF_RECONFIG_NOTIFIER_ERROR_INJECT
	tristate "OF reconfig notifier error injection module"
	depends on OF_DYNAMIC && NOTIFIER_ERROR_INJECTION
	help
	  This option provides the ability to inject artificial errors to
	  OF reconfig notifier chain callbacks.  It is controlled
	  through debugfs interface under
	  /sys/kernel/debug/notifier-error-inject/OF-reconfig/

	  If the notifier call chain should be failed with some events
	  notified, write the error code to "actions/<notifier event>/error".

	  To compile this code as a module, choose M here: the module will
	  be called of-reconfig-notifier-error-inject.

	  If unsure, say N.

config NETDEV_NOTIFIER_ERROR_INJECT
	tristate "Netdev notifier error injection module"
	depends on NET && NOTIFIER_ERROR_INJECTION
	help
	  This option provides the ability to inject artificial errors to
	  netdevice notifier chain callbacks.  It is controlled through debugfs
	  interface /sys/kernel/debug/notifier-error-inject/netdev

	  If the notifier call chain should be failed with some events
	  notified, write the error code to "actions/<notifier event>/error".

	  Example: Inject netdevice mtu change error (-22 = -EINVAL)

	  # cd /sys/kernel/debug/notifier-error-inject/netdev
	  # echo -22 > actions/NETDEV_CHANGEMTU/error
	  # ip link set eth0 mtu 1024
	  RTNETLINK answers: Invalid argument

	  To compile this code as a module, choose M here: the module will
	  be called netdev-notifier-error-inject.

	  If unsure, say N.

config FUNCTION_ERROR_INJECTION
	def_bool y
	depends on HAVE_FUNCTION_ERROR_INJECTION && KPROBES

config FAULT_INJECTION
	bool "Fault-injection framework"
	depends on DEBUG_KERNEL
	help
	  Provide fault-injection framework.
	  For more details, see Documentation/fault-injection/.

config FAILSLAB
	bool "Fault-injection capability for kmalloc"
	depends on FAULT_INJECTION
	depends on SLAB || SLUB
	help
	  Provide fault-injection capability for kmalloc.

config FAIL_PAGE_ALLOC
	bool "Fault-injection capability for alloc_pages()"
	depends on FAULT_INJECTION
	help
	  Provide fault-injection capability for alloc_pages().

config FAULT_INJECTION_USERCOPY
	bool "Fault injection capability for usercopy functions"
	depends on FAULT_INJECTION
	help
	  Provides fault-injection capability to inject failures
	  in usercopy functions (copy_from_user(), get_user(), ...).

config FAIL_MAKE_REQUEST
	bool "Fault-injection capability for disk IO"
	depends on FAULT_INJECTION && BLOCK
	help
	  Provide fault-injection capability for disk IO.

config FAIL_IO_TIMEOUT
	bool "Fault-injection capability for faking disk interrupts"
	depends on FAULT_INJECTION && BLOCK
	help
	  Provide fault-injection capability on end IO handling. This
	  will make the block layer "forget" an interrupt as configured,
	  thus exercising the error handling.

	  Only works with drivers that use the generic timeout handling,
	  for others it won't do anything.

config FAIL_FUTEX
	bool "Fault-injection capability for futexes"
	select DEBUG_FS
	depends on FAULT_INJECTION && FUTEX
	help
	  Provide fault-injection capability for futexes.

config FAULT_INJECTION_DEBUG_FS
	bool "Debugfs entries for fault-injection capabilities"
	depends on FAULT_INJECTION && SYSFS && DEBUG_FS
	help
	  Enable configuration of fault-injection capabilities via debugfs.

config FAIL_FUNCTION
	bool "Fault-injection capability for functions"
	depends on FAULT_INJECTION_DEBUG_FS && FUNCTION_ERROR_INJECTION
	help
	  Provide function-based fault-injection capability.
	  This will allow you to override a specific function with a return
	  with given return value. As a result, function caller will see
	  an error value and have to handle it. This is useful to test the
	  error handling in various subsystems.

config FAIL_MMC_REQUEST
	bool "Fault-injection capability for MMC IO"
	depends on FAULT_INJECTION_DEBUG_FS && MMC
	help
	  Provide fault-injection capability for MMC IO.
	  This will make the mmc core return data errors. This is
	  useful to test the error handling in the mmc block device
	  and to test how the mmc host driver handles retries from
	  the block device.

config FAIL_SUNRPC
	bool "Fault-injection capability for SunRPC"
	depends on FAULT_INJECTION_DEBUG_FS && SUNRPC_DEBUG
	help
	  Provide fault-injection capability for SunRPC and
	  its consumers.

config FAULT_INJECTION_STACKTRACE_FILTER
	bool "stacktrace filter for fault-injection capabilities"
	depends on FAULT_INJECTION_DEBUG_FS && STACKTRACE_SUPPORT
	depends on !X86_64
	select STACKTRACE
	depends on FRAME_POINTER || MIPS || PPC || S390 || MICROBLAZE || ARM || ARC || X86
	help
	  Provide stacktrace filter for fault-injection capabilities

config ARCH_HAS_KCOV
	bool
	help
	  An architecture should select this when it can successfully
	  build and run with CONFIG_KCOV. This typically requires
	  disabling instrumentation for some early boot code.

config CC_HAS_SANCOV_TRACE_PC
	def_bool $(cc-option,-fsanitize-coverage=trace-pc)


config KCOV
	bool "Code coverage for fuzzing"
	depends on ARCH_HAS_KCOV
	depends on CC_HAS_SANCOV_TRACE_PC || GCC_PLUGINS
	select DEBUG_FS
	select GCC_PLUGIN_SANCOV if !CC_HAS_SANCOV_TRACE_PC
	help
	  KCOV exposes kernel code coverage information in a form suitable
	  for coverage-guided fuzzing (randomized testing).

	  If RANDOMIZE_BASE is enabled, PC values will not be stable across
	  different machines and across reboots. If you need stable PC values,
	  disable RANDOMIZE_BASE.

	  For more details, see Documentation/dev-tools/kcov.rst.

config KCOV_ENABLE_COMPARISONS
	bool "Enable comparison operands collection by KCOV"
	depends on KCOV
	depends on $(cc-option,-fsanitize-coverage=trace-cmp)
	help
	  KCOV also exposes operands of every comparison in the instrumented
	  code along with operand sizes and PCs of the comparison instructions.
	  These operands can be used by fuzzing engines to improve the quality
	  of fuzzing coverage.

config KCOV_INSTRUMENT_ALL
	bool "Instrument all code by default"
	depends on KCOV
	default y
	help
	  If you are doing generic system call fuzzing (like e.g. syzkaller),
	  then you will want to instrument the whole kernel and you should
	  say y here. If you are doing more targeted fuzzing (like e.g.
	  filesystem fuzzing with AFL) then you will want to enable coverage
	  for more specific subsets of files, and should say n here.

config KCOV_IRQ_AREA_SIZE
	hex "Size of interrupt coverage collection area in words"
	depends on KCOV
	default 0x40000
	help
	  KCOV uses preallocated per-cpu areas to collect coverage from
	  soft interrupts. This specifies the size of those areas in the
	  number of unsigned long words.

menuconfig RUNTIME_TESTING_MENU
	bool "Runtime Testing"
	def_bool y

if RUNTIME_TESTING_MENU

config LKDTM
	tristate "Linux Kernel Dump Test Tool Module"
	depends on DEBUG_FS
	help
	This module enables testing of the different dumping mechanisms by
	inducing system failures at predefined crash points.
	If you don't need it: say N
	Choose M here to compile this code as a module. The module will be
	called lkdtm.

	Documentation on how to use the module can be found in
	Documentation/fault-injection/provoke-crashes.rst

config TEST_LIST_SORT
	tristate "Linked list sorting test" if !KUNIT_ALL_TESTS
	depends on KUNIT
	default KUNIT_ALL_TESTS
	help
	  Enable this to turn on 'list_sort()' function test. This test is
	  executed only once during system boot (so affects only boot time),
	  or at module load time.

	  If unsure, say N.

config TEST_MIN_HEAP
	tristate "Min heap test"
	depends on DEBUG_KERNEL || m
	help
	  Enable this to turn on min heap function tests. This test is
	  executed only once during system boot (so affects only boot time),
	  or at module load time.

	  If unsure, say N.

config TEST_SORT
	tristate "Array-based sort test" if !KUNIT_ALL_TESTS
	depends on KUNIT
	default KUNIT_ALL_TESTS
	help
	  This option enables the self-test function of 'sort()' at boot,
	  or at module load time.

	  If unsure, say N.

config TEST_DIV64
	tristate "64bit/32bit division and modulo test"
	depends on DEBUG_KERNEL || m
	help
	  Enable this to turn on 'do_div()' function test. This test is
	  executed only once during system boot (so affects only boot time),
	  or at module load time.

	  If unsure, say N.

config KPROBES_SANITY_TEST
	bool "Kprobes sanity tests"
	depends on DEBUG_KERNEL
	depends on KPROBES
	help
	  This option provides for testing basic kprobes functionality on
	  boot. Samples of kprobe and kretprobe are inserted and
	  verified for functionality.

	  Say N if you are unsure.

config BACKTRACE_SELF_TEST
	tristate "Self test for the backtrace code"
	depends on DEBUG_KERNEL
	help
	  This option provides a kernel module that can be used to test
	  the kernel stack backtrace code. This option is not useful
	  for distributions or general kernels, but only for kernel
	  developers working on architecture code.

	  Note that if you want to also test saved backtraces, you will
	  have to enable STACKTRACE as well.

	  Say N if you are unsure.

config RBTREE_TEST
	tristate "Red-Black tree test"
	depends on DEBUG_KERNEL
	help
	  A benchmark measuring the performance of the rbtree library.
	  Also includes rbtree invariant checks.

config REED_SOLOMON_TEST
	tristate "Reed-Solomon library test"
	depends on DEBUG_KERNEL || m
	select REED_SOLOMON
	select REED_SOLOMON_ENC16
	select REED_SOLOMON_DEC16
	help
	  This option enables the self-test function of rslib at boot,
	  or at module load time.

	  If unsure, say N.

config INTERVAL_TREE_TEST
	tristate "Interval tree test"
	depends on DEBUG_KERNEL
	select INTERVAL_TREE
	help
	  A benchmark measuring the performance of the interval tree library

config PERCPU_TEST
	tristate "Per cpu operations test"
	depends on m && DEBUG_KERNEL
	help
	  Enable this option to build test module which validates per-cpu
	  operations.

	  If unsure, say N.

config ATOMIC64_SELFTEST
	tristate "Perform an atomic64_t self-test"
	help
	  Enable this option to test the atomic64_t functions at boot or
	  at module load time.

	  If unsure, say N.

config ASYNC_RAID6_TEST
	tristate "Self test for hardware accelerated raid6 recovery"
	depends on ASYNC_RAID6_RECOV
	select ASYNC_MEMCPY
	help
	  This is a one-shot self test that permutes through the
	  recovery of all the possible two disk failure scenarios for a
	  N-disk array.  Recovery is performed with the asynchronous
	  raid6 recovery routines, and will optionally use an offload
	  engine if one is available.

	  If unsure, say N.

config TEST_HEXDUMP
	tristate "Test functions located in the hexdump module at runtime"

config STRING_SELFTEST
	tristate "Test string functions at runtime"

config TEST_STRING_HELPERS
	tristate "Test functions located in the string_helpers module at runtime"

config TEST_STRSCPY
	tristate "Test strscpy*() family of functions at runtime"

config TEST_KSTRTOX
	tristate "Test kstrto*() family of functions at runtime"

config TEST_PRINTF
	tristate "Test printf() family of functions at runtime"

config TEST_SCANF
	tristate "Test scanf() family of functions at runtime"

config TEST_BITMAP
	tristate "Test bitmap_*() family of functions at runtime"
	help
	  Enable this option to test the bitmap functions at boot.

	  If unsure, say N.

config TEST_UUID
	tristate "Test functions located in the uuid module at runtime"

config TEST_XARRAY
	tristate "Test the XArray code at runtime"

config TEST_OVERFLOW
	tristate "Test check_*_overflow() functions at runtime"

config TEST_RHASHTABLE
	tristate "Perform selftest on resizable hash table"
	help
	  Enable this option to test the rhashtable functions at boot.

	  If unsure, say N.

config TEST_HASH
	tristate "Perform selftest on hash functions"
	help
	  Enable this option to test the kernel's integer (<linux/hash.h>),
	  string (<linux/stringhash.h>), and siphash (<linux/siphash.h>)
	  hash functions on boot (or module load).

	  This is intended to help people writing architecture-specific
	  optimized versions.  If unsure, say N.

config TEST_IDA
	tristate "Perform selftest on IDA functions"

config TEST_PARMAN
	tristate "Perform selftest on priority array manager"
	depends on PARMAN
	help
	  Enable this option to test priority array manager on boot
	  (or module load).

	  If unsure, say N.

config TEST_IRQ_TIMINGS
	bool "IRQ timings selftest"
	depends on IRQ_TIMINGS
	help
	  Enable this option to test the irq timings code on boot.

	  If unsure, say N.

config TEST_LKM
	tristate "Test module loading with 'hello world' module"
	depends on m
	help
	  This builds the "test_module" module that emits "Hello, world"
	  on printk when loaded. It is designed to be used for basic
	  evaluation of the module loading subsystem (for example when
	  validating module verification). It lacks any extra dependencies,
	  and will not normally be loaded by the system unless explicitly
	  requested by name.

	  If unsure, say N.

config TEST_BITOPS
	tristate "Test module for compilation of bitops operations"
	depends on m
	help
	  This builds the "test_bitops" module that is much like the
	  TEST_LKM module except that it does a basic exercise of the
	  set/clear_bit macros and get_count_order/long to make sure there are
	  no compiler warnings from C=1 sparse checker or -Wextra
	  compilations. It has no dependencies and doesn't run or load unless
	  explicitly requested by name.  for example: modprobe test_bitops.

	  If unsure, say N.

config TEST_VMALLOC
	tristate "Test module for stress/performance analysis of vmalloc allocator"
	default n
       depends on MMU
	depends on m
	help
	  This builds the "test_vmalloc" module that should be used for
	  stress and performance analysis. So, any new change for vmalloc
	  subsystem can be evaluated from performance and stability point
	  of view.

	  If unsure, say N.

config TEST_USER_COPY
	tristate "Test user/kernel boundary protections"
	depends on m
	help
	  This builds the "test_user_copy" module that runs sanity checks
	  on the copy_to/from_user infrastructure, making sure basic
	  user/kernel boundary testing is working. If it fails to load,
	  a regression has been detected in the user/kernel memory boundary
	  protections.

	  If unsure, say N.

config TEST_BPF
	tristate "Test BPF filter functionality"
	depends on m && NET
	help
	  This builds the "test_bpf" module that runs various test vectors
	  against the BPF interpreter or BPF JIT compiler depending on the
	  current setting. This is in particular useful for BPF JIT compiler
	  development, but also to run regression tests against changes in
	  the interpreter code. It also enables test stubs for eBPF maps and
	  verifier used by user space verifier testsuite.

	  If unsure, say N.

config TEST_BLACKHOLE_DEV
	tristate "Test blackhole netdev functionality"
	depends on m && NET
	help
	  This builds the "test_blackhole_dev" module that validates the
	  data path through this blackhole netdev.

	  If unsure, say N.

config FIND_BIT_BENCHMARK
	tristate "Test find_bit functions"
	help
	  This builds the "test_find_bit" module that measure find_*_bit()
	  functions performance.

	  If unsure, say N.

config TEST_FIRMWARE
	tristate "Test firmware loading via userspace interface"
	depends on FW_LOADER
	help
	  This builds the "test_firmware" module that creates a userspace
	  interface for testing firmware loading. This can be used to
	  control the triggering of firmware loading without needing an
	  actual firmware-using device. The contents can be rechecked by
	  userspace.

	  If unsure, say N.

config TEST_SYSCTL
	tristate "sysctl test driver"
	depends on PROC_SYSCTL
	help
	  This builds the "test_sysctl" module. This driver enables to test the
	  proc sysctl interfaces available to drivers safely without affecting
	  production knobs which might alter system functionality.

	  If unsure, say N.

config BITFIELD_KUNIT
	tristate "KUnit test bitfield functions at runtime"
	depends on KUNIT
	help
	  Enable this option to test the bitfield functions at boot.

	  KUnit tests run during boot and output the results to the debug log
	  in TAP format (http://testanything.org/). Only useful for kernel devs
	  running the KUnit test harness, and not intended for inclusion into a
	  production build.

	  For more information on KUnit and unit tests in general please refer
	  to the KUnit documentation in Documentation/dev-tools/kunit/.

	  If unsure, say N.

config RESOURCE_KUNIT_TEST
	tristate "KUnit test for resource API"
	depends on KUNIT
	help
	  This builds the resource API unit test.
	  Tests the logic of API provided by resource.c and ioport.h.
	  For more information on KUnit and unit tests in general please refer
	  to the KUnit documentation in Documentation/dev-tools/kunit/.

	  If unsure, say N.

config SYSCTL_KUNIT_TEST
	tristate "KUnit test for sysctl" if !KUNIT_ALL_TESTS
	depends on KUNIT
	default KUNIT_ALL_TESTS
	help
	  This builds the proc sysctl unit test, which runs on boot.
	  Tests the API contract and implementation correctness of sysctl.
	  For more information on KUnit and unit tests in general please refer
	  to the KUnit documentation in Documentation/dev-tools/kunit/.

	  If unsure, say N.

config LIST_KUNIT_TEST
	tristate "KUnit Test for Kernel Linked-list structures" if !KUNIT_ALL_TESTS
	depends on KUNIT
	default KUNIT_ALL_TESTS
	help
	  This builds the linked list KUnit test suite.
	  It tests that the API and basic functionality of the list_head type
	  and associated macros.

	  KUnit tests run during boot and output the results to the debug log
	  in TAP format (https://testanything.org/). Only useful for kernel devs
	  running the KUnit test harness, and not intended for inclusion into a
	  production build.

	  For more information on KUnit and unit tests in general please refer
	  to the KUnit documentation in Documentation/dev-tools/kunit/.

	  If unsure, say N.

config LINEAR_RANGES_TEST
	tristate "KUnit test for linear_ranges"
	depends on KUNIT
	select LINEAR_RANGES
	help
	  This builds the linear_ranges unit test, which runs on boot.
	  Tests the linear_ranges logic correctness.
	  For more information on KUnit and unit tests in general please refer
	  to the KUnit documentation in Documentation/dev-tools/kunit/.

	  If unsure, say N.

config CMDLINE_KUNIT_TEST
	tristate "KUnit test for cmdline API"
	depends on KUNIT
	help
	  This builds the cmdline API unit test.
	  Tests the logic of API provided by cmdline.c.
	  For more information on KUnit and unit tests in general please refer
	  to the KUnit documentation in Documentation/dev-tools/kunit/.

	  If unsure, say N.

config BITS_TEST
	tristate "KUnit test for bits.h"
	depends on KUNIT
	help
	  This builds the bits unit test.
	  Tests the logic of macros defined in bits.h.
	  For more information on KUnit and unit tests in general please refer
	  to the KUnit documentation in Documentation/dev-tools/kunit/.

	  If unsure, say N.

config SLUB_KUNIT_TEST
	tristate "KUnit test for SLUB cache error detection" if !KUNIT_ALL_TESTS
	depends on SLUB_DEBUG && KUNIT
	default KUNIT_ALL_TESTS
	help
	  This builds SLUB allocator unit test.
	  Tests SLUB cache debugging functionality.
	  For more information on KUnit and unit tests in general please refer
	  to the KUnit documentation in Documentation/dev-tools/kunit/.

	  If unsure, say N.

config RATIONAL_KUNIT_TEST
	tristate "KUnit test for rational.c" if !KUNIT_ALL_TESTS
	depends on KUNIT && RATIONAL
	default KUNIT_ALL_TESTS
	help
	  This builds the rational math unit test.
	  For more information on KUnit and unit tests in general please refer
	  to the KUnit documentation in Documentation/dev-tools/kunit/.

	  If unsure, say N.

config TEST_UDELAY
	tristate "udelay test driver"
	help
	  This builds the "udelay_test" module that helps to make sure
	  that udelay() is working properly.

	  If unsure, say N.

config TEST_STATIC_KEYS
	tristate "Test static keys"
	depends on m
	help
	  Test the static key interfaces.

	  If unsure, say N.

config TEST_KMOD
	tristate "kmod stress tester"
	depends on m
	depends on NETDEVICES && NET_CORE && INET # for TUN
	depends on BLOCK
	select TEST_LKM
	select XFS_FS
	select TUN
	select BTRFS_FS
	help
	  Test the kernel's module loading mechanism: kmod. kmod implements
	  support to load modules using the Linux kernel's usermode helper.
	  This test provides a series of tests against kmod.

	  Although technically you can either build test_kmod as a module or
	  into the kernel we disallow building it into the kernel since
	  it stress tests request_module() and this will very likely cause
	  some issues by taking over precious threads available from other
	  module load requests, ultimately this could be fatal.

	  To run tests run:

	  tools/testing/selftests/kmod/kmod.sh --help

	  If unsure, say N.

config TEST_DEBUG_VIRTUAL
	tristate "Test CONFIG_DEBUG_VIRTUAL feature"
	depends on DEBUG_VIRTUAL
	help
	  Test the kernel's ability to detect incorrect calls to
	  virt_to_phys() done against the non-linear part of the
	  kernel's virtual address map.

	  If unsure, say N.

config TEST_MEMCAT_P
	tristate "Test memcat_p() helper function"
	help
	  Test the memcat_p() helper for correctly merging two
	  pointer arrays together.

	  If unsure, say N.

config TEST_LIVEPATCH
	tristate "Test livepatching"
	default n
	depends on DYNAMIC_DEBUG
	depends on LIVEPATCH
	depends on m
	help
	  Test kernel livepatching features for correctness.  The tests will
	  load test modules that will be livepatched in various scenarios.

	  To run all the livepatching tests:

	  make -C tools/testing/selftests TARGETS=livepatch run_tests

	  Alternatively, individual tests may be invoked:

	  tools/testing/selftests/livepatch/test-callbacks.sh
	  tools/testing/selftests/livepatch/test-livepatch.sh
	  tools/testing/selftests/livepatch/test-shadow-vars.sh

	  If unsure, say N.

config TEST_OBJAGG
	tristate "Perform selftest on object aggreration manager"
	default n
	depends on OBJAGG
	help
	  Enable this option to test object aggregation manager on boot
	  (or module load).


config TEST_STACKINIT
	tristate "Test level of stack variable initialization"
	help
	  Test if the kernel is zero-initializing stack variables and
	  padding. Coverage is controlled by compiler flags,
	  CONFIG_GCC_PLUGIN_STRUCTLEAK, CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF,
	  or CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL.

	  If unsure, say N.

config TEST_MEMINIT
	tristate "Test heap/page initialization"
	help
	  Test if the kernel is zero-initializing heap and page allocations.
	  This can be useful to test init_on_alloc and init_on_free features.

	  If unsure, say N.

config TEST_HMM
	tristate "Test HMM (Heterogeneous Memory Management)"
	depends on TRANSPARENT_HUGEPAGE
	depends on DEVICE_PRIVATE
	select HMM_MIRROR
	select MMU_NOTIFIER
	help
	  This is a pseudo device driver solely for testing HMM.
	  Say M here if you want to build the HMM test module.
	  Doing so will allow you to run tools/testing/selftest/vm/hmm-tests.

	  If unsure, say N.

config TEST_FREE_PAGES
	tristate "Test freeing pages"
	help
	  Test that a memory leak does not occur due to a race between
	  freeing a block of pages and a speculative page reference.
	  Loading this module is safe if your kernel has the bug fixed.
	  If the bug is not fixed, it will leak gigabytes of memory and
	  probably OOM your system.

config TEST_FPU
	tristate "Test floating point operations in kernel space"
	depends on X86 && !KCOV_INSTRUMENT_ALL
	help
	  Enable this option to add /sys/kernel/debug/selftest_helpers/test_fpu
	  which will trigger a sequence of floating point operations. This is used
	  for self-testing floating point control register setting in
	  kernel_fpu_begin().

	  If unsure, say N.

config TEST_CLOCKSOURCE_WATCHDOG
	tristate "Test clocksource watchdog in kernel space"
	depends on CLOCKSOURCE_WATCHDOG
	help
	  Enable this option to create a kernel module that will trigger
	  a test of the clocksource watchdog.  This module may be loaded
	  via modprobe or insmod in which case it will run upon being
	  loaded, or it may be built in, in which case it will run
	  shortly after boot.

	  If unsure, say N.

endif # RUNTIME_TESTING_MENU

config ARCH_USE_MEMTEST
	bool
	help
	  An architecture should select this when it uses early_memtest()
	  during boot process.

config MEMTEST
	bool "Memtest"
	depends on ARCH_USE_MEMTEST
	help
	  This option adds a kernel parameter 'memtest', which allows memtest
	  to be set and executed.
	        memtest=0, mean disabled; -- default
	        memtest=1, mean do 1 test pattern;
	        ...
	        memtest=17, mean do 17 test patterns.
	  If you are unsure how to answer this question, answer N.



config HYPERV_TESTING
	bool "Microsoft Hyper-V driver testing"
	default n
	depends on HYPERV && DEBUG_FS
	help
	  Select this option to enable Hyper-V vmbus testing.

endmenu # "Kernel Testing and Coverage"

source "Documentation/Kconfig"

endmenu # Kernel hacking
