On Wed, Jun 3, 2026, at 09:15, Rasmus Villemoes wrote:
> On Tue, Jun 02 2026, "Arnd Bergmann" <[email protected]> wrote:
>> On Tue, Jun 2, 2026, at 20:59, Andy Shevchenko wrote:
>>> On Tue, Jun 02, 2026 at 05:07:05PM +0200, Arnd Bergmann wrote:
>
> May I suggest a different approach, that avoids having that extra
> function emitted (which presumably compiles to a single jump
> instruction, but still, with retpoline and CFI and all that it all adds
> up): Keep the declaration of __vsnprintf() in the header without the
> __print() attribute, but then do
>
> int __vsnprintf(char *buf, size_t size, const char *fmt_str, va_list args) 
>    __alias(vsnprintf);
>
> in vsprintf.c. Aside from reusing the same entry point, I could well
> imagine a compiler some day complaining about seeing the printf
> attribute applied in a local extra declaration but not having it in the
> header file.
>
> Presumably it will need its own EXPORT_SYMBOL if any of the intended
> users are modular, and it certainly still needs a comment.

I had tried that earlier but given up because the attributes have to
match exactly.

This definition works with all currently supported versions of gcc,
but may have to change when the there is a new version that adds
even more attributes:

int
__printf(3, 0)
__attribute__((nothrow))
__attribute__((nonnull(1)))
__vsnprintf(char *__restrict buf, size_t size,
            const char * __restrict fmt_str, va_list args)
               __alias(vsnprintf);

We'd probably want to also add __nothrow and __nonnull macros
in linux/compiler-attributes.h if we do this.

For reference, see below for the alternative idea I had
that avoids adding the __vsnprintf() alias altogether by
passing down the va_format using "%pV".

I don't think I actually got this one right in the end
since I only build-tested it, but I expect it could be done
if someone is able to test and fix all the corner cases
properly.

       Arnd

diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h
index 4715330c7b6b..8e44fc3e60b0 100644
--- a/include/linux/trace_events.h
+++ b/include/linux/trace_events.h
@@ -956,14 +956,11 @@ perf_trace_buf_submit(void *raw_data, int size, int rctx, 
u16 type,
  * gcc warns that you can not use a va_list in an inlined
  * function. But lets me make it into a macro :-/
  */
-#define __trace_event_vstr_len(fmt, va)                        \
+#define __trace_event_vstr_len(vf)                     \
 ({                                                     \
-       va_list __ap;                                   \
        int __ret;                                      \
                                                        \
-       va_copy(__ap, *(va));                           \
-       __ret = __vsnprintf(NULL, 0, fmt, __ap) + 1;    \
-       va_end(__ap);                                   \
+       __ret = snprintf(NULL, 0, "%pV", vf) + 1;       \
                                                        \
        min(__ret, TRACE_EVENT_STR_MAX);                \
 })
diff --git a/samples/trace_events/trace-events-sample.h 
b/samples/trace_events/trace-events-sample.h
index 1a05fc153353..2f3ee3632e77 100644
--- a/samples/trace_events/trace-events-sample.h
+++ b/samples/trace_events/trace-events-sample.h
@@ -143,20 +143,20 @@
  *         saved string into the "foo" field.
  *
  *   __vstring: This is similar to __string() but instead of taking a
- *         dynamic length, it takes a variable list va_list 'va' variable.
+ *         dynamic length, it takes a variable list va_format 'vaf' variable.
  *         Some event callers already have a message from parameters saved
- *         in a va_list. Passing in the format and the va_list variable
- *         will save just enough on the ring buffer for that string.
- *         Note, the va variable used is a pointer to a va_list, not
- *         to the va_list directly.
+ *         in a va_format. Passing in the va_format variable will save just
+ *        enough on the ring buffer for that string.
  *
- *           (va_list *va)
+ *           (va_format *vaf)
  *
- *         __vstring(foo, fmt, va)  is similar to:  vsnprintf(foo, fmt, va)
+ *         __vstring(foo, vaf)  is similar to:
+ *
+ *          vsnprintf(foo, "%pV", vaf)
  *
  *         To assign the string, use the helper macro __assign_vstr().
  *
- *         __assign_vstr(foo, fmt, va);
+ *         __assign_vstr(foo, vaf);
  *
  *         In most cases, the __assign_vstr() macro will take the same
  *         parameters as the __vstring() macro had to declare the string.
@@ -292,9 +292,9 @@ TRACE_EVENT(foo_bar,
 
        TP_PROTO(const char *foo, int bar, const int *lst,
                 const char *string, const struct cpumask *mask,
-                const char *fmt, va_list *va),
+                struct va_format *vaf),
 
-       TP_ARGS(foo, bar, lst, string, mask, fmt, va),
+       TP_ARGS(foo, bar, lst, string, mask, vaf),
 
        TP_STRUCT__entry(
                __array(        char,   foo,    10              )
@@ -303,7 +303,7 @@ TRACE_EVENT(foo_bar,
                __string(       str,    string                  )
                __bitmask(      cpus,   num_possible_cpus()     )
                __cpumask(      cpum                            )
-               __vstring(      vstr,   fmt,    va              )
+               __vstring(      vstr,   vaf                     )
                __string_len(   lstr,   foo,    bar / 2 < strlen(foo) ? bar / 2 
: strlen(foo) )
        ),
 
@@ -314,7 +314,7 @@ TRACE_EVENT(foo_bar,
                       __length_of(lst) * sizeof(int));
                __assign_str(str);
                __assign_str(lstr);
-               __assign_vstr(vstr, fmt, va);
+               __assign_vstr(vstr, vaf);
                __assign_bitmask(cpus, cpumask_bits(mask), num_possible_cpus());
                __assign_cpumask(cpum, cpumask_bits(mask));
        ),
diff --git a/include/trace/stages/stage6_event_callback.h 
b/include/trace/stages/stage6_event_callback.h
index 7d6a6ca6e779..2a4611b20afa 100644
--- a/include/trace/stages/stage6_event_callback.h
+++ b/include/trace/stages/stage6_event_callback.h
@@ -28,7 +28,7 @@
 #define __string_len(item, src, len) __dynamic_array(char, item, -1)
 
 #undef __vstring
-#define __vstring(item, fmt, ap) __dynamic_array(char, item, -1)
+#define __vstring(item, vf) __dynamic_array(char, item, -1)
 
 #undef __assign_str
 #define __assign_str(dst)                                              \
@@ -41,13 +41,8 @@
        } while (0)
 
 #undef __assign_vstr
-#define __assign_vstr(dst, fmt, va)                                    \
-       do {                                                            \
-               va_list __cp_va;                                        \
-               va_copy(__cp_va, *(va));                                \
-               __vsnprintf(__get_str(dst), TRACE_EVENT_STR_MAX, fmt, __cp_va); 
\
-               va_end(__cp_va);                                        \
-       } while (0)
+#define __assign_vstr(dst, vf)                                         \
+       snprintf(__get_str(dst), TRACE_EVENT_STR_MAX, "%pV", vf);
 
 #undef __bitmask
 #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
