• Steven Rostedt (Google)'s avatar
    tracing: Have type enum modifications copy the strings · 795301d3
    Steven Rostedt (Google) authored
    When an enum is used in the visible parts of a trace event that is
    exported to user space, the user space applications like perf and
    trace-cmd do not have a way to know what the value of the enum is. To
    solve this, at boot up (or module load) the printk formats are modified to
    replace the enum with their numeric value in the string output.
    
    Array fields of the event are defined by [<nr-elements>] in the type
    portion of the format file so that the user space parsers can correctly
    parse the array into the appropriate size chunks. But in some trace
    events, an enum is used in defining the size of the array, which once
    again breaks the parsing of user space tooling.
    
    This was solved the same way as the print formats were, but it modified
    the type strings of the trace event. This caused crashes in some
    architectures because, as supposed to the print string, is a const string
    value. This was not detected on x86, as it appears that const strings are
    still writable (at least in boot up), but other architectures this is not
    the case, and writing to a const string will cause a kernel fault.
    
    To fix this, use kstrdup() to copy the type before modifying it. If the
    trace event is for the core kernel there's no need to free it because the
    string will be in use for the life of the machine being on line. For
    modules, create a link list to store all the strings being allocated for
    modules and when the module is removed, free them.
    
    Link: https://lore.kernel.org/all/yt9dr1706b4i.fsf@linux.ibm.com/
    Link: https://lkml.kernel.org/r/20220318153432.3984b871@gandalf.local.homeTested-by: default avatarMarc Zyngier <maz@kernel.org>
    Tested-by: default avatarSven Schnelle <svens@linux.ibm.com>
    Reported-by: default avatarSven Schnelle <svens@linux.ibm.com>
    Fixes: b3bc8547 ("tracing: Have TRACE_DEFINE_ENUM affect trace event types as well")
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    795301d3
trace_events.c 94.4 KB