lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 739/779] tracing: Add __rel_loc using trace event macros
    Date
    From: Masami Hiramatsu <mhiramat@kernel.org>

    [ Upstream commit 55de2c0b5610cba5a5a93c0788031133c457e689 ]

    Add '__rel_loc' using trace event macros. These macros are usually
    not used in the kernel, except for testing purpose.
    This also add "rel_" variant of macros for dynamic_array string,
    and bitmask.

    Link: https://lkml.kernel.org/r/163757342119.510314.816029622439099016.stgit@devnote2

    Cc: Beau Belgrave <beaub@linux.microsoft.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Tom Zanussi <zanussi@kernel.org>
    Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    include/trace/bpf_probe.h | 16 +++++
    include/trace/perf.h | 16 +++++
    include/trace/trace_events.h | 120 ++++++++++++++++++++++++++++++++++-
    kernel/trace/trace.h | 3 +
    4 files changed, 153 insertions(+), 2 deletions(-)

    diff --git a/include/trace/bpf_probe.h b/include/trace/bpf_probe.h
    index a23be89119aa..04939b2d2f19 100644
    --- a/include/trace/bpf_probe.h
    +++ b/include/trace/bpf_probe.h
    @@ -21,6 +21,22 @@
    #undef __get_bitmask
    #define __get_bitmask(field) (char *)__get_dynamic_array(field)

    +#undef __get_rel_dynamic_array
    +#define __get_rel_dynamic_array(field) \
    + ((void *)(&__entry->__rel_loc_##field) + \
    + sizeof(__entry->__rel_loc_##field) + \
    + (__entry->__rel_loc_##field & 0xffff))
    +
    +#undef __get_rel_dynamic_array_len
    +#define __get_rel_dynamic_array_len(field) \
    + ((__entry->__rel_loc_##field >> 16) & 0xffff)
    +
    +#undef __get_rel_str
    +#define __get_rel_str(field) ((char *)__get_rel_dynamic_array(field))
    +
    +#undef __get_rel_bitmask
    +#define __get_rel_bitmask(field) (char *)__get_rel_dynamic_array(field)
    +
    #undef __perf_count
    #define __perf_count(c) (c)

    diff --git a/include/trace/perf.h b/include/trace/perf.h
    index dbc6c74defc3..ea4405de175a 100644
    --- a/include/trace/perf.h
    +++ b/include/trace/perf.h
    @@ -21,6 +21,22 @@
    #undef __get_bitmask
    #define __get_bitmask(field) (char *)__get_dynamic_array(field)

    +#undef __get_rel_dynamic_array
    +#define __get_rel_dynamic_array(field) \
    + ((void *)(&__entry->__rel_loc_##field) + \
    + sizeof(__entry->__rel_loc_##field) + \
    + (__entry->__rel_loc_##field & 0xffff))
    +
    +#undef __get_rel_dynamic_array_len
    +#define __get_rel_dynamic_array_len(field) \
    + ((__entry->__rel_loc_##field >> 16) & 0xffff)
    +
    +#undef __get_rel_str
    +#define __get_rel_str(field) ((char *)__get_rel_dynamic_array(field))
    +
    +#undef __get_rel_bitmask
    +#define __get_rel_bitmask(field) (char *)__get_rel_dynamic_array(field)
    +
    #undef __perf_count
    #define __perf_count(c) (__count = (c))

    diff --git a/include/trace/trace_events.h b/include/trace/trace_events.h
    index 08810a463880..8c6f7c433518 100644
    --- a/include/trace/trace_events.h
    +++ b/include/trace/trace_events.h
    @@ -108,6 +108,18 @@ TRACE_MAKE_SYSTEM_STR();
    #undef __bitmask
    #define __bitmask(item, nr_bits) __dynamic_array(char, item, -1)

    +#undef __rel_dynamic_array
    +#define __rel_dynamic_array(type, item, len) u32 __rel_loc_##item;
    +
    +#undef __rel_string
    +#define __rel_string(item, src) __rel_dynamic_array(char, item, -1)
    +
    +#undef __rel_string_len
    +#define __rel_string_len(item, src, len) __rel_dynamic_array(char, item, -1)
    +
    +#undef __rel_bitmask
    +#define __rel_bitmask(item, nr_bits) __rel_dynamic_array(char, item, -1)
    +
    #undef TP_STRUCT__entry
    #define TP_STRUCT__entry(args...) args

    @@ -200,11 +212,23 @@ TRACE_MAKE_SYSTEM_STR();
    #undef __string
    #define __string(item, src) __dynamic_array(char, item, -1)

    +#undef __bitmask
    +#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
    +
    #undef __string_len
    #define __string_len(item, src, len) __dynamic_array(char, item, -1)

    -#undef __bitmask
    -#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
    +#undef __rel_dynamic_array
    +#define __rel_dynamic_array(type, item, len) u32 item;
    +
    +#undef __rel_string
    +#define __rel_string(item, src) __rel_dynamic_array(char, item, -1)
    +
    +#undef __rel_string_len
    +#define __rel_string_len(item, src, len) __rel_dynamic_array(char, item, -1)
    +
    +#undef __rel_bitmask
    +#define __rel_bitmask(item, nr_bits) __rel_dynamic_array(unsigned long, item, -1)

    #undef DECLARE_EVENT_CLASS
    #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
    @@ -293,6 +317,19 @@ TRACE_MAKE_SYSTEM_STR();
    #undef __get_str
    #define __get_str(field) ((char *)__get_dynamic_array(field))

    +#undef __get_rel_dynamic_array
    +#define __get_rel_dynamic_array(field) \
    + ((void *)(&__entry->__rel_loc_##field) + \
    + sizeof(__entry->__rel_loc_##field) + \
    + (__entry->__rel_loc_##field & 0xffff))
    +
    +#undef __get_rel_dynamic_array_len
    +#define __get_rel_dynamic_array_len(field) \
    + ((__entry->__rel_loc_##field >> 16) & 0xffff)
    +
    +#undef __get_rel_str
    +#define __get_rel_str(field) ((char *)__get_rel_dynamic_array(field))
    +
    #undef __get_bitmask
    #define __get_bitmask(field) \
    ({ \
    @@ -302,6 +339,15 @@ TRACE_MAKE_SYSTEM_STR();
    trace_print_bitmask_seq(p, __bitmask, __bitmask_size); \
    })

    +#undef __get_rel_bitmask
    +#define __get_rel_bitmask(field) \
    + ({ \
    + void *__bitmask = __get_rel_dynamic_array(field); \
    + unsigned int __bitmask_size; \
    + __bitmask_size = __get_rel_dynamic_array_len(field); \
    + trace_print_bitmask_seq(p, __bitmask, __bitmask_size); \
    + })
    +
    #undef __print_flags
    #define __print_flags(flag, delim, flag_array...) \
    ({ \
    @@ -471,6 +517,21 @@ static struct trace_event_functions trace_event_type_funcs_##call = { \
    #undef __bitmask
    #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)

    +#undef __rel_dynamic_array
    +#define __rel_dynamic_array(_type, _item, _len) { \
    + .type = "__rel_loc " #_type "[]", .name = #_item, \
    + .size = 4, .align = 4, \
    + .is_signed = is_signed_type(_type), .filter_type = FILTER_OTHER },
    +
    +#undef __rel_string
    +#define __rel_string(item, src) __rel_dynamic_array(char, item, -1)
    +
    +#undef __rel_string_len
    +#define __rel_string_len(item, src, len) __rel_dynamic_array(char, item, -1)
    +
    +#undef __rel_bitmask
    +#define __rel_bitmask(item, nr_bits) __rel_dynamic_array(unsigned long, item, -1)
    +
    #undef DECLARE_EVENT_CLASS
    #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print) \
    static struct trace_event_fields trace_event_fields_##call[] = { \
    @@ -519,6 +580,22 @@ static struct trace_event_fields trace_event_fields_##call[] = { \
    #undef __string_len
    #define __string_len(item, src, len) __dynamic_array(char, item, (len) + 1)

    +#undef __rel_dynamic_array
    +#define __rel_dynamic_array(type, item, len) \
    + __item_length = (len) * sizeof(type); \
    + __data_offsets->item = __data_size + \
    + offsetof(typeof(*entry), __data) - \
    + offsetof(typeof(*entry), __rel_loc_##item) - \
    + sizeof(u32); \
    + __data_offsets->item |= __item_length << 16; \
    + __data_size += __item_length;
    +
    +#undef __rel_string
    +#define __rel_string(item, src) __rel_dynamic_array(char, item, \
    + strlen((src) ? (const char *)(src) : "(null)") + 1)
    +
    +#undef __rel_string_len
    +#define __rel_string_len(item, src, len) __rel_dynamic_array(char, item, (len) + 1)
    /*
    * __bitmask_size_in_bytes_raw is the number of bytes needed to hold
    * num_possible_cpus().
    @@ -542,6 +619,10 @@ static struct trace_event_fields trace_event_fields_##call[] = { \
    #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, \
    __bitmask_size_in_longs(nr_bits))

    +#undef __rel_bitmask
    +#define __rel_bitmask(item, nr_bits) __rel_dynamic_array(unsigned long, item, \
    + __bitmask_size_in_longs(nr_bits))
    +
    #undef DECLARE_EVENT_CLASS
    #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
    static inline notrace int trace_event_get_offsets_##call( \
    @@ -706,6 +787,37 @@ static inline notrace int trace_event_get_offsets_##call( \
    #define __assign_bitmask(dst, src, nr_bits) \
    memcpy(__get_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits))

    +#undef __rel_dynamic_array
    +#define __rel_dynamic_array(type, item, len) \
    + __entry->__rel_loc_##item = __data_offsets.item;
    +
    +#undef __rel_string
    +#define __rel_string(item, src) __rel_dynamic_array(char, item, -1)
    +
    +#undef __rel_string_len
    +#define __rel_string_len(item, src, len) __rel_dynamic_array(char, item, -1)
    +
    +#undef __assign_rel_str
    +#define __assign_rel_str(dst, src) \
    + strcpy(__get_rel_str(dst), (src) ? (const char *)(src) : "(null)");
    +
    +#undef __assign_rel_str_len
    +#define __assign_rel_str_len(dst, src, len) \
    + do { \
    + memcpy(__get_rel_str(dst), (src), (len)); \
    + __get_rel_str(dst)[len] = '\0'; \
    + } while (0)
    +
    +#undef __rel_bitmask
    +#define __rel_bitmask(item, nr_bits) __rel_dynamic_array(unsigned long, item, -1)
    +
    +#undef __get_rel_bitmask
    +#define __get_rel_bitmask(field) (char *)__get_rel_dynamic_array(field)
    +
    +#undef __assign_rel_bitmask
    +#define __assign_rel_bitmask(dst, src, nr_bits) \
    + memcpy(__get_rel_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits))
    +
    #undef TP_fast_assign
    #define TP_fast_assign(args...) args

    @@ -770,6 +882,10 @@ static inline void ftrace_test_probe_##call(void) \
    #undef __get_dynamic_array_len
    #undef __get_str
    #undef __get_bitmask
    +#undef __get_rel_dynamic_array
    +#undef __get_rel_dynamic_array_len
    +#undef __get_rel_str
    +#undef __get_rel_bitmask
    #undef __print_array
    #undef __print_hex_dump

    diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
    index d6763366a320..28ea6c0be495 100644
    --- a/kernel/trace/trace.h
    +++ b/kernel/trace/trace.h
    @@ -83,6 +83,9 @@ enum trace_type {
    #undef __dynamic_array
    #define __dynamic_array(type, item) type item[];

    +#undef __rel_dynamic_array
    +#define __rel_dynamic_array(type, item) type item[];
    +
    #undef F_STRUCT
    #define F_STRUCT(args...) args

    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-15 21:57    [W:4.121 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site