# SPDX-License-Identifier: GPL-2.0-only
#
# Architectures that offer an FUNCTION_TRACER implementation should
#  select HAVE_FUNCTION_TRACER:
#

config USER_STACKTRACE_SUPPORT
	bool

config NOP_TRACER
	bool

config HAVE_RETHOOK
	bool

config RETHOOK
	bool
	depends on HAVE_RETHOOK
	help
	  Enable generic return hooking feature. This is an internal
	  API, which will be used by other function-entry hooking
	  features like fprobe and kprobes.

config HAVE_FUNCTION_TRACER
	bool
	help
	  See Documentation/trace/ftrace-design.rst

config HAVE_FUNCTION_GRAPH_TRACER
	bool
	help
	  See Documentation/trace/ftrace-design.rst

config HAVE_DYNAMIC_FTRACE
	bool
	help
	  See Documentation/trace/ftrace-design.rst

config HAVE_DYNAMIC_FTRACE_WITH_REGS
	bool

config HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
	bool

config HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS
	bool

config HAVE_DYNAMIC_FTRACE_WITH_ARGS
	bool
	help
	 If this is set, then arguments and stack can be found from
	 the ftrace_regs passed into the function callback regs parameter
	 by default, even without setting the REGS flag in the ftrace_ops.
	 This allows for use of ftrace_regs_get_argument() and
	 ftrace_regs_get_stack_pointer().

config HAVE_DYNAMIC_FTRACE_NO_PATCHABLE
	bool
	help
	  If the architecture generates __patchable_function_entries sections
	  but does not want them included in the ftrace locations.

config HAVE_FTRACE_MCOUNT_RECORD
	bool
	help
	  See Documentation/trace/ftrace-design.rst

config HAVE_SYSCALL_TRACEPOINTS
	bool
	help
	  See Documentation/trace/ftrace-design.rst

config HAVE_FENTRY
	bool
	help
	  Arch supports the gcc options -pg with -mfentry

config HAVE_NOP_MCOUNT
	bool
	help
	  Arch supports the gcc options -pg with -mrecord-mcount and -nop-mcount

config HAVE_OBJTOOL_MCOUNT
	bool
	help
	  Arch supports objtool --mcount

config HAVE_OBJTOOL_NOP_MCOUNT
	bool
	help
	  Arch supports the objtool options --mcount with --mnop.
	  An architecture can select this if it wants to enable nop'ing
	  of ftrace locations.

config HAVE_C_RECORDMCOUNT
	bool
	help
	  C version of recordmcount available?

config HAVE_BUILDTIME_MCOUNT_SORT
       bool
       help
         An architecture selects this if it sorts the mcount_loc section
	 at build time.

config BUILDTIME_MCOUNT_SORT
       bool
       default y
       depends on HAVE_BUILDTIME_MCOUNT_SORT && DYNAMIC_FTRACE
       help
         Sort the mcount_loc section at build time.

config TRACER_MAX_TRACE
	bool

config TRACE_CLOCK
	bool

config RING_BUFFER
	bool
	select TRACE_CLOCK
	select IRQ_WORK

config EVENT_TRACING
	select CONTEXT_SWITCH_TRACER
	select GLOB
	bool

config CONTEXT_SWITCH_TRACER
	bool

config RING_BUFFER_ALLOW_SWAP
	bool
	help
	 Allow the use of ring_buffer_swap_cpu.
	 Adds a very slight overhead to tracing when enabled.

config PREEMPTIRQ_TRACEPOINTS
	bool
	depends on TRACE_PREEMPT_TOGGLE || TRACE_IRQFLAGS
	select TRACING
	default y
	help
	  Create preempt/irq toggle tracepoints if needed, so that other parts
	  of the kernel can use them to generate or add hooks to them.

