tile: use a more conservative __my_cpu_offset in CONFIG_PREEMPT
authorChris Metcalf <cmetcalf@tilera.com>
Thu, 26 Sep 2013 17:24:53 +0000 (13:24 -0400)
committerBen Hutchings <ben@decadent.org.uk>
Thu, 28 Nov 2013 14:02:00 +0000 (14:02 +0000)
commit06c5e3983fcaca7a9953890d603b075607e8bbd2
tree510c21718eb51fbea59cca423f7e5038afe326b3
parentc2a4b018aaa492c2de179b182b0e4b2b4c41bb8a
tile: use a more conservative __my_cpu_offset in CONFIG_PREEMPT

commit f862eefec0b68e099a9fa58d3761ffb10bad97e1 upstream.

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 509eb76ebf97.

Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
arch/tile/include/asm/percpu.h