diff --git a/drivers/infiniband/hw/hfi1/trace_dbg.h 
b/drivers/infiniband/hw/hfi1/trace_dbg.h
index 05c4f1354269..c96144d516db 100644
--- a/drivers/infiniband/hw/hfi1/trace_dbg.h
+++ b/drivers/infiniband/hw/hfi1/trace_dbg.h
@@ -26,10 +26,10 @@ DECLARE_EVENT_CLASS(hfi1_trace_template,
                    TP_PROTO(const char *function, struct va_format *vaf),
                    TP_ARGS(function, vaf),
                    TP_STRUCT__entry(__string(function, function)
-                                    __vstring(msg, vaf->fmt, vaf->va)
+                                    __vstring(msg, vaf)
                                     ),
                    TP_fast_assign(__assign_str(function);
-                                  __assign_vstr(msg, vaf->fmt, vaf->va);
+                                  __assign_vstr(msg, vaf);
                                   ),
                    TP_printk("(%s) %s",
                              __get_str(function),
diff --git a/drivers/net/wireless/ath/ath10k/trace.h 
b/drivers/net/wireless/ath/ath10k/trace.h
index 68b78ca17eaa..c258ad7de79e 100644
--- a/drivers/net/wireless/ath/ath10k/trace.h
+++ b/drivers/net/wireless/ath/ath10k/trace.h
@@ -52,12 +52,12 @@ DECLARE_EVENT_CLASS(ath10k_log_event,
        TP_STRUCT__entry(
                __string(device, dev_name(ar->dev))
                __string(driver, dev_driver_string(ar->dev))
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
                __assign_str(device);
                __assign_str(driver);
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk(
                "%s %s %s",
@@ -89,13 +89,13 @@ TRACE_EVENT(ath10k_log_dbg,
                __string(device, dev_name(ar->dev))
                __string(driver, dev_driver_string(ar->dev))
                __field(unsigned int, level)
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
                __assign_str(device);
                __assign_str(driver);
                __entry->level = level;
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk(
                "%s %s %s",
diff --git a/drivers/net/wireless/ath/ath11k/trace.h 
b/drivers/net/wireless/ath/ath11k/trace.h
index 75246b0a82e3..0ac14b72deac 100644
--- a/drivers/net/wireless/ath/ath11k/trace.h
+++ b/drivers/net/wireless/ath/ath11k/trace.h
@@ -127,12 +127,12 @@ DECLARE_EVENT_CLASS(ath11k_log_event,
        TP_STRUCT__entry(
                __string(device, dev_name(ab->dev))
                __string(driver, dev_driver_string(ab->dev))
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
                __assign_str(device);
                __assign_str(driver);
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk(
                "%s %s %s",
diff --git a/drivers/net/wireless/ath/ath6kl/trace.h 
b/drivers/net/wireless/ath/ath6kl/trace.h
index 8577aa459c58..d46fe6b675f9 100644
--- a/drivers/net/wireless/ath/ath6kl/trace.h
+++ b/drivers/net/wireless/ath/ath6kl/trace.h
@@ -253,10 +253,10 @@ DECLARE_EVENT_CLASS(ath6kl_log_event,
        TP_PROTO(struct va_format *vaf),
        TP_ARGS(vaf),
        TP_STRUCT__entry(
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk("%s", __get_str(msg))
 );
@@ -281,11 +281,11 @@ TRACE_EVENT(ath6kl_log_dbg,
        TP_ARGS(level, vaf),
        TP_STRUCT__entry(
                __field(unsigned int, level)
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
                __entry->level = level;
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk("%s", __get_str(msg))
 );
diff --git a/drivers/net/wireless/ath/trace.h b/drivers/net/wireless/ath/trace.h
index 82aac0a4baff..298a56349ea7 100644
--- a/drivers/net/wireless/ath/trace.h
+++ b/drivers/net/wireless/ath/trace.h
@@ -40,13 +40,13 @@ TRACE_EVENT(ath_log,
            TP_STRUCT__entry(
                    __string(device, wiphy_name(wiphy))
                    __string(driver, KBUILD_MODNAME)
-                   __vstring(msg, vaf->fmt, vaf->va)
+                   __vstring(msg, vaf)
            ),
 
            TP_fast_assign(
                    __assign_str(device);
                    __assign_str(driver);
-                   __assign_vstr(msg, vaf->fmt, vaf->va);
+                   __assign_vstr(msg, vaf);
            ),
 
            TP_printk(
diff --git a/drivers/net/wireless/ath/wil6210/trace.h 
b/drivers/net/wireless/ath/wil6210/trace.h
index 201f44612c31..7eb6ca2b0cb6 100644
--- a/drivers/net/wireless/ath/wil6210/trace.h
+++ b/drivers/net/wireless/ath/wil6210/trace.h
@@ -70,10 +70,10 @@ DECLARE_EVENT_CLASS(wil6210_log_event,
        TP_PROTO(struct va_format *vaf),
        TP_ARGS(vaf),
        TP_STRUCT__entry(
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk("%s", __get_str(msg))
 );
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.h 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.h
index 6c4e00e9ccd1..66b179adb80c 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.h
@@ -33,11 +33,11 @@ TRACE_EVENT(brcmf_err,
        TP_ARGS(func, vaf),
        TP_STRUCT__entry(
                __string(func, func)
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
                __assign_str(func);
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk("%s: %s", __get_str(func), __get_str(msg))
 );
@@ -48,12 +48,12 @@ TRACE_EVENT(brcmf_dbg,
        TP_STRUCT__entry(
                __field(u32, level)
                __string(func, func)
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
                __entry->level = level;
                __assign_str(func);
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk("%s: %s", __get_str(func), __get_str(msg))
 );
diff --git 
a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_brcmsmac_msg.h 
b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_brcmsmac_msg.h
index dc296d8bf775..369171af1a30 100644
--- 
a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_brcmsmac_msg.h
+++ 
b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_brcmsmac_msg.h
@@ -28,10 +28,10 @@ DECLARE_EVENT_CLASS(brcms_msg_event,
        TP_PROTO(struct va_format *vaf),
        TP_ARGS(vaf),
        TP_STRUCT__entry(
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk("%s", __get_str(msg))
 );
@@ -62,12 +62,12 @@ TRACE_EVENT(brcms_dbg,
        TP_STRUCT__entry(
                __field(u32, level)
                __string(func, func)
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
                __entry->level = level;
                __assign_str(func);
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk("%s: %s", __get_str(func), __get_str(msg))
 );
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-msg.h 
b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-msg.h
index 0db1fa5477af..80cfb9fc8ad8 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-msg.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-msg.h
@@ -18,10 +18,10 @@ DECLARE_EVENT_CLASS(iwlwifi_msg_event,
        TP_PROTO(struct va_format *vaf),
        TP_ARGS(vaf),
        TP_STRUCT__entry(
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk("%s", __get_str(msg))
 );
@@ -53,12 +53,12 @@ TRACE_EVENT(iwlwifi_dbg,
        TP_STRUCT__entry(
                __field(u32, level)
                __string(function, function)
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
                __entry->level = level;
                __assign_str(function);
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk("%s", __get_str(msg))
 );
diff --git a/drivers/usb/chipidea/trace.h b/drivers/usb/chipidea/trace.h
index 1875419cd17f..9ec0df074872 100644
--- a/drivers/usb/chipidea/trace.h
+++ b/drivers/usb/chipidea/trace.h
@@ -28,11 +28,11 @@ TRACE_EVENT(ci_log,
        TP_ARGS(ci, vaf),
        TP_STRUCT__entry(
                __string(name, dev_name(ci->dev))
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
                __assign_str(name);
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk("%s: %s", __get_str(name), __get_str(msg))
 );
diff --git a/drivers/usb/host/xhci-trace.h b/drivers/usb/host/xhci-trace.h
index 724cba2dbb78..575c02109b4b 100644
--- a/drivers/usb/host/xhci-trace.h
+++ b/drivers/usb/host/xhci-trace.h
@@ -28,9 +28,9 @@
 DECLARE_EVENT_CLASS(xhci_log_msg,
        TP_PROTO(struct va_format *vaf),
        TP_ARGS(vaf),
-       TP_STRUCT__entry(__vstring(msg, vaf->fmt, vaf->va)),
+       TP_STRUCT__entry(__vstring(msg, vaf)),
        TP_fast_assign(
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk("%s", __get_str(msg))
 );
diff --git a/drivers/usb/mtu3/mtu3_trace.h b/drivers/usb/mtu3/mtu3_trace.h
index 89870175d635..56c9263a99d8 100644
--- a/drivers/usb/mtu3/mtu3_trace.h
+++ b/drivers/usb/mtu3/mtu3_trace.h
@@ -23,11 +23,11 @@ TRACE_EVENT(mtu3_log,
        TP_ARGS(dev, vaf),
        TP_STRUCT__entry(
                __string(name, dev_name(dev))
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
                __assign_str(name);
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk("%s: %s", __get_str(name), __get_str(msg))
 );
diff --git a/drivers/usb/musb/musb_trace.h b/drivers/usb/musb/musb_trace.h
index 726e6697d475..7dba44b0496d 100644
--- a/drivers/usb/musb/musb_trace.h
+++ b/drivers/usb/musb/musb_trace.h
@@ -28,11 +28,11 @@ TRACE_EVENT(musb_log,
        TP_ARGS(musb, vaf),
        TP_STRUCT__entry(
                __string(name, dev_name(musb->controller))
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
                __assign_str(name);
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
        TP_printk("%s: %s", __get_str(name), __get_str(msg))
 );
diff --git a/include/trace/events/iscsi.h b/include/trace/events/iscsi.h
index 990fd154f586..2e2667658b51 100644
--- a/include/trace/events/iscsi.h
+++ b/include/trace/events/iscsi.h
@@ -26,12 +26,12 @@ DECLARE_EVENT_CLASS(iscsi_log_msg,
 
        TP_STRUCT__entry(
                __string(dname,         dev_name(dev)           )
-               __vstring(msg,          vaf->fmt, vaf->va)
+               __vstring(msg,          vaf)
        ),
 
        TP_fast_assign(
                __assign_str(dname);
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
 
        TP_printk("%s: %s",__get_str(dname),  __get_str(msg)
diff --git a/include/trace/events/qla.h b/include/trace/events/qla.h
index 74a7534b99b6..554ae9a623c6 100644
--- a/include/trace/events/qla.h
+++ b/include/trace/events/qla.h
@@ -17,11 +17,11 @@ DECLARE_EVENT_CLASS(qla_log_event,
 
        TP_STRUCT__entry(
                __string(buf, buf)
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
        TP_fast_assign(
                __assign_str(buf);
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
 
        TP_printk("%s %s", __get_str(buf), __get_str(msg))
diff --git a/include/trace/stages/stage1_struct_define.h 
b/include/trace/stages/stage1_struct_define.h
index 69e0dae453bf..0ae49a935d16 100644
--- a/include/trace/stages/stage1_struct_define.h
+++ b/include/trace/stages/stage1_struct_define.h
@@ -27,7 +27,7 @@
 #define __string_len(item, src, len) __dynamic_array(char, item, -1)
 
 #undef __vstring
-#define __vstring(item, fmt, ap) __dynamic_array(char, item, -1)
+#define __vstring(item, vf) __dynamic_array(char, item, -1)
 
 #undef __bitmask
 #define __bitmask(item, nr_bits) __dynamic_array(char, item, -1)
diff --git a/include/trace/stages/stage2_data_offsets.h 
b/include/trace/stages/stage2_data_offsets.h
index 8b0cff06d346..5c6dc3092e07 100644
--- a/include/trace/stages/stage2_data_offsets.h
+++ b/include/trace/stages/stage2_data_offsets.h
@@ -33,7 +33,7 @@
 #define __string_len(item, src, len) __dynamic_array(char, item, -1)
 
 #undef __vstring
-#define __vstring(item, fmt, ap) __dynamic_array(char, item, -1)
+#define __vstring(item, vf) __dynamic_array(char, item, -1)
 
 #undef __bitmask
 #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
diff --git a/include/trace/stages/stage4_event_fields.h 
b/include/trace/stages/stage4_event_fields.h
index b6f679ae21aa..77f74d509760 100644
--- a/include/trace/stages/stage4_event_fields.h
+++ b/include/trace/stages/stage4_event_fields.h
@@ -42,7 +42,7 @@
 #define __string_len(item, src, len) __dynamic_array(char, item, -1)
 
 #undef __vstring
-#define __vstring(item, fmt, ap) __dynamic_array(char, item, -1)
+#define __vstring(item, vf) __dynamic_array(char, item, -1)
 
 #undef __bitmask
 #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
diff --git a/include/trace/stages/stage5_get_offsets.h 
b/include/trace/stages/stage5_get_offsets.h
index c6a62dfb18ef..1ce5ca15a8ed 100644
--- a/include/trace/stages/stage5_get_offsets.h
+++ b/include/trace/stages/stage5_get_offsets.h
@@ -65,8 +65,8 @@ static inline const char *__string_src(const char *str)
        __data_offsets->item##_ptr_ = src;
 
 #undef __vstring
-#define __vstring(item, fmt, ap) __dynamic_array(char, item,           \
-                     __trace_event_vstr_len(fmt, ap))
+#define __vstring(item, vf) __dynamic_array(char, item,                \
+                     __trace_event_vstr_len(vf))
 
 #undef __rel_dynamic_array
 #define __rel_dynamic_array(type, item, len)                           \
diff --git a/net/batman-adv/trace.h b/net/batman-adv/trace.h
index 7da692ec38e9..ac88789330a3 100644
--- a/net/batman-adv/trace.h
+++ b/net/batman-adv/trace.h
@@ -36,13 +36,13 @@ TRACE_EVENT(batadv_dbg,
            TP_STRUCT__entry(
                    __string(device, bat_priv->mesh_iface->name)
                    __string(driver, KBUILD_MODNAME)
-                   __vstring(msg, vaf->fmt, vaf->va)
+                   __vstring(msg, vaf)
            ),
 
            TP_fast_assign(
                    __assign_str(device);
                    __assign_str(driver);
-                   __assign_vstr(msg, vaf->fmt, vaf->va);
+                   __assign_vstr(msg, vaf);
            ),
 
            TP_printk(
diff --git a/net/mac80211/trace_msg.h b/net/mac80211/trace_msg.h
index aea4ce55c5ac..0de50dfa13ed 100644
--- a/net/mac80211/trace_msg.h
+++ b/net/mac80211/trace_msg.h
@@ -22,11 +22,11 @@ DECLARE_EVENT_CLASS(mac80211_msg_event,
        TP_ARGS(vaf),
 
        TP_STRUCT__entry(
-               __vstring(msg, vaf->fmt, vaf->va)
+               __vstring(msg, vaf)
        ),
 
        TP_fast_assign(
-               __assign_vstr(msg, vaf->fmt, vaf->va);
+               __assign_vstr(msg, vaf);
        ),
 
        TP_printk("%s", __get_str(msg))
diff --git a/samples/trace_events/trace-events-sample.c 
b/samples/trace_events/trace-events-sample.c
index ecc7db237f2e..07096eadfb7b 100644
--- a/samples/trace_events/trace-events-sample.c
+++ b/samples/trace_events/trace-events-sample.c
@@ -23,6 +23,7 @@ static void do_simple_thread_func(int cnt, const char *fmt, 
...)
 {
        unsigned long bitmask[1] = {0xdeadbeefUL};
        va_list va;
+       struct va_format vf = { .fmt = fmt };
        int array[6];
        int len = cnt % 5;
        int i;
@@ -35,10 +36,11 @@ static void do_simple_thread_func(int cnt, const char *fmt, 
...)
        array[i] = 0;
 
        va_start(va, fmt);
+       vf.va = &va;
 
        /* Silly tracepoints */
        trace_foo_bar("hello", cnt, array, random_strings[len],
-                     current->cpus_ptr, fmt, &va);
+                     current->cpus_ptr, &vf);
 
        va_end(va);
 

Reply via email to