# All tracer options should select GENERIC_TRACER. For those options that are
# enabled by all tracers (context switch and event tracer) they select TRACING.
# This allows those options to appear when no other tracer is selected. But the
# options do not appear when something else selects it. We need the two options
# GENERIC_TRACER and TRACING to avoid circular dependencies to accomplish the
# hiding of the automatic options.

config TRACING
	bool
	select RING_BUFFER
	select STACKTRACE if STACKTRACE_SUPPORT
	select TRACEPOINTS
	select NOP_TRACER
	select BINARY_PRINTF
	select EVENT_TRACING
	select TRACE_CLOCK
	select TASKS_RCU if PREEMPTION

config GENERIC_TRACER
	bool
	select TRACING

#
# Minimum requirements an architecture has to meet for us to
# be able to offer generic tracing facilities:
#
config TRACING_SUPPORT
	bool
	depends on TRACE_IRQFLAGS_SUPPORT
	depends on STACKTRACE_SUPPORT
	default y

menuconfig FTRACE
	bool "Tracers"
	depends on TRACING_SUPPORT
	default y if DEBUG_KERNEL
	help
	  Enable the kernel tracing infrastructure.

if FTRACE

config BOOTTIME_TRACING
	bool "Boot-time Tracing support"
	depends on TRACING
	select BOOT_CONFIG
	help
	  Enable developer to setup ftrace subsystem via supplemental
	  kernel cmdline at boot time for debugging (tracing) driver
	  initialization and boot process.

config FUNCTION_TRACER
	bool "Kernel Function Tracer"
	depends on HAVE_FUNCTION_TRACER
	select KALLSYMS
	select GENERIC_TRACER
	select CONTEXT_SWITCH_TRACER
	select GLOB
	select TASKS_RCU if PREEMPTION
	select TASKS_RUDE_RCU
	help
	  Enable the kernel to trace every kernel function. This is done
	  by using a compiler feature to insert a small, 5-byte No-Operation
	  instruction at the beginning of every kernel function, which NOP
	  sequence is then dynamically patched into a tracer call when
	  tracing is enabled by the administrator. If it's runtime disabled
	  (the bootup default), then the overhead of the instructions is very
	  small and not measurable even in micro-benchmarks (at least on
	  x86, but may have impact on other architectures).

config FUNCTION_GRAPH_TRACER
	bool "Kernel Function Graph Tracer"
	depends on HAVE_FUNCTION_GRAPH_TRACER
	depends on FUNCTION_TRACER
	depends on !X86_32 || !CC_OPTIMIZE_FOR_SIZE
	default y
	help
	  Enable the kernel to trace a function at both its return
	  and its entry.
	  Its first purpose is to trace the duration of functions and
	  draw a call graph for each thread with some information like
	  the return value. This is done by setting the current return
	  address on the current task structure into a stack of calls.

config DYNAMIC_FTRACE
	bool "enable/disable function tracing dynamically"
	depends on FUNCTION_TRACER
	depends on HAVE_DYNAMIC_FTRACE
	default y
	help
	  This option will modify all the calls to function tracing
	  dynamically (will patch them out of the binary image and
	  replace them with a No-Op instruction) on boot up. During
	  compile time, a table is made of all the locations that ftrace
	  can function trace, and this table is linked into the kernel
	  image. When this is enabled, functions can be individually
	  enabled, and the functions not enabled will not affect
	  performance of the system.

	  See the files in /sys/kernel/tracing:
	    available_filter_functions
	    set_ftrace_filter
	    set_ftrace_notrace

	  This way a CONFIG_FUNCTION_TRACER kernel is slightly larger, but
	  otherwise has native performance as long as no tracing is active.

config DYNAMIC_FTRACE_WITH_REGS
	def_bool y
	depends on DYNAMIC_FTRACE
	depends on HAVE_DYNAMIC_FTRACE_WITH_REGS

config DYNAMIC_FTRACE_WITH_DIRECT_CALLS
	def_bool y
	depends on DYNAMIC_FTRACE_WITH_REGS || DYNAMIC_FTRACE_WITH_ARGS
	depends on HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS

