tracing: Add __cpumask to denote a trace event field that is a cpumask_t
authorSteven Rostedt (Google) <rostedt@goodmis.org>
Fri, 14 Oct 2022 12:04:56 +0000 (08:04 -0400)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Thu, 24 Nov 2022 00:08:30 +0000 (19:08 -0500)
The trace events have a __bitmask field that can be used for anything
that requires bitmasks. Although currently it is only used for CPU
masks, it could be used in the future for any type of bitmasks.

There is some user space tooling that wants to know if a field is a CPU
mask and not just some random unsigned long bitmask. Introduce
"__cpumask()" helper functions that work the same as the current
__bitmask() helpers but displays in the format file:

  field:__data_loc cpumask_t *[] mask;    offset:36;      size:4; signed:0;

Instead of:

  field:__data_loc unsigned long[] mask;  offset:32;      size:4; signed:0;

The main difference is the type. Instead of "unsigned long" it is
"cpumask_t *". Note, this type field needs to be a real type in the
__dynamic_array() logic that both __cpumask and__bitmask use, but the
comparison field requires it to be a scalar type whereas cpumask_t is a
structure (non-scalar). But everything works when making it a pointer.

Valentin added changes to remove the need of passing in "nr_bits" and the
__cpumask will always use nr_cpumask_bits as its size.

Link: https://lkml.kernel.org/r/20221014080456.1d32b989@rorschach.local.home
Requested-by: Valentin Schneider <vschneid@redhat.com>
Reviewed-by: Valentin Schneider <vschneid@redhat.com>
Signed-off-by: Valentin Schneider <vschneid@redhat.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
include/trace/bpf_probe.h
include/trace/perf.h
include/trace/stages/stage1_struct_define.h
include/trace/stages/stage2_data_offsets.h
include/trace/stages/stage3_trace_output.h
include/trace/stages/stage4_event_fields.h
include/trace/stages/stage5_get_offsets.h
include/trace/stages/stage6_event_callback.h
include/trace/stages/stage7_class_define.h
samples/trace_events/trace-events-sample.c
samples/trace_events/trace-events-sample.h

index 6a13220d2d27b0f09851275a90e7ff63032b174c..155c495b89eadf07bbf5f8172cef87e1e8fc056c 100644 (file)
@@ -21,6 +21,9 @@
 #undef __get_bitmask
 #define __get_bitmask(field) (char *)__get_dynamic_array(field)
 
+#undef __get_cpumask
+#define __get_cpumask(field) (char *)__get_dynamic_array(field)
+
 #undef __get_sockaddr
 #define __get_sockaddr(field) ((struct sockaddr *)__get_dynamic_array(field))
 
@@ -40,6 +43,9 @@
 #undef __get_rel_bitmask
 #define __get_rel_bitmask(field) (char *)__get_rel_dynamic_array(field)
 
+#undef __get_rel_cpumask
+#define __get_rel_cpumask(field) (char *)__get_rel_dynamic_array(field)
+
 #undef __get_rel_sockaddr
 #define __get_rel_sockaddr(field) ((struct sockaddr *)__get_rel_dynamic_array(field))
 
index 5800d13146c3d0cdf4eb474a3bb895dd71753de4..8f3bf1e177070e1ab7750fd9554fefb66235f3ae 100644 (file)
@@ -21,6 +21,9 @@
 #undef __get_bitmask
 #define __get_bitmask(field) (char *)__get_dynamic_array(field)
 
+#undef __get_cpumask
+#define __get_cpumask(field) (char *)__get_dynamic_array(field)
+
 #undef __get_sockaddr
 #define __get_sockaddr(field) ((struct sockaddr *)__get_dynamic_array(field))
 
@@ -41,6 +44,9 @@
 #undef __get_rel_bitmask
 #define __get_rel_bitmask(field) (char *)__get_rel_dynamic_array(field)
 
+#undef __get_rel_cpumask
+#define __get_rel_cpumask(field) (char *)__get_rel_dynamic_array(field)
+
 #undef __get_rel_sockaddr
 #define __get_rel_sockaddr(field) ((struct sockaddr *)__get_rel_dynamic_array(field))
 
