Skip to content
  • Mathieu Desnoyers's avatar
    Markers - remove extra format argument · dc102a8f
    Mathieu Desnoyers authored
    
    
    Denys Vlasenko <vda.linux@googlemail.com> :
    
    > Not in this patch, but I noticed:
    >
    > #define __trace_mark(name, call_private, format, args...)               \
    >         do {                                                            \
    >                 static const char __mstrtab_##name[]                    \
    >                 __attribute__((section("__markers_strings")))           \
    >                 = #name "\0" format;                                    \
    >                 static struct marker __mark_##name                      \
    >                 __attribute__((section("__markers"), aligned(8))) =     \
    >                 { __mstrtab_##name, &__mstrtab_##name[sizeof(#name)],   \
    >                 0, 0, marker_probe_cb,                                  \
    >                 { __mark_empty_function, NULL}, NULL };                 \
    >                 __mark_check_format(format, ## args);                   \
    >                 if (unlikely(__mark_##name.state)) {                    \
    >                         (*__mark_##name.call)                           \
    >                                 (&__mark_##name, call_private,          \
    >                                 format, ## args);                       \
    >                 }                                                       \
    >         } while (0)
    >
    > In this call:
    >
    >                         (*__mark_##name.call)                           \
    >                                 (&__mark_##name, call_private,          \
    >                                 format, ## args);                       \
    >
    > you make gcc allocate duplicate format string. You can use
    > &__mstrtab_##name[sizeof(#name)] instead since it holds the same string,
    > or drop ", format," above and "const char *fmt" from here:
    >
    >         void (*call)(const struct marker *mdata,        /* Probe wrapper */
    >                 void *call_private, const char *fmt, ...);
    >
    > since mdata->format is the same and all callees which need it can take it there.
    
    Very good point. I actually thought about dropping it, since it would
    remove an unnecessary argument from the stack. And actually, since I now
    have the marker_probe_cb sitting between the marker site and the
    callbacks, there is no API change required. Thanks :)
    
    Mathieu
    
    Signed-off-by: default avatarMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
    CC: Denys Vlasenko <vda.linux@googlemail.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    dc102a8f