Skip to content
  • Thomas Gleixner's avatar
    slub: Fix the lockless code on 32-bit platforms with no 64-bit cmpxchg · 30106b8c
    Thomas Gleixner authored
    
    
    The SLUB allocator use of the cmpxchg_double logic was wrong: it
    actually needs the irq-safe one.
    
    That happens automatically when we use the native unlocked 'cmpxchg8b'
    instruction, but when compiling the kernel for older x86 CPUs that do
    not support that instruction, we fall back to the generic emulation
    code.
    
    And if you don't specify that you want the irq-safe version, the generic
    code ends up just open-coding the cmpxchg8b equivalent without any
    protection against interrupts or preemption.  Which definitely doesn't
    work for SLUB.
    
    This was reported by Werner Landgraf <w.landgraf@ru.ru>, who saw
    instability with his distro-kernel that was compiled to support pretty
    much everything under the sun.  Most big Linux distributions tend to
    compile for PPro and later, and would never have noticed this problem.
    
    This also fixes the prototypes for the irqsafe cmpxchg_double functions
    to use 'bool' like they should.
    
    [ Btw, that whole "generic code defaults to no protection" design just
      sounds stupid - if the code needs no protection, there is no reason to
      use "cmpxchg_double" to begin with.  So we should probably just remove
      the unprotected version entirely as pointless.   - Linus ]
    
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Reported-and-tested-by: default avatarwerner <w.landgraf@ru.ru>
    Acked-and-tested-by: default avatarIngo Molnar <mingo@elte.hu>
    Acked-by: default avatarChristoph Lameter <cl@linux.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Tejun Heo <tj@kernel.org>
    Link: http://lkml.kernel.org/r/alpine.LFD.2.02.1105041539050.3005@ionos
    
    
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    30106b8c