index 1b7bab60434c150a2d2a7c2709adc3b4d6845c2f..69e0dae453bfa68cfe6ad7d5613a625954a8226a 100644 (file)
@@ -32,6 +32,9 @@
 #undef __bitmask
 #define __bitmask(item, nr_bits) __dynamic_array(char, item, -1)
 
+#undef __cpumask
+#define __cpumask(item) __dynamic_array(char, item, -1)
+
 #undef __sockaddr
 #define __sockaddr(field, len) __dynamic_array(u8, field, len)
 
@@ -47,6 +50,9 @@
 #undef __rel_bitmask
 #define __rel_bitmask(item, nr_bits) __rel_dynamic_array(char, item, -1)
 
+#undef __rel_cpumask
+#define __rel_cpumask(item) __rel_dynamic_array(char, item, -1)
+
 #undef __rel_sockaddr
 #define __rel_sockaddr(field, len) __rel_dynamic_array(u8, field, len)
 
index 1b7a8f764fddd5439e6dd2ec61870bfc67f78183..469b6a64293de14d00d141eb4daa7f07fee1a650 100644 (file)
@@ -38,6 +38,9 @@
 #undef __bitmask
 #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
 
+#undef __cpumask
+#define __cpumask(item) __dynamic_array(unsigned long, item, -1)
+
 #undef __sockaddr
 #define __sockaddr(field, len) __dynamic_array(u8, field, len)
 
@@ -53,5 +56,8 @@
 #undef __rel_bitmask
 #define __rel_bitmask(item, nr_bits) __rel_dynamic_array(unsigned long, item, -1)
 
+#undef __rel_cpumask
+#define __rel_cpumask(item) __rel_dynamic_array(unsigned long, item, -1)
+
 #undef __rel_sockaddr
 #define __rel_sockaddr(field, len) __rel_dynamic_array(u8, field, len)
index e3b183e9d18ea1d5687902f887213aa42acaa474..66374df61ed305931fef66a191ff1b9d5ccb2e6a 100644 (file)
@@ -42,6 +42,9 @@
                trace_print_bitmask_seq(p, __bitmask, __bitmask_size);  \
        })
 
+#undef __get_cpumask
+#define __get_cpumask(field) __get_bitmask(field)
+
 #undef __get_rel_bitmask
 #define __get_rel_bitmask(field)                                               \
        ({                                                              \
@@ -51,6 +54,9 @@
                trace_print_bitmask_seq(p, __bitmask, __bitmask_size);  \
        })
 
+#undef __get_rel_cpumask
+#define __get_rel_cpumask(field) __get_rel_bitmask(field)
+
 #undef __get_sockaddr
 #define __get_sockaddr(field)  ((struct sockaddr *)__get_dynamic_array(field))
 
index a8fb25f39a99dc2671d06bfb352e2841b83b12cd..f2990d22313cf818a79574502473a56042de9e4d 100644 (file)
@@ -46,6 +46,9 @@
 #undef __bitmask
 #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
 
+#undef __cpumask
+#define __cpumask(item) __dynamic_array(cpumask_t *, item, -1)
+
 #undef __sockaddr
 #define __sockaddr(field, len) __dynamic_array(u8, field, len)
 
@@ -64,5 +67,8 @@
 #undef __rel_bitmask
 #define __rel_bitmask(item, nr_bits) __rel_dynamic_array(unsigned long, item, -1)
 
+#undef __rel_cpumask
+#define __rel_cpumask(item) __rel_dynamic_array(cpumask_t *, item, -1)
+
 #undef __rel_sockaddr
 #define __rel_sockaddr(field, len) __rel_dynamic_array(u8, field, len)
index fba4c24ed9e60d519d60dc23514a83686cc427e4..ac5c24d3beeb24950996b07803ced5ccda09ca6f 100644 (file)
 #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item,  \
                                         __bitmask_size_in_longs(nr_bits))
 
