• T
    cpumask: always use nr_cpu_ids in formatting and parsing functions · 513e3d2d
    Tejun Heo 提交于
    bitmap implements two variants of scnprintf functions to format a bitmap
    into a string and cpumask and nodemask wrap them to provide equivalent
    interfaces.  The scnprintf family of functions require a string buffer as
    an output target which complicates code paths which just want to print out
    the mask through printk for informational or debug purposes as they have
    to worry about how large the buffer should be and whether it's too large
    to allocate on stack.
    
    Neither cpumask or nodemask provides a guildeline on how large the target
    buffer should be forcing users come up with their own solutions - some
    allocate an arbitrarily sized buffer which is small enough to allocate on
    stack but may be too short in corner cases, other come up with a custom
    upper limit calculation considering the output format, some allocate the
    buffer dynamically while one resorted to using lock to synchronize access
    to a static buffer.
    
    This is an artificial problem which is being solved repeatedly for no
    benefit.  In a lot of cases, the output area already exists and can be
    targeted directly making the intermediate buffer unnecessary.  This
    patchset teaches printf family of functions how to format bitmaps and
    replace the dedicated formatting functions with it.
    
    Pointer formatting is extended to cover bitmap formatting.  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.  For more details, please see 0002.
    
    This patch (of 31):
    
    Currently, the formatting and parsing functions in cpumask.h use
    nr_cpumask_bits like other cpumask functions; however, nr_cpumask_bits
    is either NR_CPUS or nr_cpu_ids depending on CONFIG_CPUMASK_OFFSTACK.
    This leads to inconsistent behaviors.
    
    With CONFIG_NR_CPUS=512 and !CONFIG_CPUMASK_OFFSTACK
    
      # cat /sys/devices/virtual/net/lo/queues/rx-0/rps_cpus
      00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000
      # cat /proc/self/status | grep Cpus_allowed:
      Cpus_allowed:   f
    
    With CONFIG_NR_CPUS=1024 and CONFIG_CPUMASK_OFFSTACK (fedora default)
    
      # cat /sys/devices/virtual/net/lo/queues/rx-0/rps_cpus
      0
      # cat /proc/self/status | grep Cpus_allowed:
      Cpus_allowed:   f
    
    Note that /proc/self/status is always using nr_cpu_ids regardless of
    config.  This is because seq cpumask formattings functions always use
    nr_cpu_ids.
    
    Given that the same output fields may switch between the two forms,
    converging on nr_cpu_ids always isn't too likely to surprise userland.
    This patch updates the formatting and parsing functions in cpumask.h
    to always use nr_cpu_ids.  There's no point in dealing with CPUs which
    aren't even possible on the machine.
    Signed-off-by: NTejun Heo <tj@kernel.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: Peter Zijlstra <peterz@infradead.org>
    Cc: Russell King <linux@arm.linux.org.uk>
    Acked-by: NRusty 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>
    513e3d2d
cpumask.h 28.4 KB