diff mbox

[v2] powerpc: make /proc/self/stack always print the current stack

Message ID 20170327193233.25147-1-cascardo@canonical.com (mailing list archive)
State Accepted
Headers show

Commit Message

Thadeu Lima de Souza Cascardo March 27, 2017, 7:32 p.m. UTC
For the current task, the kernel stack would only tell the last time the
process was rescheduled, if ever. Use the current stack pointer for the
current task.

Otherwise, every once in a while, the stacktrace printed when reading
/proc/self/stack would look like the process is running in userspace,
while it's not, which some may consider as a bug.

This is also consistent with some other architectures, like x86 and arm,
at least.

Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
---
 arch/powerpc/kernel/stacktrace.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

Comments

Michael Ellerman March 31, 2017, 12:33 p.m. UTC | #1
On Mon, 2017-03-27 at 19:32:33 UTC, Thadeu Lima de Souza Cascardo wrote:
> For the current task, the kernel stack would only tell the last time the
> process was rescheduled, if ever. Use the current stack pointer for the
> current task.
> 
> Otherwise, every once in a while, the stacktrace printed when reading
> /proc/self/stack would look like the process is running in userspace,
> while it's not, which some may consider as a bug.
> 
> This is also consistent with some other architectures, like x86 and arm,
> at least.
> 
> Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/4f9b514b765a3057341f3236c94877

cheers
diff mbox

Patch

diff --git a/arch/powerpc/kernel/stacktrace.c b/arch/powerpc/kernel/stacktrace.c
index 6671195..d534ed9 100644
--- a/arch/powerpc/kernel/stacktrace.c
+++ b/arch/powerpc/kernel/stacktrace.c
@@ -59,7 +59,14 @@  EXPORT_SYMBOL_GPL(save_stack_trace);
 
 void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
 {
-	save_context_stack(trace, tsk->thread.ksp, tsk, 0);
+	unsigned long sp;
+
+	if (tsk == current)
+		sp = current_stack_pointer();
+	else
+		sp = tsk->thread.ksp;
+
+	save_context_stack(trace, sp, tsk, 0);
 }
 EXPORT_SYMBOL_GPL(save_stack_trace_tsk);