+#undef __cpumask
+#define __cpumask(item) __bitmask(item, nr_cpumask_bits)
+
 #undef __rel_bitmask
 #define __rel_bitmask(item, nr_bits) __rel_dynamic_array(unsigned long, item,  \
                                         __bitmask_size_in_longs(nr_bits))
 
+#undef __rel_cpumask
+#define __rel_cpumask(item) __rel_bitmask(item, nr_cpumask_bits)
+
 #undef __sockaddr
 #define __sockaddr(field, len) __dynamic_array(u8, field, len)
 
index 3c554a58532040c555f17cf3d159363c58980926..49c32394b53fb73f1890faf1de84698017d58b0e 100644 (file)
 #define __assign_bitmask(dst, src, nr_bits)                                    \
        memcpy(__get_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits))
 
+#undef __cpumask
+#define __cpumask(item) __dynamic_array(unsigned long, item, -1)
+
+#undef __get_cpumask
+#define __get_cpumask(field) (char *)__get_dynamic_array(field)
+
+#undef __assign_cpumask
+#define __assign_cpumask(dst, src)                                     \
+       memcpy(__get_cpumask(dst), (src), __bitmask_size_in_bytes(nr_cpumask_bits))
+
 #undef __sockaddr
 #define __sockaddr(field, len) __dynamic_array(u8, field, len)
 
 #define __assign_rel_bitmask(dst, src, nr_bits)                                        \
        memcpy(__get_rel_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits))
 
+#undef __rel_cpumask
+#define __rel_cpumask(item) __rel_dynamic_array(unsigned long, item, -1)
+
+#undef __get_rel_cpumask
+#define __get_rel_cpumask(field) (char *)__get_rel_dynamic_array(field)
+
+#undef __assign_rel_cpumask
+#define __assign_rel_cpumask(dst, src)                                 \
+       memcpy(__get_rel_cpumask(dst), (src), __bitmask_size_in_bytes(nr_cpumask_bits))
+
 #undef __rel_sockaddr
 #define __rel_sockaddr(field, len) __rel_dynamic_array(u8, field, len)
 
index 8a7ec24c246dd8f88d87229506d1061d33af3ad6..8795429f388b05ee9ac62b197ec7544969970e08 100644 (file)
 #undef __get_dynamic_array_len
 #undef __get_str
 #undef __get_bitmask
+#undef __get_cpumask
 #undef __get_sockaddr
 #undef __get_rel_dynamic_array
 #undef __get_rel_dynamic_array_len
 #undef __get_rel_str
 #undef __get_rel_bitmask
+#undef __get_rel_cpumask
 #undef __get_rel_sockaddr
 #undef __print_array
 #undef __print_hex_dump
index 608c4ae3b08a3ad4e41c276bb7df62444e467646..ecc7db237f2eff15054b4b237f14fcdc392d9e1b 100644 (file)
@@ -50,7 +50,7 @@ static void do_simple_thread_func(int cnt, const char *fmt, ...)
 
        trace_foo_with_template_print("I have to be different", cnt);
 
-       trace_foo_rel_loc("Hello __rel_loc", cnt, bitmask);
+       trace_foo_rel_loc("Hello __rel_loc", cnt, bitmask, current->cpus_ptr);
 }
 
 static void simple_thread_func(int cnt)
index 1a92226202fc5d0be29b237f35f8db37d6bd2d84..fb4548a44153ca679dc910f2378a73bd69266091 100644 (file)
  *
  *         __assign_bitmask(target_cpus, cpumask_bits(bar), nr_cpumask_bits);
  *
+ *   __cpumask: This is pretty much the same as __bitmask but is specific for
+ *         CPU masks. The type displayed to the user via the format files will
+ *         be "cpumaks_t" such that user space may deal with them differently
+ *         if they choose to do so, and the bits is always set to nr_cpumask_bits.
+ *
+ *         __cpumask(target_cpu)
+ *
+ *         To assign a cpumask, use the __assign_cpumask() helper macro.
+ *
+ *         __assign_cpumask(target_cpus, cpumask_bits(bar));
  *
  * fast_assign: This is a C like function that is used to store the items
  *    into the ring buffer. A special variable called "__entry" will be the
  *    This is also used to print out the data from the trace files.
  *    Again, the __entry macro is used to access the data from the ring buffer.
  *
