forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'trace-v5.6-2' of git://git.kernel.org/pub/scm/linux/kernel…
…/git/rostedt/linux-trace Pull tracing updates from Steven Rostedt: - Added new "bootconfig". This looks for a file appended to initrd to add boot config options, and has been discussed thoroughly at Linux Plumbers. Very useful for adding kprobes at bootup. Only enabled if "bootconfig" is on the real kernel command line. - Created dynamic event creation. Merges common code between creating synthetic events and kprobe events. - Rename perf "ring_buffer" structure to "perf_buffer" - Rename ftrace "ring_buffer" structure to "trace_buffer" Had to rename existing "trace_buffer" to "array_buffer" - Allow trace_printk() to work withing (some) tracing code. - Sort of tracing configs to be a little better organized - Fixed bug where ftrace_graph hash was not being protected properly - Various other small fixes and clean ups * tag 'trace-v5.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: (88 commits) bootconfig: Show the number of nodes on boot message tools/bootconfig: Show the number of bootconfig nodes bootconfig: Add more parse error messages bootconfig: Use bootconfig instead of boot config ftrace: Protect ftrace_graph_hash with ftrace_sync ftrace: Add comment to why rcu_dereference_sched() is open coded tracing: Annotate ftrace_graph_notrace_hash pointer with __rcu tracing: Annotate ftrace_graph_hash pointer with __rcu bootconfig: Only load bootconfig if "bootconfig" is on the kernel cmdline tracing: Use seq_buf for building dynevent_cmd string tracing: Remove useless code in dynevent_arg_pair_add() tracing: Remove check_arg() callbacks from dynevent args tracing: Consolidate some synth_event_trace code tracing: Fix now invalid var_ref_vals assumption in trace action tracing: Change trace_boot to use synth_event interface tracing: Move tracing selftests to bottom of menu tracing: Move mmio tracer config up with the other tracers tracing: Move tracing test module configs together tracing: Move all function tracing configs together tracing: Documentation for in-kernel synthetic event API ...
- Loading branch information
Showing
90 changed files
with
6,490 additions
and
836 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,190 @@ | ||
.. SPDX-License-Identifier: GPL-2.0 | ||
.. _bootconfig: | ||
|
||
================== | ||
Boot Configuration | ||
================== | ||
|
||
:Author: Masami Hiramatsu <[email protected]> | ||
|
||
Overview | ||
======== | ||
|
||
The boot configuration expands the current kernel command line to support | ||
additional key-value data when booting the kernel in an efficient way. | ||
This allows administrators to pass a structured-Key config file. | ||
|
||
Config File Syntax | ||
================== | ||
|
||
The boot config syntax is a simple structured key-value. Each key consists | ||
of dot-connected-words, and key and value are connected by ``=``. The value | ||
has to be terminated by semi-colon (``;``) or newline (``\n``). | ||
For array value, array entries are separated by comma (``,``). :: | ||
|
||
KEY[.WORD[...]] = VALUE[, VALUE2[...]][;] | ||
|
||
Unlike the kernel command line syntax, spaces are OK around the comma and ``=``. | ||
|
||
Each key word must contain only alphabets, numbers, dash (``-``) or underscore | ||
(``_``). And each value only contains printable characters or spaces except | ||
for delimiters such as semi-colon (``;``), new-line (``\n``), comma (``,``), | ||
hash (``#``) and closing brace (``}``). | ||
|
||
If you want to use those delimiters in a value, you can use either double- | ||
quotes (``"VALUE"``) or single-quotes (``'VALUE'``) to quote it. Note that | ||
you can not escape these quotes. | ||
|
||
There can be a key which doesn't have value or has an empty value. Those keys | ||
are used for checking if the key exists or not (like a boolean). | ||
|
||
Key-Value Syntax | ||
---------------- | ||
|
||
The boot config file syntax allows user to merge partially same word keys | ||
by brace. For example:: | ||
|
||
foo.bar.baz = value1 | ||
foo.bar.qux.quux = value2 | ||
|
||
These can be written also in:: | ||
|
||
foo.bar { | ||
baz = value1 | ||
qux.quux = value2 | ||
} | ||
|
||
Or more shorter, written as following:: | ||
|
||
foo.bar { baz = value1; qux.quux = value2 } | ||
|
||
In both styles, same key words are automatically merged when parsing it | ||
at boot time. So you can append similar trees or key-values. | ||
|
||
Comments | ||
-------- | ||
|
||
The config syntax accepts shell-script style comments. The comments starting | ||
with hash ("#") until newline ("\n") will be ignored. | ||
|
||
:: | ||
|
||
# comment line | ||
foo = value # value is set to foo. | ||
bar = 1, # 1st element | ||
2, # 2nd element | ||
3 # 3rd element | ||
|
||
This is parsed as below:: | ||
|
||
foo = value | ||
bar = 1, 2, 3 | ||
|
||
Note that you can not put a comment between value and delimiter(``,`` or | ||
``;``). This means following config has a syntax error :: | ||
|
||
key = 1 # comment | ||
,2 | ||
|
||
|
||
/proc/bootconfig | ||
================ | ||
|
||
/proc/bootconfig is a user-space interface of the boot config. | ||
Unlike /proc/cmdline, this file shows the key-value style list. | ||
Each key-value pair is shown in each line with following style:: | ||
|
||
KEY[.WORDS...] = "[VALUE]"[,"VALUE2"...] | ||
|
||
|
||
Boot Kernel With a Boot Config | ||
============================== | ||
|
||
Since the boot configuration file is loaded with initrd, it will be added | ||
to the end of the initrd (initramfs) image file. The Linux kernel decodes | ||
the last part of the initrd image in memory to get the boot configuration | ||
data. | ||
Because of this "piggyback" method, there is no need to change or | ||
update the boot loader and the kernel image itself. | ||
|
||
To do this operation, Linux kernel provides "bootconfig" command under | ||
tools/bootconfig, which allows admin to apply or delete the config file | ||
to/from initrd image. You can build it by the following command:: | ||
|
||
# make -C tools/bootconfig | ||
|
||
To add your boot config file to initrd image, run bootconfig as below | ||
(Old data is removed automatically if exists):: | ||
|
||
# tools/bootconfig/bootconfig -a your-config /boot/initrd.img-X.Y.Z | ||
|
||
To remove the config from the image, you can use -d option as below:: | ||
|
||
# tools/bootconfig/bootconfig -d /boot/initrd.img-X.Y.Z | ||
|
||
Then add "bootconfig" on the normal kernel command line to tell the | ||
kernel to look for the bootconfig at the end of the initrd file. | ||
|
||
Config File Limitation | ||
====================== | ||
|
||
Currently the maximum config size size is 32KB and the total key-words (not | ||
key-value entries) must be under 1024 nodes. | ||
Note: this is not the number of entries but nodes, an entry must consume | ||
more than 2 nodes (a key-word and a value). So theoretically, it will be | ||
up to 512 key-value pairs. If keys contains 3 words in average, it can | ||
contain 256 key-value pairs. In most cases, the number of config items | ||
will be under 100 entries and smaller than 8KB, so it would be enough. | ||
If the node number exceeds 1024, parser returns an error even if the file | ||
size is smaller than 32KB. | ||
Anyway, since bootconfig command verifies it when appending a boot config | ||
to initrd image, user can notice it before boot. | ||
|
||
|
||
Bootconfig APIs | ||
=============== | ||
|
||
User can query or loop on key-value pairs, also it is possible to find | ||
a root (prefix) key node and find key-values under that node. | ||
|
||
If you have a key string, you can query the value directly with the key | ||
using xbc_find_value(). If you want to know what keys exist in the boot | ||
config, you can use xbc_for_each_key_value() to iterate key-value pairs. | ||
Note that you need to use xbc_array_for_each_value() for accessing | ||
each array's value, e.g.:: | ||
|
||
vnode = NULL; | ||
xbc_find_value("key.word", &vnode); | ||
if (vnode && xbc_node_is_array(vnode)) | ||
xbc_array_for_each_value(vnode, value) { | ||
printk("%s ", value); | ||
} | ||
|
||
If you want to focus on keys which have a prefix string, you can use | ||
xbc_find_node() to find a node by the prefix string, and iterate | ||
keys under the prefix node with xbc_node_for_each_key_value(). | ||
|
||
But the most typical usage is to get the named value under prefix | ||
or get the named array under prefix as below:: | ||
|
||
root = xbc_find_node("key.prefix"); | ||
value = xbc_node_find_value(root, "option", &vnode); | ||
... | ||
xbc_node_for_each_array_value(root, "array-option", value, anode) { | ||
... | ||
} | ||
|
||
This accesses a value of "key.prefix.option" and an array of | ||
"key.prefix.array-option". | ||
|
||
Locking is not needed, since after initialization, the config becomes | ||
read-only. All data and keys must be copied if you need to modify it. | ||
|
||
|
||
Functions and structures | ||
======================== | ||
|
||
.. kernel-doc:: include/linux/bootconfig.h | ||
.. kernel-doc:: lib/bootconfig.c | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,184 @@ | ||
.. SPDX-License-Identifier: GPL-2.0 | ||
================= | ||
Boot-time tracing | ||
================= | ||
|
||
:Author: Masami Hiramatsu <[email protected]> | ||
|
||
Overview | ||
======== | ||
|
||
Boot-time tracing allows users to trace boot-time process including | ||
device initialization with full features of ftrace including per-event | ||
filter and actions, histograms, kprobe-events and synthetic-events, | ||
and trace instances. | ||
Since kernel command line is not enough to control these complex features, | ||
this uses bootconfig file to describe tracing feature programming. | ||
|
||
Options in the Boot Config | ||
========================== | ||
|
||
Here is the list of available options list for boot time tracing in | ||
boot config file [1]_. All options are under "ftrace." or "kernel." | ||
prefix. See kernel parameters for the options which starts | ||
with "kernel." prefix [2]_. | ||
|
||
.. [1] See :ref:`Documentation/admin-guide/bootconfig.rst <bootconfig>` | ||
.. [2] See :ref:`Documentation/admin-guide/kernel-parameters.rst <kernelparameters>` | ||
Ftrace Global Options | ||
--------------------- | ||
|
||
Ftrace global options have "kernel." prefix in boot config, which means | ||
these options are passed as a part of kernel legacy command line. | ||
|
||
kernel.tp_printk | ||
Output trace-event data on printk buffer too. | ||
|
||
kernel.dump_on_oops [= MODE] | ||
Dump ftrace on Oops. If MODE = 1 or omitted, dump trace buffer | ||
on all CPUs. If MODE = 2, dump a buffer on a CPU which kicks Oops. | ||
|
||
kernel.traceoff_on_warning | ||
Stop tracing if WARN_ON() occurs. | ||
|
||
kernel.fgraph_max_depth = MAX_DEPTH | ||
Set MAX_DEPTH to maximum depth of fgraph tracer. | ||
|
||
kernel.fgraph_filters = FILTER[, FILTER2...] | ||
Add fgraph tracing function filters. | ||
|
||
kernel.fgraph_notraces = FILTER[, FILTER2...] | ||
Add fgraph non-tracing function filters. | ||
|
||
|
||
Ftrace Per-instance Options | ||
--------------------------- | ||
|
||
These options can be used for each instance including global ftrace node. | ||
|
||
ftrace.[instance.INSTANCE.]options = OPT1[, OPT2[...]] | ||
Enable given ftrace options. | ||
|
||
ftrace.[instance.INSTANCE.]trace_clock = CLOCK | ||
Set given CLOCK to ftrace's trace_clock. | ||
|
||
ftrace.[instance.INSTANCE.]buffer_size = SIZE | ||
Configure ftrace buffer size to SIZE. You can use "KB" or "MB" | ||
for that SIZE. | ||
|
||
ftrace.[instance.INSTANCE.]alloc_snapshot | ||
Allocate snapshot buffer. | ||
|
||
ftrace.[instance.INSTANCE.]cpumask = CPUMASK | ||
Set CPUMASK as trace cpu-mask. | ||
|
||
ftrace.[instance.INSTANCE.]events = EVENT[, EVENT2[...]] | ||
Enable given events on boot. You can use a wild card in EVENT. | ||
|
||
ftrace.[instance.INSTANCE.]tracer = TRACER | ||
Set TRACER to current tracer on boot. (e.g. function) | ||
|
||
ftrace.[instance.INSTANCE.]ftrace.filters | ||
This will take an array of tracing function filter rules. | ||
|
||
ftrace.[instance.INSTANCE.]ftrace.notraces | ||
This will take an array of NON-tracing function filter rules. | ||
|
||
|
||
Ftrace Per-Event Options | ||
------------------------ | ||
|
||
These options are setting per-event options. | ||
|
||
ftrace.[instance.INSTANCE.]event.GROUP.EVENT.enable | ||
Enable GROUP:EVENT tracing. | ||
|
||
ftrace.[instance.INSTANCE.]event.GROUP.EVENT.filter = FILTER | ||
Set FILTER rule to the GROUP:EVENT. | ||
|
||
ftrace.[instance.INSTANCE.]event.GROUP.EVENT.actions = ACTION[, ACTION2[...]] | ||
Set ACTIONs to the GROUP:EVENT. | ||
|
||
ftrace.[instance.INSTANCE.]event.kprobes.EVENT.probes = PROBE[, PROBE2[...]] | ||
Defines new kprobe event based on PROBEs. It is able to define | ||
multiple probes on one event, but those must have same type of | ||
arguments. This option is available only for the event which | ||
group name is "kprobes". | ||
|
||
ftrace.[instance.INSTANCE.]event.synthetic.EVENT.fields = FIELD[, FIELD2[...]] | ||
Defines new synthetic event with FIELDs. Each field should be | ||
"type varname". | ||
|
||
Note that kprobe and synthetic event definitions can be written under | ||
instance node, but those are also visible from other instances. So please | ||
take care for event name conflict. | ||
|
||
|
||
Examples | ||
======== | ||
|
||
For example, to add filter and actions for each event, define kprobe | ||
events, and synthetic events with histogram, write a boot config like | ||
below:: | ||
|
||
ftrace.event { | ||
task.task_newtask { | ||
filter = "pid < 128" | ||
enable | ||
} | ||
kprobes.vfs_read { | ||
probes = "vfs_read $arg1 $arg2" | ||
filter = "common_pid < 200" | ||
enable | ||
} | ||
synthetic.initcall_latency { | ||
fields = "unsigned long func", "u64 lat" | ||
actions = "hist:keys=func.sym,lat:vals=lat:sort=lat" | ||
} | ||
initcall.initcall_start { | ||
actions = "hist:keys=func:ts0=common_timestamp.usecs" | ||
} | ||
initcall.initcall_finish { | ||
actions = "hist:keys=func:lat=common_timestamp.usecs-$ts0:onmatch(initcall.initcall_start).initcall_latency(func,$lat)" | ||
} | ||
} | ||
|
||
Also, boot-time tracing supports "instance" node, which allows us to run | ||
several tracers for different purpose at once. For example, one tracer | ||
is for tracing functions starting with "user\_", and others tracing | ||
"kernel\_" functions, you can write boot config as below:: | ||
|
||
ftrace.instance { | ||
foo { | ||
tracer = "function" | ||
ftrace.filters = "user_*" | ||
} | ||
bar { | ||
tracer = "function" | ||
ftrace.filters = "kernel_*" | ||
} | ||
} | ||
|
||
The instance node also accepts event nodes so that each instance | ||
can customize its event tracing. | ||
|
||
This boot-time tracing also supports ftrace kernel parameters via boot | ||
config. | ||
For example, following kernel parameters:: | ||
|
||
trace_options=sym-addr trace_event=initcall:* tp_printk trace_buf_size=1M ftrace=function ftrace_filter="vfs*" | ||
|
||
This can be written in boot config like below:: | ||
|
||
kernel { | ||
trace_options = sym-addr | ||
trace_event = "initcall:*" | ||
tp_printk | ||
trace_buf_size = 1M | ||
ftrace = function | ||
ftrace_filter = "vfs*" | ||
} | ||
|
||
Note that parameters start with "kernel" prefix instead of "ftrace". |
Oops, something went wrong.