# Trace kernel functions Function tracer (ftrace) provides tracing utilities to perform system-wide profiling and tracing at runtime. To use ftrace, enable the following configuration options: - `CONFIG_FTRACE` - `CONFIG_HAVE_FUNCTION_TRACER` - `CONFIG_HAVE_FUNCTION_GRAPH_TRACER` - `CONFIG_HAVE_DYNAMIC_FTRACE` - `CONFIG_HAVE_FTRACE_MCOUNT_RECORD` The following are some operations that ftrace can perform to debug kernel issues: ## Dump ftrace information to the kmsg buffer To dump the ftrace information into the kmsg buffer anytime from the source code, call the `ftrace_dump(DUMP_ALL)` function. - To increase the buffer size of the ftrace ring, run the following command: > > > echo 200 > /sys/kernel/debug/tracing/buffer_size_kb > Copy to clipboard ## Enable work queue trace - To enable work queue tracing, run the following commands: > > > mount -t debugfs none /sys/kernel/debug > Copy to clipboard > > > echo 1 > /sys/kernel/debug/tracing/events/workqueue/enable > Copy to clipboard > > > echo workqueue:workqueue_queue_work > /sys/kernel/debug/tracing/set_event > Copy to clipboard > > > cat /sys/kernel/debug/tracing/trace_pipe > Copy to clipboard > > > cat /sys/kernel/debug/tracing/per_cpu/cpu1/trace > Copy to clipboard > > > **Sample output:** > > > # tracer: nop > > > # > > > # entries-in-buffer/entries-written: 8682/8682 #P:1 > > > # > > > # \_-----=> irqs-off > > > # / \_----=> need-resched > > > # | / \_---=> hardirq/softirq > > > # || / \_--=> preempt-depth > > > # ||| / delay > > > # TASK-PID CPU# |||| TIMESTAMP FUNCTION > > > # | | | |||| | | > > > <...>-4783 [001] d.s4 7524.354249: workqueue\_queue\_work: work struct=f2d91ee4 function=free\_css\_set\_work workqueue=f6427d80 req\_cpu=1 cpu=1 > > > <idle>-0 [001] d.h4 7524.424196: workqueue\_queue\_work: work struct=c10c32a8 function=def\_work\_fn workqueue=f55c7880 req\_cpu=1 cpu=4 > > > e.process.gapps-4758 [001] dNs4 7524.454227: workqueue\_queue\_work: work struct=c4727fa4 function=free\_css\_set\_work workqueue=f6427d80 req\_cpu=1 cpu=1 > > > Binder\_D-1693 [001] d.s3 7524.504198: workqueue\_queue\_work: work struct=cec6275c function=do\_dbs\_timer workqueue=f5424680 req\_cpu=1 cpu=1 > > > <...>-4832 [001] d.h3 7524.574194: workqueue\_queue\_work: work struct=c10c32a8 function=def\_work\_fn workqueue=f55c7880 req\_cpu=1 cpu=4 ## Enable Interrupt request (IRQ) trace - To enable interrupt tracing, run the following commands: > > > mount -t debugfs none /sys/kernel/debug > Copy to clipboard > > > echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_entry/enable > Copy to clipboard > > > cat /sys/kernel/debug/tracing/trace > Copy to clipboard > > > cat /sys/kernel/debug/tracing/trace_pipe > Copy to clipboard > > > **Sample output:** > > > TASK-PID CPU# TIMESTAMP FUNCTION > > > | | | | | > > > adbd-302 [000] 295.075568: irq\_handler\_entry: irq=132 name=msm\_otg > > > adbd-302 [000] 295.075599: irq\_handler\_entry: irq=132 name=msm\_hsusb > > > adbd-302 [000] 295.075782: irq\_handler\_entry: irq=132 name=msm\_otg > > > adbd-302 [000] 295.075782: irq\_handler\_entry: irq=132 name=msm\_hsusb > > > <idle>-0 [000] 295.076270: irq\_handler\_entry: irq=132 name=msm\_otg > > > <idle>-0 [000] 295.076270: irq\_handler\_entry: irq=132 name=msm\_hsusb > > > <idle>-0 [000] 295.077155: irq\_handler\_entry: irq=18 name=gp\_timer > > > <idle>-0 [000] 295.087166: irq\_handler\_entry: irq=18 name=gp\_timer > > > <idle>-0 [000] 295.097146: irq\_handler\_entry: irq=18 name=gp\_timer ## Enable scheduler trace - To trace context switches between tasks, run the following commands to enable the `sched_switch` tracer: > > > mount -t debugfs none /sys/kernel/debug > Copy to clipboard > > > echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable > Copy to clipboard > > > cat /sys/kernel/debug/tracing/trace > Copy to clipboard > > > cat /sys/kernel/debug/tracing/trace_pipe > Copy to clipboard > > > **Sample output:** > > > TASK-PID CPU# TIMESTAMP FUNCTION > > > | | | | | > > > WindowManagerPo-484 [000] 994.583135: sched\_switch: prev\_comm=WindowManagerPo > > > SurfaceFlinger-334 [000] 994.583652: sched\_switch: prev\_comm=SurfaceFlinger > > > WindowManagerPo-484 [000] 994.584320: sched\_switch: prev\_comm=WindowManagerPo > > > GL updater-675 [000] 994.584370: sched\_switch: prev\_comm=GL updater > > > WindowManagerPo-484 [000] 994.584424: sched\_switch: prev\_comm=WindowManagerPo ## Find IRQ latency - To find the maximum IRQ latency and pre-emption latency in the system, enable ftrace configurations for `IRQOFF` and `PREEMPTIONOFF` as follows: > > > CONFIG_IRQSOFF_TRACER =Y > CONFIG_PREEMPT_TRACER =Y > Copy to clipboard > > > For this configuration to take effect, recompile the kernel. This configuration detects latency in milliseconds effectively. - To enable tracing, run the following commands: > > > echo 0 > /sys/kernel/debug/tracing/tracing_enabled > Copy to clipboard > > > echo 0 > /sys/kernel/debug/tracing/tracing_max_latency > Copy to clipboard > > > echo irqsoff > /sys/kernel/debug/tracing/current_tracer > Copy to clipboard > > > echo 1 > /sys/kernel/debug/tracing/tracing_enabled > Copy to clipboard > > > cat /sys/kernel/debug/tracing/trace > Copy to clipboard - To find the maximum latency observed in the system, configure `tracing_max_latency = 0`. To detect any latency higher than the specified limit, set the threshold level in microseconds. For example, > > > echo 2000 > /sys/kernel/debug/tracing/tracing_thresh > Copy to clipboard The following example shows the traces for IRQ latency of 16 ms: cat /sys/kernel/debug/tracing/trace # tracer: irqsoff # # WARNING: FUNCTION TRACING IS CORRUPTED # MAY BE MISSING FUNCTION EVENTS # irqsoff latency trace v1.1.5 on 3.4.0-perf-g7736d93-dirty # -------------------------------------------------------------------- # latency: 16757 us, #4/4, CPU#0 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:1) # ----------------- # | task: EventThread-534 (uid:1000 nice:-9 policy:0 rt\_prio:0) # ----------------- # => started at: \_raw\_spin\_lock\_irqsave # => ended at: \_raw\_spin\_unlock\_irqrestore # # # \_------=> CPU# # / \_-----=> irqs-off # | / \_----=> need-resched # || / \_---=> hardirq/softirq # ||| / \_--=> preempt-depth # |||| / delay # cmd pid ||||| time | caller # / ||||| | / <...>-534 0d... 0us!: \_raw\_spin\_lock\_irqsave <...>-534 0d..1 16756us+: \_raw\_spin\_unlock\_irqrestore <...>-534 0d..1 16758us+: trace\_hardirqs\_on <-\_raw\_spin\_unlock\_irqrestore <...>-534 0d..1 16780us : <stack trace> => trace\_hardirqs\_on => \_raw\_spin\_unlock\_irqrestore => clk\_enable => mdss\_dsi\_clk\_enable => mdss\_dsi\_clk\_ctrl => mdss\_dsi\_clk\_req => mdss\_dsi\_event\_handler => mdss\_mdp\_ctl\_intf\_event => mdss\_mdp\_cmd\_add\_vsync\_handler => mdss\_mdp\_overlay\_vsync\_ctrl => mdss\_mdp\_overlay\_ioctl\_handler => mdss\_fb\_ioctl => do\_fb\_ioctl => fb\_ioctl => do\_vfs\_ioctl => sys\_ioctl => ret\_fast\_syscall /sys/kernel/debug/tracing # For more information, see the `Documentation/trace/ftrace.txt` file available in the [kernel documentation](https://www.kernel.org/doc/Documentation). Last Published: May 14, 2026 [Previous Topic Assess memory usage](https://docs.qualcomm.com/bundle/publicresource/80-80022-12/topics/assess_memory_usage.md) [Next Topic Collect and parse RAM dump](https://docs.qualcomm.com/bundle/publicresource/80-80022-12/topics/collect_and_parse_ram_dumps.md)