- *    Note, __dynamic_array, __string, and __bitmask require special helpers
- *       to access the data.
+ *    Note, __dynamic_array, __string, __bitmask and __cpumask require special
+ *       helpers to access the data.
  *
  *      For __dynamic_array(int, foo, bar) use __get_dynamic_array(foo)
  *            Use __get_dynamic_array_len(foo) to get the length of the array
  *
  *      For __bitmask(target_cpus, nr_cpumask_bits) use __get_bitmask(target_cpus)
  *
+ *      For __cpumask(target_cpus) use __get_cpumask(target_cpus)
+ *
  *
  * Note, that for both the assign and the printk, __entry is the handler
  * to the data structure in the ring buffer, and is defined by the
@@ -288,6 +300,7 @@ TRACE_EVENT(foo_bar,
                __dynamic_array(int,    list,   __length_of(lst))
                __string(       str,    string                  )
                __bitmask(      cpus,   num_possible_cpus()     )
+               __cpumask(      cpum                            )
                __vstring(      vstr,   fmt,    va              )
        ),
 
@@ -299,9 +312,10 @@ TRACE_EVENT(foo_bar,
                __assign_str(str, string);
                __assign_vstr(vstr, fmt, va);
                __assign_bitmask(cpus, cpumask_bits(mask), num_possible_cpus());
+               __assign_cpumask(cpum, cpumask_bits(mask));
        ),
 
-       TP_printk("foo %s %d %s %s %s %s (%s) %s", __entry->foo, __entry->bar,
+       TP_printk("foo %s %d %s %s %s %s (%s) (%s) %s", __entry->foo, __entry->bar,
 
 /*
  * Notice here the use of some helper functions. This includes:
@@ -345,7 +359,8 @@ TRACE_EVENT(foo_bar,
                  __print_array(__get_dynamic_array(list),
                                __get_dynamic_array_len(list) / sizeof(int),
                                sizeof(int)),
-                 __get_str(str), __get_bitmask(cpus), __get_str(vstr))
+                 __get_str(str), __get_bitmask(cpus), __get_cpumask(cpus),
+                 __get_str(vstr))
 );
 
 /*
@@ -542,15 +557,16 @@ DEFINE_EVENT_PRINT(foo_template, foo_with_template_print,
 
 TRACE_EVENT(foo_rel_loc,
 
-       TP_PROTO(const char *foo, int bar, unsigned long *mask),
+       TP_PROTO(const char *foo, int bar, unsigned long *mask, const cpumask_t *cpus),
 
-       TP_ARGS(foo, bar, mask),
+       TP_ARGS(foo, bar, mask, cpus),
 
        TP_STRUCT__entry(
                __rel_string(   foo,    foo     )
                __field(        int,    bar     )
                __rel_bitmask(  bitmask,
                        BITS_PER_BYTE * sizeof(unsigned long)   )
+               __rel_cpumask(  cpumask )
        ),
 
        TP_fast_assign(
@@ -558,10 +574,12 @@ TRACE_EVENT(foo_rel_loc,
                __entry->bar = bar;
                __assign_rel_bitmask(bitmask, mask,
                        BITS_PER_BYTE * sizeof(unsigned long));
+               __assign_rel_cpumask(cpumask, cpus);
        ),
 
-       TP_printk("foo_rel_loc %s, %d, %s", __get_rel_str(foo), __entry->bar,
-                 __get_rel_bitmask(bitmask))
+       TP_printk("foo_rel_loc %s, %d, %s, %s", __get_rel_str(foo), __entry->bar,
+                 __get_rel_bitmask(bitmask),
+                 __get_rel_cpumask(cpumask))
 );
 #endif