16 Oct, 2020

1 commit

  • Pull tracing updates from Steven Rostedt:
    "Updates for tracing and bootconfig:

    - Add support for "bool" type in synthetic events

    - Add per instance tracing for bootconfig

    - Support perf-style return probe ("SYMBOL%return") in kprobes and
    uprobes

    - Allow for kprobes to be enabled earlier in boot up

    - Added tracepoint helper function to allow testing if tracepoints
    are enabled in headers

    - Synthetic events can now have dynamic strings (variable length)

    - Various fixes and cleanups"

    * tag 'trace-v5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: (58 commits)
    tracing: support "bool" type in synthetic trace events
    selftests/ftrace: Add test case for synthetic event syntax errors
    tracing: Handle synthetic event array field type checking correctly
    selftests/ftrace: Change synthetic event name for inter-event-combined test
    tracing: Add synthetic event error logging
    tracing: Check that the synthetic event and field names are legal
    tracing: Move is_good_name() from trace_probe.h to trace.h
    tracing: Don't show dynamic string internals in synthetic event description
    tracing: Fix some typos in comments
    tracing/boot: Add ftrace.instance.*.alloc_snapshot option
    tracing: Fix race in trace_open and buffer resize call
    tracing: Check return value of __create_val_fields() before using its result
    tracing: Fix synthetic print fmt check for use of __get_str()
    tracing: Remove a pointless assignment
    ftrace: ftrace_global_list is renamed to ftrace_ops_list
    ftrace: Format variable declarations of ftrace_allocate_records
    ftrace: Simplify the calculation of page number for ftrace_page->records
    ftrace: Simplify the dyn_ftrace->flags macro
    ftrace: Simplify the hash calculation
    ftrace: Use fls() to get the bits for dup_hash()
    ...

    Linus Torvalds
     

26 Sep, 2020

1 commit

  • As tracepoints are discouraged from being added in a header because it can
    cause side effects if other tracepoints are in headers, as well as bloat the
    kernel as the trace_() function is not a small inline, the common
    workaround is to add a function call that calls a wrapper function in a
    C file that then calls the tracepoint. But as function calls add overhead,
    this function should only be called when the tracepoint in question is
    enabled. To get around this overhead, a static_branch can be used to only
    have the tracepoint wrapper get called when the tracepoint is enabled.

    Add a tracepoint_enabled(tp) macro that gets passed the name of the
    tracepoint, and this becomes a static_branch that is enabled when the
    tracepoint is enabled and is a nop when the tracepoint is disabled.

    Signed-off-by: Steven Rostedt (VMware)

    Steven Rostedt (VMware)
     

01 Sep, 2020

1 commit

  • Currently the tracepoint site will iterate a vector and issue indirect
    calls to however many handlers are registered (ie. the vector is
    long).

    Using static_call() it is possible to optimize this for the common
    case of only having a single handler registered. In this case the
    static_call() can directly call this handler. Otherwise, if the vector
    is longer than 1, call a function that iterates the whole vector like
    the current code.

    [peterz: updated to new interface]

    Signed-off-by: Steven Rostedt (VMware)
    Signed-off-by: Peter Zijlstra (Intel)
    Signed-off-by: Ingo Molnar
    Cc: Linus Torvalds
    Link: https://lore.kernel.org/r/20200818135805.279421092@infradead.org

    Steven Rostedt (VMware)
     

27 Apr, 2019

1 commit

  • This is an opt-in interface that allows a tracepoint to provide a safe
    buffer that can be written from a BPF_PROG_TYPE_RAW_TRACEPOINT program.
    The size of the buffer must be a compile-time constant, and is checked
    before allowing a BPF program to attach to a tracepoint that uses this
    feature.

    The pointer to this buffer will be the first argument of tracepoints
    that opt in; the pointer is valid and can be bpf_probe_read() by both
    BPF_PROG_TYPE_RAW_TRACEPOINT and BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE
    programs that attach to such a tracepoint, but the buffer to which it
    points may only be written by the latter.

    Signed-off-by: Matt Mullins
    Acked-by: Yonghong Song
    Signed-off-by: Alexei Starovoitov

    Matt Mullins
     

18 Oct, 2018

