Here we will attempt to understand how swap space is used in the
linux kernel. First, the following kernel configuration are used: CONFIG_KPROBES_ON_FTRACE=y CONFIG_HAVE_KPROBES_ON_FTRACE=y # CONFIG_PSTORE_FTRACE is not set CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_FTRACE=y CONFIG_FTRACE_SYSCALLS=y CONFIG_DYNAMIC_FTRACE=y CONFIG_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_FTRACE_STARTUP_TEST is not set CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y CONFIG_FUNCTION_PROFILER=y And this is for 3.11.0-rc3+, from linus git tree branch. My present distro is Ubuntu 12.04.1 LTS 32-bit. I am not sure which parameter above are really needed by FTRACE, but sufficient enough to meet our present objective. Recompile the linux kernel using the above parameters, and reboot into it. Now run the following program using bash shell (as root): #!/bin/bash mkdir /debug mount -t debugfs nodev /debug echo "" >/debug/tracing/trace echo 0 >/debug/tracing/tracing_on echo "*swap*" > /debug/tracing/set_ftrace_filter echo function >/debug/tracing/current_tracer echo 1 >/debug/tracing/tracing_on swapon -a xxd < YEYEYE.txt | tail -100 echo 0 >/debug/tracing/tracing_on cat /debug/tracing/trace The file "YEYEYE.txt" is a 200MB large binary file in my case. To get a good explanation of the ftrace mechanism (which is always kernel version specific) just "cat /debug/tracing/README" to read the self-documentation. The output of the above: # tracer: function # # entries-in-buffer/entries-written: 3228/3228 #P:8 # # _-----=> irqs-off # / _----=> need-resched # | / _---=> hardirq/softirq # || / _--=> preempt-depth # ||| / delay # TASK-PID CPU# |||| TIMESTAMP FUNCTION # | | | |||| | | sh-5897 [001] ...1 10896.768829: reuse_swap_page <-do_wp_page sh-5897 [001] ...1 10896.768836: reuse_swap_page <-do_wp_page sh-5897 [001] ...1 10896.768840: reuse_swap_page <-do_wp_page sh-5897 [001] ...1 10896.768843: reuse_swap_page <-do_wp_page sh-5897 [001] ...1 10896.768846: reuse_swap_page <-do_wp_page sh-5897 [001] ...1 10896.768850: reuse_swap_page <-do_wp_page sh-5897 [001] ...1 10896.768853: reuse_swap_page <-do_wp_page sh-5897 [001] ...1 10896.768857: reuse_swap_page <-do_wp_page sh-5897 [001] ...1 10896.768860: reuse_swap_page <-do_wp_page swapon-5898 [006] ...1 10896.768864: reuse_swap_page <-do_wp_page swapon-5898 [006] ...1 10896.768873: reuse_swap_page <-do_wp_page swapon-5898 [005] .... 10896.770397: free_pages_and_swap_cache <-tlb_flush_mmu swapon-5898 [005] .... 10896.770399: free_pages_and_swap_cache <-tlb_flush_mmu sh-5897 [001] ...1 10896.770602: reuse_swap_page <-do_wp_page sh-5897 [001] ...1 10896.770685: reuse_swap_page <-do_wp_page sh-5897 [001] ...1 10896.770689: reuse_swap_page <-do_wp_page sh-5897 [001] ...1 10896.770692: reuse_swap_page <-do_wp_page and if you just extract out all the "xxd" lines from above output, meaning all the ftrace output related to execution of the userspace program "xxd" (which supposedly is to trigger usage of swap space due to large file read). xxd-5899 [006] ...1 10896.770817: reuse_swap_page <-do_wp_page xxd-5899 [007] .... 10896.770997: free_pages_and_swap_cache <-tlb_flush_mmu All the above APIs essentially indicate caller-callee relationship. The specific functions to be traced must have "swap" inside its name, since the command: echo "*swap*" > /debug/tracing/set_ftrace_filter is issued before enabling the tracing. If you want global list of all kernel APIs to be traced, then just issue: echo "*" > /debug/tracing/set_ftrace_filter It is important to have the double quote (or single quote will do as well) wrapping the star. If you want multiple APIs from different families the following is possible: echo vfs_* blk_* tcp_* ipv4_* *socket* > /debug/tracing/set_ftrace_filter As the star above is not wrapped by any quote sign, just make sure that there is no files matching the above names by regular _expression_ matching. The details of the tracing are given here: http://pastebin.com/JdsZZacX And to repeat: the above is just for the kernel API with "swap" as part of its name. And here are some introduction to ftrace in Linux kernel: http://lwn.net/Articles/370423/ https://www.kernel.org/doc/Documentation/trace/ftrace.txt (updated as of 3.10) https://www.kernel.org/doc/Documentation/trace/ftrace-design.txt -- You received this message because you are subscribed to the Google Groups "linuxkernelnewbies" group. To unsubscribe from this group and stop receiving emails from it, send an email to linuxkernelnewbies+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out. |