• Frederic Weisbecker's avatar
    vsprintf: unify the format decoding layer for its 3 users · fef20d9c
    Frederic Weisbecker authored
    An new optimization is making its way to ftrace. Its purpose is to
    make trace_printk() consuming less memory and be faster.
    
    Written by Lai Jiangshan, the approach is to delay the formatting
    job from tracing time to output time.
    
    Currently, a call to trace_printk() will format the whole string and
    insert it into the ring buffer. Then you can read it on /debug/tracing/trace
    file.
    
    The new implementation stores the address of the format string and
    the binary parameters into the ring buffer, making the packet more compact
    and faster to insert.
    Later, when the user exports the traces, the format string is retrieved
    with the binary parameters and the formatting job is eventually done.
    
    The new implementation rewrites a lot of format decoding bits from
    vsnprintf() function, making now 3 differents functions to maintain
    in their duplicated parts of printf format decoding bits.
    
    Suggested by Ingo Molnar, this patch tries to factorize the most
    possible common bits from these functions.
    The real common part between them is the format decoding. Although
    they do somewhat similar jobs, their way to export or import the parameters
    is very different. Thus, only the decoding layer is extracted, unless you see
    other parts that could be worth factorized.
    
    Changes in V2:
    
    - Address a suggestion from Linus to group the format_decode() parameters inside
      a structure.
    
    Changes in v3:
    
    - Address other cleanups suggested by Ingo and Linus such as passing the
      printf_spec struct to the format helpers: pointer()/number()/string()
      Note that this struct is passed by copy and not by address. This is to
      avoid side effects because these functions often change these values and the
      changes shoudn't be persistant when a callee helper returns.
      It would be too risky.
    
    - Various cleanups (code alignement, switch/case instead of if/else fountains).
    
    - Fix a bug that printed the first format specifier following a %p
    
    Changes in v4:
    
    - drop unapropriate const qualifier loss while casting fmt to a char *
      (thanks to Vegard Nossum for having pointed this out).
    Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Acked-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    LKML-Reference: <1236356510-8381-6-git-send-email-fweisbec@gmail.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    fef20d9c
vsprintf.c 42.5 KB