![]() 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
|
||
---|---|---|
.. | ||
configs | ||
gxio | ||
include | ||
kernel | ||
kvm | ||
lib | ||
mm | ||
Kbuild | ||
Kconfig | ||
Kconfig.debug | ||
Makefile |