config DYNAMIC_FTRACE_WITH_CALL_OPS
	def_bool y
	depends on HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS

config DYNAMIC_FTRACE_WITH_ARGS
	def_bool y
	depends on DYNAMIC_FTRACE
	depends on HAVE_DYNAMIC_FTRACE_WITH_ARGS

config FPROBE
	bool "Kernel Function Probe (fprobe)"
	depends on FUNCTION_TRACER
	depends on DYNAMIC_FTRACE_WITH_REGS
	depends on HAVE_RETHOOK
	select RETHOOK
	default n
	help
	  This option enables kernel function probe (fprobe) based on ftrace.
	  The fprobe is similar to kprobes, but probes only for kernel function
	  entries and exits. This also can probe multiple functions by one
	  fprobe.

	  If unsure, say N.

config FUNCTION_PROFILER
	bool "Kernel function profiler"
	depends on FUNCTION_TRACER
	default n
	help
	  This option enables the kernel function profiler. A file is created
	  in debugfs called function_profile_enabled which defaults to zero.
	  When a 1 is echoed into this file profiling begins, and when a
	  zero is entered, profiling stops. A "functions" file is created in
	  the trace_stat directory; this file shows the list of functions that
	  have been hit and their counters.

	  If in doubt, say N.

config STACK_TRACER
	bool "Trace max stack"
	depends on HAVE_FUNCTION_TRACER
	select FUNCTION_TRACER
	select STACKTRACE
	select KALLSYMS
	help
	  This special tracer records the maximum stack footprint of the
	  kernel and displays it in /sys/kernel/tracing/stack_trace.

	  This tracer works by hooking into every function call that the
	  kernel executes, and keeping a maximum stack depth value and
	  stack-trace saved.  If this is configured with DYNAMIC_FTRACE
	  then it will not have any overhead while the stack tracer
	  is disabled.

	  To enable the stack tracer on bootup, pass in 'stacktrace'
	  on the kernel command line.

	  The stack tracer can also be enabled or disabled via the
	  sysctl kernel.stack_tracer_enabled

	  Say N if unsure.

config TRACE_PREEMPT_TOGGLE
	bool
	help
	  Enables hooks which will be called when preemption is first disabled,
	  and last enabled.

config IRQSOFF_TRACER
	bool "Interrupts-off Latency Tracer"
	default n
	depends on TRACE_IRQFLAGS_SUPPORT
	select TRACE_IRQFLAGS
	select GENERIC_TRACER
	select TRACER_MAX_TRACE
	select RING_BUFFER_ALLOW_SWAP
	select TRACER_SNAPSHOT
	select TRACER_SNAPSHOT_PER_CPU_SWAP
	help
	  This option measures the time spent in irqs-off critical
	  sections, with microsecond accuracy.

	  The default measurement method is a maximum search, which is
	  disabled by default and can be runtime (re-)started
	  via:

	      echo 0 > /sys/kernel/tracing/tracing_max_latency

	  (Note that kernel size and overhead increase with this option
	  enabled. This option and the preempt-off timing option can be
	  used together or separately.)

config PREEMPT_TRACER
	bool "Preemption-off Latency Tracer"
	default n
	depends on PREEMPTION
	select GENERIC_TRACER
	select TRACER_MAX_TRACE
	select RING_BUFFER_ALLOW_SWAP
	select TRACER_SNAPSHOT
	select TRACER_SNAPSHOT_PER_CPU_SWAP
	select TRACE_PREEMPT_TOGGLE
	help
	  This option measures the time spent in preemption-off critical
	  sections, with microsecond accuracy.

	  The default measurement method is a maximum search, which is
	  disabled by default and can be runtime (re-)started
	  via:

	      echo 0 > /sys/kernel/tracing/tracing_max_latency

	  (Note that kernel size and overhead increase with this option
	  enabled. This option and the irqs-off timing option can be
	  used together or separately.)

