From: Michael Ellerman <mpe@ellerman.id.au> Date: 2023-09-21 23:25:51
The changes to copy_thread() made in commit eed7c420aac7 ("powerpc:
copy_thread differentiate kthreads and user mode threads") inadvertently
broke arch_stack_walk_reliable() because it has knowledge of the stack
layout.
Fix it by changing the condition to match the new logic in
copy_thread(). The changes make the comments about the stack layout
incorrect, rather than rephrasing them just refer the reader to
copy_thread().
Also the comment about the stack backchain is no longer true, since
commit edbd0387f324 ("powerpc: copy_thread add a back chain to the
switch stack frame"), so remove that as well.
Reported-by: Joe Lawrence <joe.lawrence@redhat.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Fixes: eed7c420aac7 ("powerpc: copy_thread differentiate kthreads and user mode threads")
---
arch/powerpc/kernel/stacktrace.c | 27 +++++----------------------
1 file changed, 5 insertions(+), 22 deletions(-)
@@ -73,29 +73,12 @@ int __no_sanitize_address arch_stack_walk_reliable(stack_trace_consume_fn consumboolfirstframe;stack_end=stack_page+THREAD_SIZE;-if(!is_idle_task(task)){-/*-*Forusertasks,thisistheSPvalueloadedon-*kernelentry,see"PACAKSAVE(r13)"in_switch()and-*system_call_common().-*-*Likewisefornon-swapperkernelthreads,-*thisalsohappenstobethetopofthestack-*assetupbycopy_thread().-*-*Notethatstackbacklinksarenotproperlysetupby-*copy_thread()andthus,aforkedtask()willhave-*anunreliablestacktraceuntilit'sbeen-*_switch()'edtoforthefirsttime.-*/-stack_end-=STACK_USER_INT_FRAME_SIZE;-}else{-/*-*idletaskshaveacustomstacklayout,-*c.f.cpu_idle_thread_init().-*/++// See copy_thread() for details.+if(task->flags&PF_KTHREAD)stack_end-=STACK_FRAME_MIN_SIZE;-}+else+stack_end-=STACK_USER_INT_FRAME_SIZE;if(task==current)sp=current_stack_frame();
From: Petr Mladek <pmladek@suse.com> Date: 2023-09-22 08:36:11
On Fri 2023-09-22 09:24:41, Michael Ellerman wrote:
The changes to copy_thread() made in commit eed7c420aac7 ("powerpc:
copy_thread differentiate kthreads and user mode threads") inadvertently
broke arch_stack_walk_reliable() because it has knowledge of the stack
layout.
Fix it by changing the condition to match the new logic in
copy_thread(). The changes make the comments about the stack layout
incorrect, rather than rephrasing them just refer the reader to
copy_thread().
Also the comment about the stack backchain is no longer true, since
commit edbd0387f324 ("powerpc: copy_thread add a back chain to the
switch stack frame"), so remove that as well.
Reported-by: Joe Lawrence <joe.lawrence@redhat.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Fixes: eed7c420aac7 ("powerpc: copy_thread differentiate kthreads and user mode threads")
The change makes sense to me. Well, I could not test it easily.
Anyway, feel free to use:
Reviewed-by: Petr Mladek <pmladek@suse.com>
Best Regards,
Petr
From: Joe Lawrence <joe.lawrence@redhat.com> Date: 2023-09-25 19:04:47
On Fri, Sep 22, 2023 at 09:24:41AM +1000, Michael Ellerman wrote:
quoted hunk
The changes to copy_thread() made in commit eed7c420aac7 ("powerpc:
copy_thread differentiate kthreads and user mode threads") inadvertently
broke arch_stack_walk_reliable() because it has knowledge of the stack
layout.
Fix it by changing the condition to match the new logic in
copy_thread(). The changes make the comments about the stack layout
incorrect, rather than rephrasing them just refer the reader to
copy_thread().
Also the comment about the stack backchain is no longer true, since
commit edbd0387f324 ("powerpc: copy_thread add a back chain to the
switch stack frame"), so remove that as well.
Reported-by: Joe Lawrence <joe.lawrence@redhat.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Fixes: eed7c420aac7 ("powerpc: copy_thread differentiate kthreads and user mode threads")
---
arch/powerpc/kernel/stacktrace.c | 27 +++++----------------------
1 file changed, 5 insertions(+), 22 deletions(-)
@@ -73,29 +73,12 @@ int __no_sanitize_address arch_stack_walk_reliable(stack_trace_consume_fn consumboolfirstframe;stack_end=stack_page+THREAD_SIZE;-if(!is_idle_task(task)){-/*-*Forusertasks,thisistheSPvalueloadedon-*kernelentry,see"PACAKSAVE(r13)"in_switch()and-*system_call_common().-*-*Likewisefornon-swapperkernelthreads,-*thisalsohappenstobethetopofthestack-*assetupbycopy_thread().-*-*Notethatstackbacklinksarenotproperlysetupby-*copy_thread()andthus,aforkedtask()willhave-*anunreliablestacktraceuntilit'sbeen-*_switch()'edtoforthefirsttime.-*/-stack_end-=STACK_USER_INT_FRAME_SIZE;-}else{-/*-*idletaskshaveacustomstacklayout,-*c.f.cpu_idle_thread_init().-*/++// See copy_thread() for details.+if(task->flags&PF_KTHREAD)stack_end-=STACK_FRAME_MIN_SIZE;-}+else+stack_end-=STACK_USER_INT_FRAME_SIZE;if(task==current)sp=current_stack_frame();
--
2.41.0
Reviewed-by: Joe Lawrence <joe.lawrence@redhat.com>
Thanks for posting, Michael.
Livepatching kselftests are happy now. Minimal kpatch testing good, too
(we have not rebased our full integration tests to latest upstreams just
yet).
--
Joe
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2023-10-15 10:08:15
On Fri, 22 Sep 2023 09:24:41 +1000, Michael Ellerman wrote:
The changes to copy_thread() made in commit eed7c420aac7 ("powerpc:
copy_thread differentiate kthreads and user mode threads") inadvertently
broke arch_stack_walk_reliable() because it has knowledge of the stack
layout.
Fix it by changing the condition to match the new logic in
copy_thread(). The changes make the comments about the stack layout
incorrect, rather than rephrasing them just refer the reader to
copy_thread().
[...]