Skip to content
  • Christoph Lameter's avatar
    percpu: add raw_cpu_ops · b3ca1c10
    Christoph Lameter authored
    
    
    The kernel has never been audited to ensure that this_cpu operations are
    consistently used throughout the kernel.  The code generated in many
    places can be improved through the use of this_cpu operations (which
    uses a segment register for relocation of per cpu offsets instead of
    performing address calculations).
    
    The patch set also addresses various consistency issues in general with
    the per cpu macros.
    
    A. The semantics of __this_cpu_ptr() differs from this_cpu_ptr only
       because checks are skipped. This is typically shown through a raw_
       prefix. So this patch set changes the places where __this_cpu_ptr()
       is used to raw_cpu_ptr().
    
    B. There has been the long term wish by some that __this_cpu operations
       would check for preemption. However, there are cases where preemption
       checks need to be skipped. This patch set adds raw_cpu operations that
       do not check for preemption and then adds preemption checks to the
       __this_cpu operations.
    
    C. The use of __get_cpu_var is always a reference to a percpu variable
       that can also be handled via a this_cpu operation. This patch set
       replaces all uses of __get_cpu_var with this_cpu operations.
    
    D. We can then use this_cpu RMW operations in various places replacing
       sequences of instructions by a single one.
    
    E. The use of this_cpu operations throughout will allow other arches than
       x86 to implement optimized references and RMV operations to work with
       per cpu local data.
    
    F. The use of this_cpu operations opens up the possibility to
       further optimize code that relies on synchronization through
       per cpu data.
    
    The patch set works in a couple of stages:
    
    I. Patch 1 adds the additional raw_cpu operations and raw_cpu_ptr().
        Also converts the existing __this_cpu_xx_# primitive in the x86
        code to raw_cpu_xx_#.
    
    II. Patch 2-4 use the raw_cpu operations in places that would give
         us false positives once they are enabled.
    
    III. Patch 5 adds preemption checks to __this_cpu operations to allow
        checking if preemption is properly disabled when these functions
        are used.
    
    IV. Patches 6-20 are patches that simply replace uses of __get_cpu_var
       with this_cpu_ptr. They do not depend on any changes to the percpu
       code. No preemption tests are skipped if they are applied.
    
    V. Patches 21-46 are conversion patches that use this_cpu operations
       in various kernel subsystems/drivers or arch code.
    
    VI.  Patches 47/48 (not included in this series) remove no longer used
        functions (__this_cpu_ptr and __get_cpu_var).  These should only be
        applied after all the conversion patches have made it and after we
        have done additional passes through the kernel to ensure that none of
        the uses of these functions remain.
    
    This patch (of 46):
    
    The patches following this one will add preemption checks to __this_cpu
    ops so we need to have an alternative way to use this_cpu operations
    without preemption checks.
    
    raw_cpu_ops will be the basis for all other ops since these will be the
    operations that do not implement any checks.
    
    Primitive operations are renamed by this patch from __this_cpu_xxx to
    raw_cpu_xxxx.
    
    Also change the uses of the x86 percpu primitives in preempt.h.
    These depend directly on asm/percpu.h (header #include nesting issue).
    
    Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Signed-off-by: default avatarChristoph Lameter <cl@linux.com>
    Acked-by: default avatarIngo Molnar <mingo@kernel.org>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: "James E.J. Bottomley" <jejb@parisc-linux.org>
    Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
    Cc: Alex Shi <alex.shi@intel.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Bryan Wu <cooloney@gmail.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Chris Metcalf <cmetcalf@tilera.com>
    Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
    Cc: David Daney <david.daney@cavium.com>
    Cc: David Miller <davem@davemloft.net>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Dimitri Sivanich <sivanich@sgi.com>
    Cc: Dipankar Sarma <dipankar@in.ibm.com>
    Cc: Eric Dumazet <edumazet@google.com>
    Cc: Fenghua Yu <fenghua.yu@intel.com>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: H. Peter Anvin <hpa@linux.intel.com>
    Cc: Haavard Skinnemoen <hskinnemoen@gmail.com>
    Cc: Hans-Christian Egtvedt <egtvedt@samfundet.no>
    Cc: Hedi Berriche <hedi@sgi.com>
    Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
    Cc: Helge Deller <deller@gmx.de>
    Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
    Cc: James Hogan <james.hogan@imgtec.com>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: John Stultz <john.stultz@linaro.org>
    Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Matt Turner <mattst88@gmail.com>
    Cc: Mike Frysinger <vapier@gentoo.org>
    Cc: Mike Travis <travis@sgi.com>
    Cc: Neil Brown <neilb@suse.de>
    Cc: Nicolas Pitre <nicolas.pitre@linaro.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Paul Mundt <lethal@linux-sh.org>
    Cc: Rafael J. Wysocki <rjw@sisk.pl>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: Richard Henderson <rth@twiddle.net>
    Cc: Robert Richter <rric@kernel.org>
    Cc: Russell King <linux@arm.linux.org.uk>
    Cc: Russell King <rmk+kernel@arm.linux.org.uk>
    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Tony Luck <tony.luck@intel.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Wim Van Sebroeck <wim@iguana.be>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    b3ca1c10