• Chris Metcalf's avatar
    tile: use a more conservative __my_cpu_offset in CONFIG_PREEMPT · f862eefe
    Chris Metcalf authored
    It turns out the kernel relies on barrier() to force a reload of the
    percpu offset value.  Since we can't easily modify the definition of
    barrier() to include "tp" as an output register, we instead provide a
    definition of __my_cpu_offset as extended assembly that includes a fake
    stack read to hazard against barrier(), forcing gcc to know that it
    must reread "tp" and recompute anything based on "tp" after a barrier.
    
    This fixes observed hangs in the slub allocator when we are looping
    on a percpu cmpxchg_double.
    
    A similar fix for ARMv7 was made in June in change 509eb76e.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarChris Metcalf <cmetcalf@tilera.com>
    f862eefe
percpu.h 1.79 KB