• T
    lib/vsprintf: implement bitmap printing through '%*pb[l]' · dbc760bc
    Tejun Heo 提交于
    bitmap and its derivatives such as cpumask and nodemask currently only
    provide formatting functions which put the output string into the
    provided buffer; however, how long this buffer should be isn't defined
    anywhere and given that some of these bitmaps can be too large to be
    formatted into an on-stack buffer it users sometimes are unnecessarily
    forced to come up with creative solutions and compromises for the
    buffer just to printk these bitmaps.
    
    There have been a couple different attempts at making this easier.
    
    1. Way back, PeterZ tried printk '%pb' extension with the precision
       for bit width - '%.*pb'.  This was intuitive and made sense but
       unfortunately triggered a compile warning about using precision
       for a pointer.
    
       http://lkml.kernel.org/g/1336577562.2527.58.camel@twins
    
    2. I implemented bitmap_pr_cont[_list]() and its wrappers for cpumask
       and nodemask.  This works but PeterZ pointed out that pr_cont's
       tendency to produce broken lines when multiple CPUs are printing is
       bothering considering the usages.
    
       http://lkml.kernel.org/g/1418226774-30215-3-git-send-email-tj@kernel.org
    
    So, this patch is another attempt at teaching printk and friends how
    to print bitmaps.  It's almost identical to what PeterZ tried with
    precision but it uses the field width for the number of bits instead
    of precision.  The format used is '%*pb[l]', with the optional
    trailing 'l' specifying list format instead of hex masks.
    
    This is a valid format string and doesn't trigger compiler warnings;
    however, it does make it impossible to specify output field width when
    printing bitmaps.  I think this is an acceptable trade-off given how
    much easier it makes printing bitmaps and that we don't have any
    in-kernel user which is using the field width specification.  If any
    future user wants to use field width with a bitmap, it'd have to
    format the bitmap into a string buffer and then print that buffer with
    width spec, which isn't different from how it should be done now.
    
    This patch implements bitmap[_list]_string() which are called from the
    vsprintf pointer() formatting function.  The implementation is mostly
    identical to bitmap_scn[list]printf() except that the output is
    performed in the vsprintf way.  These functions handle formatting into
    too small buffers and sprintf() family of functions report the correct
    overrun output length.
    
    bitmap_scn[list]printf() are now thin wrappers around scnprintf().
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Acked-by: NPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: "David S. Miller" <davem@davemloft.net>
    Cc: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
    Cc: "John W. Linville" <linville@tuxdriver.com>
    Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Chris Metcalf <cmetcalf@tilera.com>
    Cc: Chris Zankel <chris@zankel.net>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Cc: Fenghua Yu <fenghua.yu@intel.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Li Zefan <lizefan@huawei.com>
    Cc: Max Filippov <jcmvbkbc@gmail.com>
    Cc: Mike Travis <travis@sgi.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: Russell King <linux@arm.linux.org.uk>
    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Cc: Steffen Klassert <steffen.klassert@secunet.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Tony Luck <tony.luck@intel.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    dbc760bc
vsprintf.c 62.2 KB