config SCHED_TRACER
	bool "Scheduling Latency Tracer"
	select GENERIC_TRACER
	select CONTEXT_SWITCH_TRACER
	select TRACER_MAX_TRACE
	select TRACER_SNAPSHOT
	help
	  This tracer tracks the latency of the highest priority task
	  to be scheduled in, starting from the point it has woken up.

config HWLAT_TRACER
	bool "Tracer to detect hardware latencies (like SMIs)"
	select GENERIC_TRACER
	select TRACER_MAX_TRACE
	help
	 This tracer, when enabled will create one or more kernel threads,
	 depending on what the cpumask file is set to, which each thread
	 spinning in a loop looking for interruptions caused by
	 something other than the kernel. For example, if a
	 System Management Interrupt (SMI) takes a noticeable amount of
	 time, this tracer will detect it. This is useful for testing
	 if a system is reliable for Real Time tasks.

	 Some files are created in the tracing directory when this
	 is enabled:

	   hwlat_detector/width   - time in usecs for how long to spin for
	   hwlat_detector/window  - time in usecs between the start of each
				     iteration

	 A kernel thread is created that will spin with interrupts disabled
	 for "width" microseconds in every "window" cycle. It will not spin
	 for "window - width" microseconds, where the system can
	 continue to operate.

	 The output will appear in the trace and trace_pipe files.

	 When the tracer is not running, it has no affect on the system,
	 but when it is running, it can cause the system to be
	 periodically non responsive. Do not run this tracer on a
	 production system.

	 To enable this tracer, echo in "hwlat" into the current_tracer
	 file. Every time a latency is greater than tracing_thresh, it will
	 be recorded into the ring buffer.

config OSNOISE_TRACER
	bool "OS Noise tracer"
	select GENERIC_TRACER
	select TRACER_MAX_TRACE
	help
	  In the context of high-performance computing (HPC), the Operating
	  System Noise (osnoise) refers to the interference experienced by an
	  application due to activities inside the operating system. In the
	  context of Linux, NMIs, IRQs, SoftIRQs, and any other system thread
	  can cause noise to the system. Moreover, hardware-related jobs can
	  also cause noise, for example, via SMIs.

	  The osnoise tracer leverages the hwlat_detector by running a similar
	  loop with preemption, SoftIRQs and IRQs enabled, thus allowing all
	  the sources of osnoise during its execution. The osnoise tracer takes
	  note of the entry and exit point of any source of interferences,
	  increasing a per-cpu interference counter. It saves an interference
	  counter for each source of interference. The interference counter for
	  NMI, IRQs, SoftIRQs, and threads is increased anytime the tool
	  observes these interferences' entry events. When a noise happens
	  without any interference from the operating system level, the
	  hardware noise counter increases, pointing to a hardware-related
	  noise. In this way, osnoise can account for any source of
	  interference. At the end of the period, the osnoise tracer prints
	  the sum of all noise, the max single noise, the percentage of CPU
	  available for the thread, and the counters for the noise sources.

	  In addition to the tracer, a set of tracepoints were added to
	  facilitate the identification of the osnoise source.

	  The output will appear in the trace and trace_pipe files.

	  To enable this tracer, echo in "osnoise" into the current_tracer
          file.

config TIMERLAT_TRACER
	bool "Timerlat tracer"
	select OSNOISE_TRACER
	select GENERIC_TRACER
	help
	  The timerlat tracer aims to help the preemptive kernel developers
	  to find sources of wakeup latencies of real-time threads.

	  The tracer creates a per-cpu kernel thread with real-time priority.
	  The tracer thread sets a periodic timer to wakeup itself, and goes
	  to sleep waiting for the timer to fire. At the wakeup, the thread
	  then computes a wakeup latency value as the difference between
	  the current time and the absolute time t