• Vlastimil Babka's avatar
    mm, slub: make slab_lock() disable irqs with PREEMPT_RT · a2b4ae8b
    Vlastimil Babka authored
    We need to disable irqs around slab_lock() (a bit spinlock) to make it
    irq-safe. Most calls to slab_lock() are nested under spin_lock_irqsave() which
    doesn't disable irqs on PREEMPT_RT, so add explicit disabling with PREEMPT_RT.
    The exception is cmpxchg_double_slab() which already disables irqs, so use a
    __slab_[un]lock() variant without irq disable there.
    
    slab_[un]lock() thus needs a flags pointer parameter, which is unused on !RT.
    free_debug_processing() now has two flags variables, which looks odd, but only
    one is actually used - the one used in spin_lock_irqsave() on !RT and the one
    used in slab_lock() on RT.
    
    As a result, __cmpxchg_double_slab() and cmpxchg_double_slab() become
    effectively identical on RT, as both will disable irqs, which is necessary on
    RT as most callers of this function also rely on irqsaving lock operations.
    Thus, assert that irqs are already disabled in __cmpxchg_double_slab() only on
    !RT and also change the VM_BUG_ON assertion to the more standard lockdep_assert
    one.
    Signed-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
    a2b4ae8b
slub.c 149 KB