1 commit

  • commit 46e0c9be206f ("kernel: tracepoints: add support for relative
    references") changes the layout of the __tracepoint_ptrs section on
    architectures supporting relative references. However, it does so
    without turning struct tracepoint * const into const int elsewhere in
    the tracepoint code, which has the following side-effect:

    Setting mod->num_tracepoints is done in by module.c:

    mod->tracepoints_ptrs = section_objs(info, "__tracepoints_ptrs",
    sizeof(*mod->tracepoints_ptrs),
    &mod->num_tracepoints);

    Basically, since sizeof(*mod->tracepoints_ptrs) is a pointer size
    (rather than sizeof(int)), num_tracepoints is erroneously set to half the
    size it should be on 64-bit arch. So a module with an odd number of
    tracepoints misses the last tracepoint due to effect of integer
    division.

    So in the module going notifier:

    for_each_tracepoint_range(mod->tracepoints_ptrs,
    mod->tracepoints_ptrs + mod->num_tracepoints,
    tp_module_going_check_quiescent, NULL);

    the expression (mod->tracepoints_ptrs + mod->num_tracepoints) actually
    evaluates to something within the bounds of the array, but miss the
    last tracepoint if the number of tracepoints is odd on 64-bit arch.

    Fix this by introducing a new typedef: tracepoint_ptr_t, which
    is either "const int" on architectures that have PREL32 relocations,
    or "struct tracepoint * const" on architectures that does not have
    this feature.

    Also provide a new tracepoint_ptr_defer() static inline to
    encapsulate deferencing this type rather than duplicate code and
    ugly idefs within the for_each_tracepoint_range() implementation.

    This issue appears in 4.19-rc kernels, and should ideally be fixed
    before the end of the rc cycle.

    Acked-by: Ard Biesheuvel
    Acked-by: Jessica Yu
    Link: http://lkml.kernel.org/r/20181013191050.22389-1-mathieu.desnoyers@efficios.com
    Link: http://lkml.kernel.org/r/20180704083651.24360-7-ard.biesheuvel@linaro.org
    Cc: Michael Ellerman
    Cc: Ingo Molnar
    Cc: Ard Biesheuvel
    Cc: Arnd Bergmann
    Cc: Benjamin Herrenschmidt
    Cc: Bjorn Helgaas
    Cc: Catalin Marinas
    Cc: James Morris
    Cc: James Morris
    Cc: Josh Poimboeuf
    Cc: Kees Cook
    Cc: Nicolas Pitre
    Cc: Paul Mackerras
    Cc: Petr Mladek
    Cc: Russell King
    Cc: "Serge E. Hallyn"
    Cc: Sergey Senozhatsky
    Cc: Thomas Garnier
    Cc: Thomas Gleixner
    Cc: Will Deacon
    Cc: Andrew Morton
    Cc: Linus Torvalds
    Cc: Greg Kroah-Hartman
    Signed-off-by: Mathieu Desnoyers
    Signed-off-by: Steven Rostedt (VMware)

    Mathieu Desnoyers
     

29 Mar, 2018

1 commit

  • Introduce BPF_PROG_TYPE_RAW_TRACEPOINT bpf program type to access
    kernel internal arguments of the tracepoints in their raw form.

    >From bpf program point of view the access to the arguments look like:
    struct bpf_raw_tracepoint_args {
    __u64 args[0];
    };

    int bpf_prog(struct bpf_raw_tracepoint_args *ctx)
    {
    // program can read args[N] where N depends on tracepoint
    // and statically verified at program load+attach time
    }

    kprobe+bpf infrastructure allows programs access function arguments.
    This feature allows programs access raw tracepoint arguments.

    Similar to proposed 'dynamic ftrace events' there are no abi guarantees
    to what the tracepoints arguments are and what their meaning is.
    The program needs to type cast args properly and use bpf_probe_read()
    helper to access struct fields when argument is a pointer.

    For every tracepoint __bpf_trace_##call function is prepared.
    In assembler it looks like:
    (gdb) disassemble __bpf_trace_xdp_exception
    Dump of assembler code for function __bpf_trace_xdp_exception:
    0xffffffff81132080 : mov %ecx,%ecx
    0xffffffff81132082 : jmpq 0xffffffff811231f0

    where

    TRACE_EVENT(xdp_exception,
    TP_PROTO(const struct net_device *dev,
    const struct bpf_prog *xdp, u32 act),

    The above assembler snippet is casting 32-bit 'act' field into 'u64'
    to pass into bpf_trace_run3(), while 'dev' and 'xdp' args are passed as-is.
    All of ~500 of __bpf_trace_*() functions are only 5-10 byte long
    and in total this approach adds 7k bytes to .text.

    This approach gives the lowest possible overhead
    while calling trace_xdp_exception() from kernel C code and
    transitioning into bpf land.
    Since tracepoint+bpf are used at speeds of 1M+ events per second
    this is valuable optimization.

    The new BPF_RAW_TRACEPOINT_OPEN sys_bpf command is introduced
    that returns anon_inode FD of 'bpf-raw-tracepoint' object.

    The user space looks like:
    // load bpf prog with BPF_PROG_TYPE_RAW_TRACEPOINT type
    prog_fd = bpf_prog_load(...);
    // receive anon_inode fd for given bpf_raw_tracepoint with prog attached
    raw_tp_fd = bpf_raw_tracepoint_open("xdp_exception", prog_fd);

    Ctrl-C of tracing daemon or cmdline tool that uses this feature
    will automatically detach bpf program, unload it and
    unregister tracepoint probe.

    On the kernel side the __bpf_raw_tp_map section of pointers to
    tracepoint definition and to __bpf_trace_*() probe function is used
    to find a tracepoint with "xdp_exception" name and
    corresponding __bpf_trace_xdp_exception() probe function
    which are passed to tracepoint_probe_register() to connect probe
    with tracepoint.

    Addition of bpf_raw_tracepoint doesn't interfere with ftrace and perf
    tracepoint mechanisms. perf_event_open() can be used in parallel
    on the same tracepoint.
    Multiple bpf_raw_tracepoint_open("xdp_exception", prog_fd) are permitted.
    Each with its own bpf program. The kernel will execute
    all tracepoint probes and all attached bpf programs.

    In the future bpf_raw_tracepoints can be extended with
    query/introspection logic.

    __bpf_raw_tp_map section logic was contributed by Steven Rostedt

    Signed-off-by: Alexei Starovoitov
    Signed-off-by: Steven Rostedt (VMware)
    Acked-by: Steven Rostedt (VMware)
    Signed-off-by: Daniel Borkmann

    Alexei Starovoitov
     

02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

09 Dec, 2016

1 commit

  • Some tracepoints have a registration function that gets enabled when the
    tracepoint is enabled. There may be cases that the registraction function
    must fail (for example, can't allocate enough memory). In this case, the
    tracepoint should also fail to register, otherwise the user would not know
    why the tracepoint is not working.

    Cc: David Howells
    Cc: Seiji Aguchi
    Cc: Anton Blanchard
    Cc: Mathieu Desnoyers
    Signed-off-by: Steven Rostedt

    Steven Rostedt (Red Hat)
     

16 Mar, 2016

1 commit

  • The following patch will need to declare array of struct
    trace_print_flags in a header. To prevent this header from pulling in
    all of RCU through trace_events.h, move the struct
    trace_print_flags{_64} definitions to the new lightweight
    tracepoint-defs.h header.

    Signed-off-by: Vlastimil Babka
    Acked-by: David Rientjes
    Cc: Steven Rostedt
    Cc: Peter Zijlstra
    Cc: Arnaldo Carvalho de Melo
    Cc: Ingo Molnar
    Cc: Rasmus Villemoes
    Cc: Joonsoo Kim
    Cc: Minchan Kim
    Cc: Sasha Levin
    Cc: "Kirill A. Shutemov"
    Cc: Mel Gorman
    Cc: Michal Hocko
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Vlastimil Babka
     

06 Dec, 2015

1 commit

  • Steven recommended open coding access to tracepoint->key to add
    trace points to headers. Unfortunately this is difficult for some
    headers (such as x86 asm/msr.h) because including tracepoint.h
    includes so many other headers that it causes include loops.
    The main problem is the include of linux/rcupdate.h, which
    pulls in a lot of other headers. The rcu header is only needed
    when actually defining trace points.

    Move the struct tracepoint into a separate tracepoint-defs.h
    header that can be included without pulling in all of RCU.

    Signed-off-by: Andi Kleen
    Signed-off-by: Peter Zijlstra (Intel)
    Acked-by: Steven Rostedt
    Cc: Arnaldo Carvalho de Melo
    Cc: Jiri Olsa
    Cc: Linus Torvalds
    Cc: Mike Galbraith
    Cc: Peter Zijlstra
    Cc: Stephane Eranian
    Cc: Thomas Gleixner
    Cc: Vince Weaver
    Link: http://lkml.kernel.org/r/1449018060-1742-2-git-send-email-andi@firstfloor.org
    Signed-off-by: Ingo Molnar

    Andi Kleen