diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2016-11-03 13:09:24 +0100 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2016-11-08 10:29:44 +0100 |
commit | 7f8d61f005228fc48e6e2ca3c9af3302cd4870af (patch) | |
tree | f3eb2f26a65bf6c212819af6cd3aa9215d3078a1 /include/asm-generic/percpu.h | |
parent | s390/hypfs: Use get_free_page() instead of kmalloc to ensure page alignment (diff) | |
download | linux-7f8d61f005228fc48e6e2ca3c9af3302cd4870af.tar.xz linux-7f8d61f005228fc48e6e2ca3c9af3302cd4870af.zip |
percpu: use notrace variant of preempt_disable/preempt_enable
Commit 345ddcc882d8 ("ftrace: Have set_ftrace_pid use the bitmap like
events do") added a couple of this_cpu_read calls to the ftrace code.
On x86 this is not a problem, since it has single instructions to read
percpu data. Other architectures which use the generic variant now
have additional preempt_disable and preempt_enable calls in the core
ftrace code. This may lead to recursive calls and in result to a dead
machine, e.g. if preemption and debugging options are enabled.
To fix this use the notrace variant of preempt_disable and
preempt_enable within the generic percpu code.
Reported-and-bisected-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Tested-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Fixes: 345ddcc882d8 ("ftrace: Have set_ftrace_pid use the bitmap like events do")
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to '')
-rw-r--r-- | include/asm-generic/percpu.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h index 40e887068da2..0504ef8f3aa3 100644 --- a/include/asm-generic/percpu.h +++ b/include/asm-generic/percpu.h @@ -118,9 +118,9 @@ do { \ #define this_cpu_generic_read(pcp) \ ({ \ typeof(pcp) __ret; \ - preempt_disable(); \ + preempt_disable_notrace(); \ __ret = raw_cpu_generic_read(pcp); \ - preempt_enable(); \ + preempt_enable_notrace(); \ __ret; \ }) |