lkml.org 
[lkml]   [2021]   [Oct]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[for-next][PATCH 29/40] ftrace/samples: Add multi direct interface test module
    From: Jiri Olsa <jolsa@redhat.com>

    Adding simple module that uses multi direct interface:

    register_ftrace_direct_multi
    unregister_ftrace_direct_multi

    The init function registers trampoline for 2 functions,
    and exit function unregisters them.

    Link: https://lkml.kernel.org/r/20211008091336.33616-9-jolsa@kernel.org

    Signed-off-by: Jiri Olsa <jolsa@kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    ---
    samples/ftrace/Makefile | 1 +
    samples/ftrace/ftrace-direct-multi.c | 52 ++++++++++++++++++++++++++++
    2 files changed, 53 insertions(+)
    create mode 100644 samples/ftrace/ftrace-direct-multi.c

    diff --git a/samples/ftrace/Makefile b/samples/ftrace/Makefile
    index 4ce896e10b2e..ab1d1c05c288 100644
    --- a/samples/ftrace/Makefile
    +++ b/samples/ftrace/Makefile
    @@ -3,6 +3,7 @@
    obj-$(CONFIG_SAMPLE_FTRACE_DIRECT) += ftrace-direct.o
    obj-$(CONFIG_SAMPLE_FTRACE_DIRECT) += ftrace-direct-too.o
    obj-$(CONFIG_SAMPLE_FTRACE_DIRECT) += ftrace-direct-modify.o
    +obj-$(CONFIG_SAMPLE_FTRACE_DIRECT) += ftrace-direct-multi.o

    CFLAGS_sample-trace-array.o := -I$(src)
    obj-$(CONFIG_SAMPLE_TRACE_ARRAY) += sample-trace-array.o
    diff --git a/samples/ftrace/ftrace-direct-multi.c b/samples/ftrace/ftrace-direct-multi.c
    new file mode 100644
    index 000000000000..2a5b1fb7ac14
    --- /dev/null
    +++ b/samples/ftrace/ftrace-direct-multi.c
    @@ -0,0 +1,52 @@
    +// SPDX-License-Identifier: GPL-2.0-only
    +#include <linux/module.h>
    +
    +#include <linux/mm.h> /* for handle_mm_fault() */
    +#include <linux/ftrace.h>
    +#include <linux/sched/stat.h>
    +
    +void my_direct_func(unsigned long ip)
    +{
    + trace_printk("ip %lx\n", ip);
    +}
    +
    +extern void my_tramp(void *);
    +
    +asm (
    +" .pushsection .text, \"ax\", @progbits\n"
    +" .type my_tramp, @function\n"
    +" .globl my_tramp\n"
    +" my_tramp:"
    +" pushq %rbp\n"
    +" movq %rsp, %rbp\n"
    +" pushq %rdi\n"
    +" movq 8(%rbp), %rdi\n"
    +" call my_direct_func\n"
    +" popq %rdi\n"
    +" leave\n"
    +" ret\n"
    +" .size my_tramp, .-my_tramp\n"
    +" .popsection\n"
    +);
    +
    +static struct ftrace_ops direct;
    +
    +static int __init ftrace_direct_multi_init(void)
    +{
    + ftrace_set_filter_ip(&direct, (unsigned long) wake_up_process, 0, 0);
    + ftrace_set_filter_ip(&direct, (unsigned long) schedule, 0, 0);
    +
    + return register_ftrace_direct_multi(&direct, (unsigned long) my_tramp);
    +}
    +
    +static void __exit ftrace_direct_multi_exit(void)
    +{
    + unregister_ftrace_direct_multi(&direct, (unsigned long) my_tramp);
    +}
    +
    +module_init(ftrace_direct_multi_init);
    +module_exit(ftrace_direct_multi_exit);
    +
    +MODULE_AUTHOR("Jiri Olsa");
    +MODULE_DESCRIPTION("Example use case of using register_ftrace_direct_multi()");
    +MODULE_LICENSE("GPL");
    --
    2.33.0
    \
     
     \ /
      Last update: 2021-10-22 22:52    [W:4.357 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site