diff options
author | Chris Metcalf <cmetcalf@tilera.com> | 2013-09-26 13:24:53 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-10-13 15:42:50 -0700 |
commit | 5df7085368ce132b9d93e5cff406df4684615419 (patch) | |
tree | cd0c84cfb4c100710180bc1d8718aa8a4dc3a17f /fs | |
parent | b55ef2eddc365446b824aa9d457dd9daf4d4d4be (diff) |
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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs')
0 files changed, 0 insertions, 0 deletions