[PATCH] x86/unwind: fix guess unwinder regression

2016-11-27 Thread Josh Poimboeuf
My attempt at fixing some KASAN false positive warnings was rather brain
dead, and it broke the guess unwinder.  With frame pointers disabled,
/proc//stack is broken:

  # cat /proc/1/stack
  [] 0x

Restore the code flow to more closely resemble its previous state, while
still using READ_ONCE_NOCHECK macros to silence KASAN false positives.

Fixes: c2d75e03d630 ("x86/unwind: Prevent KASAN false positive warnings in 
guess unwinder")
Signed-off-by: Josh Poimboeuf 
---
 arch/x86/kernel/unwind_guess.c | 9 ++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/unwind_guess.c b/arch/x86/kernel/unwind_guess.c
index b80e8bf..22881dd 100644
--- a/arch/x86/kernel/unwind_guess.c
+++ b/arch/x86/kernel/unwind_guess.c
@@ -7,11 +7,13 @@
 
 unsigned long unwind_get_return_address(struct unwind_state *state)
 {
-   unsigned long addr = READ_ONCE_NOCHECK(*state->sp);
+   unsigned long addr;
 
if (unwind_done(state))
return 0;
 
+   addr = READ_ONCE_NOCHECK(*state->sp);
+
return ftrace_graph_ret_addr(state->task, >graph_idx,
 addr, state->sp);
 }
@@ -25,11 +27,12 @@ bool unwind_next_frame(struct unwind_state *state)
return false;
 
do {
-   unsigned long addr = READ_ONCE_NOCHECK(*state->sp);
+   for (state->sp++; state->sp < info->end; state->sp++) {
+   unsigned long addr = READ_ONCE_NOCHECK(*state->sp);
 
-   for (state->sp++; state->sp < info->end; state->sp++)
if (__kernel_text_address(addr))
return true;
+   }
 
state->sp = info->next_sp;
 
-- 
2.7.4



[PATCH] x86/unwind: fix guess unwinder regression

2016-11-27 Thread Josh Poimboeuf
My attempt at fixing some KASAN false positive warnings was rather brain
dead, and it broke the guess unwinder.  With frame pointers disabled,
/proc//stack is broken:

  # cat /proc/1/stack
  [] 0x

Restore the code flow to more closely resemble its previous state, while
still using READ_ONCE_NOCHECK macros to silence KASAN false positives.

Fixes: c2d75e03d630 ("x86/unwind: Prevent KASAN false positive warnings in 
guess unwinder")
Signed-off-by: Josh Poimboeuf 
---
 arch/x86/kernel/unwind_guess.c | 9 ++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/unwind_guess.c b/arch/x86/kernel/unwind_guess.c
index b80e8bf..22881dd 100644
--- a/arch/x86/kernel/unwind_guess.c
+++ b/arch/x86/kernel/unwind_guess.c
@@ -7,11 +7,13 @@
 
 unsigned long unwind_get_return_address(struct unwind_state *state)
 {
-   unsigned long addr = READ_ONCE_NOCHECK(*state->sp);
+   unsigned long addr;
 
if (unwind_done(state))
return 0;
 
+   addr = READ_ONCE_NOCHECK(*state->sp);
+
return ftrace_graph_ret_addr(state->task, >graph_idx,
 addr, state->sp);
 }
@@ -25,11 +27,12 @@ bool unwind_next_frame(struct unwind_state *state)
return false;
 
do {
-   unsigned long addr = READ_ONCE_NOCHECK(*state->sp);
+   for (state->sp++; state->sp < info->end; state->sp++) {
+   unsigned long addr = READ_ONCE_NOCHECK(*state->sp);
 
-   for (state->sp++; state->sp < info->end; state->sp++)
if (__kernel_text_address(addr))
return true;
+   }
 
state->sp = info->next_sp;
 
-- 
2.7.4