• Steven Rostedt's avatar
    tracing: Fix module use of trace_bprintk() · 13b9b6e7
    Steven Rostedt authored
    On use of trace_printk() there's a macro that determines if the format
    is static or a variable. If it is static, it defaults to __trace_bprintk()
    otherwise it uses __trace_printk().
    
    A while ago, Lai Jiangshan added __trace_bprintk(). In that patch, we
    discussed a way to allow modules to use it. The difference between
    __trace_bprintk() and __trace_printk() is that for faster processing,
    just the format and args are stored in the trace instead of running
    it through a sprintf function. In order to do this, the format used
    by the __trace_bprintk() had to be persistent.
    
    See commit 1ba28e02
    
    The problem comes with trace_bprintk() where the module is unloaded.
    The pointer left in the buffer is still pointing to the format.
    
    To solve this issue, the formats in the module were copied into kernel
    core. If the same format was used, they would use the same copy (to prevent
    memory leak). This all worked well until we tried to merge everything.
    
    At the time this was written, Lai Jiangshan, Frederic Weisbecker,
    Ingo Molnar and myself were all touching the same code. When this was
    merged, we lost the part of it that was in module.c. This kept out the
    copying of the formats and unloading the module could cause bad pointers
    left in the ring buffer.
    
    This patch adds back (with updates required for current kernel) the
    module code that sets up the necessary pointers.
    
    Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    13b9b6e7
module.c 82.9 KB