* [PATCH] arm64: skip dump_backtrace() in show_regs when user mode pt_regs
@ 2019-03-28 11:45 Kefeng Wang
2019-04-03 12:44 ` Will Deacon
0 siblings, 1 reply; 6+ messages in thread
From: Kefeng Wang @ 2019-03-28 11:45 UTC (permalink / raw)
To: Mark Rutland, Will Deacon, Catalin Marinas, linux-arm-kernel; +Cc: Kefeng Wang
There is no need to call dump_backtrace() when the pt_regs
corresponds to user mode, eg,
[ 334.634005] potentially unexpected fatal signal 11.
[ 334.634476] CPU: 3 PID: 2049 Comm: test Not tainted 5.1.0-rc2 #24
[ 334.634745] Hardware name: QEMU QEMU Virtual Machine, BIOS 0.0.0 02/06/2015
[ 334.635786] pstate: 60001000 (nZCv daif -PAN -UAO)
[ 334.636131] pc : 0000aaaaad4c0788
[ 334.636725] lr : 0000ffff83aac6e0
[ 334.637006] sp : 0000ffffd14e9670
[ 334.637352] x29: 0000ffffd14e9690 x28: 0000000000000000
[ 334.637814] x27: 0000000000000000 x26: 0000000000000000
[ 334.638143] x25: 0000000000000000 x24: 0000000000000000
[ 334.638460] x23: 0000000000000000 x22: 0000000000000000
[ 334.639499] x21: 0000aaaaad4c0650 x20: 0000000000000000
[ 334.640336] x19: 0000aaaaad4c0790 x18: 0000000000000002
[ 334.641062] x17: 0000ffff83aac600 x16: 0000aaaaad4d0fa0
[ 334.641474] x15: 0000ffff83c10150 x14: 0000ffff83c101e0
[ 334.641894] x13: 0000ffff83c12048 x12: 0000000000000000
[ 334.642421] x11: 0000000000010000 x10: 0000000008000000
[ 334.642749] x9 : 000000000fffffff x8 : ffffffffffffffff
[ 334.643378] x7 : 0000000000010000 x6 : 0000ffff83be0b00
[ 334.643669] x5 : 0000000000000000 x4 : 0000000000000000
[ 334.644012] x3 : 0000aaaaad4c0754 x2 : 0000ffffd14e97d8
[ 334.644302] x1 : 0000fffefffffffc x0 : 0000ffff00000000
[ 334.645211] Call trace:
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
---
arch/arm64/kernel/process.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index 3767fb21a5b8..de224f1512ca 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -298,7 +298,8 @@ void __show_regs(struct pt_regs *regs)
void show_regs(struct pt_regs * regs)
{
__show_regs(regs);
- dump_backtrace(regs, NULL);
+ if (!user_mode(regs))
+ dump_backtrace(regs, NULL);
}
static void tls_thread_flush(void)
--
2.20.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] arm64: skip dump_backtrace() in show_regs when user mode pt_regs
2019-03-28 11:45 [PATCH] arm64: skip dump_backtrace() in show_regs when user mode pt_regs Kefeng Wang
@ 2019-04-03 12:44 ` Will Deacon
2019-04-03 15:58 ` Kefeng Wang
0 siblings, 1 reply; 6+ messages in thread
From: Will Deacon @ 2019-04-03 12:44 UTC (permalink / raw)
To: Kefeng Wang; +Cc: Mark Rutland, Catalin Marinas, linux-arm-kernel
On Thu, Mar 28, 2019 at 07:45:27PM +0800, Kefeng Wang wrote:
> There is no need to call dump_backtrace() when the pt_regs
> corresponds to user mode, eg,
>
> [ 334.634005] potentially unexpected fatal signal 11.
> [ 334.634476] CPU: 3 PID: 2049 Comm: test Not tainted 5.1.0-rc2 #24
> [ 334.634745] Hardware name: QEMU QEMU Virtual Machine, BIOS 0.0.0 02/06/2015
> [ 334.635786] pstate: 60001000 (nZCv daif -PAN -UAO)
> [ 334.636131] pc : 0000aaaaad4c0788
> [ 334.636725] lr : 0000ffff83aac6e0
> [ 334.637006] sp : 0000ffffd14e9670
> [ 334.637352] x29: 0000ffffd14e9690 x28: 0000000000000000
> [ 334.637814] x27: 0000000000000000 x26: 0000000000000000
> [ 334.638143] x25: 0000000000000000 x24: 0000000000000000
> [ 334.638460] x23: 0000000000000000 x22: 0000000000000000
> [ 334.639499] x21: 0000aaaaad4c0650 x20: 0000000000000000
> [ 334.640336] x19: 0000aaaaad4c0790 x18: 0000000000000002
> [ 334.641062] x17: 0000ffff83aac600 x16: 0000aaaaad4d0fa0
> [ 334.641474] x15: 0000ffff83c10150 x14: 0000ffff83c101e0
> [ 334.641894] x13: 0000ffff83c12048 x12: 0000000000000000
> [ 334.642421] x11: 0000000000010000 x10: 0000000008000000
> [ 334.642749] x9 : 000000000fffffff x8 : ffffffffffffffff
> [ 334.643378] x7 : 0000000000010000 x6 : 0000ffff83be0b00
> [ 334.643669] x5 : 0000000000000000 x4 : 0000000000000000
> [ 334.644012] x3 : 0000aaaaad4c0754 x2 : 0000ffffd14e97d8
> [ 334.644302] x1 : 0000fffefffffffc x0 : 0000ffff00000000
> [ 334.645211] Call trace:
>
> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
> ---
> arch/arm64/kernel/process.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
> index 3767fb21a5b8..de224f1512ca 100644
> --- a/arch/arm64/kernel/process.c
> +++ b/arch/arm64/kernel/process.c
> @@ -298,7 +298,8 @@ void __show_regs(struct pt_regs *regs)
> void show_regs(struct pt_regs * regs)
> {
> __show_regs(regs);
> - dump_backtrace(regs, NULL);
> + if (!user_mode(regs))
> + dump_backtrace(regs, NULL);
> }
Wouldn't this check be better off inside dump_backtrace()?
Will
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] arm64: skip dump_backtrace() in show_regs when user mode pt_regs
2019-04-03 12:44 ` Will Deacon
@ 2019-04-03 15:58 ` Kefeng Wang
2019-04-05 16:42 ` Will Deacon
0 siblings, 1 reply; 6+ messages in thread
From: Kefeng Wang @ 2019-04-03 15:58 UTC (permalink / raw)
To: Will Deacon; +Cc: Mark Rutland, Catalin Marinas, linux-arm-kernel
On 2019/4/3 20:44, Will Deacon wrote:
> On Thu, Mar 28, 2019 at 07:45:27PM +0800, Kefeng Wang wrote:
>> There is no need to call dump_backtrace() when the pt_regs
>> corresponds to user mode, eg,
>>
>> [ 334.634005] potentially unexpected fatal signal 11.
>> [ 334.634476] CPU: 3 PID: 2049 Comm: test Not tainted 5.1.0-rc2 #24
>> [ 334.634745] Hardware name: QEMU QEMU Virtual Machine, BIOS 0.0.0 02/06/2015
>> [ 334.635786] pstate: 60001000 (nZCv daif -PAN -UAO)
>> [ 334.636131] pc : 0000aaaaad4c0788
>> [ 334.636725] lr : 0000ffff83aac6e0
>> [ 334.637006] sp : 0000ffffd14e9670
>> [ 334.637352] x29: 0000ffffd14e9690 x28: 0000000000000000
>> [ 334.637814] x27: 0000000000000000 x26: 0000000000000000
>> [ 334.638143] x25: 0000000000000000 x24: 0000000000000000
>> [ 334.638460] x23: 0000000000000000 x22: 0000000000000000
>> [ 334.639499] x21: 0000aaaaad4c0650 x20: 0000000000000000
>> [ 334.640336] x19: 0000aaaaad4c0790 x18: 0000000000000002
>> [ 334.641062] x17: 0000ffff83aac600 x16: 0000aaaaad4d0fa0
>> [ 334.641474] x15: 0000ffff83c10150 x14: 0000ffff83c101e0
>> [ 334.641894] x13: 0000ffff83c12048 x12: 0000000000000000
>> [ 334.642421] x11: 0000000000010000 x10: 0000000008000000
>> [ 334.642749] x9 : 000000000fffffff x8 : ffffffffffffffff
>> [ 334.643378] x7 : 0000000000010000 x6 : 0000ffff83be0b00
>> [ 334.643669] x5 : 0000000000000000 x4 : 0000000000000000
>> [ 334.644012] x3 : 0000aaaaad4c0754 x2 : 0000ffffd14e97d8
>> [ 334.644302] x1 : 0000fffefffffffc x0 : 0000ffff00000000
>> [ 334.645211] Call trace:
>>
>> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
>> ---
>> arch/arm64/kernel/process.c | 3 ++-
>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
>> index 3767fb21a5b8..de224f1512ca 100644
>> --- a/arch/arm64/kernel/process.c
>> +++ b/arch/arm64/kernel/process.c
>> @@ -298,7 +298,8 @@ void __show_regs(struct pt_regs *regs)
>> void show_regs(struct pt_regs * regs)
>> {
>> __show_regs(regs);
>> - dump_backtrace(regs, NULL);
>> + if (!user_mode(regs))
>> + dump_backtrace(regs, NULL);
>> }
> Wouldn't this check be better off inside dump_backtrace()?
show_stack() call dump_backtrace() with pr_regs=NULL, so only judge it in show_regs().
Or using following changes?
diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
index 8ad119c3f665..66abe3ada3c7 100644
--- a/arch/arm64/kernel/traps.c
+++ b/arch/arm64/kernel/traps.c
@@ -106,6 +106,9 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
pr_debug("%s(regs = %p tsk = %p)\n", __func__, regs, tsk);
+ if (regs && user_mode(regs))
+ return;
+
if (!tsk)
tsk = current;
@@ -181,10 +184,8 @@ static int __die(const char *str, int err, struct pt_regs *regs)
TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk),
end_of_stack(tsk));
- if (!user_mode(regs)) {
- dump_backtrace(regs, tsk);
- dump_instr(KERN_EMERG, regs);
- }
+ dump_backtrace(regs, tsk);
+ dump_instr(KERN_EMERG, regs);
return ret;
}
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] arm64: skip dump_backtrace() in show_regs when user mode pt_regs
2019-04-03 15:58 ` Kefeng Wang
@ 2019-04-05 16:42 ` Will Deacon
2019-04-07 7:38 ` Kefeng Wang
0 siblings, 1 reply; 6+ messages in thread
From: Will Deacon @ 2019-04-05 16:42 UTC (permalink / raw)
To: Kefeng Wang; +Cc: Mark Rutland, Catalin Marinas, linux-arm-kernel
On Wed, Apr 03, 2019 at 11:58:44PM +0800, Kefeng Wang wrote:
> On 2019/4/3 20:44, Will Deacon wrote:
> > On Thu, Mar 28, 2019 at 07:45:27PM +0800, Kefeng Wang wrote:
> >> diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
> >> index 3767fb21a5b8..de224f1512ca 100644
> >> --- a/arch/arm64/kernel/process.c
> >> +++ b/arch/arm64/kernel/process.c
> >> @@ -298,7 +298,8 @@ void __show_regs(struct pt_regs *regs)
> >> void show_regs(struct pt_regs * regs)
> >> {
> >> __show_regs(regs);
> >> - dump_backtrace(regs, NULL);
> >> + if (!user_mode(regs))
> >> + dump_backtrace(regs, NULL);
> >> }
> > Wouldn't this check be better off inside dump_backtrace()?
>
> show_stack() call dump_backtrace() with pr_regs=NULL, so only judge it in show_regs().
>
> Or using following changes?
>
> diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
> index 8ad119c3f665..66abe3ada3c7 100644
> --- a/arch/arm64/kernel/traps.c
> +++ b/arch/arm64/kernel/traps.c
> @@ -106,6 +106,9 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
>
> pr_debug("%s(regs = %p tsk = %p)\n", __func__, regs, tsk);
>
> + if (regs && user_mode(regs))
> + return;
> +
> if (!tsk)
> tsk = current;
>
> @@ -181,10 +184,8 @@ static int __die(const char *str, int err, struct pt_regs *regs)
> TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk),
> end_of_stack(tsk));
>
> - if (!user_mode(regs)) {
> - dump_backtrace(regs, tsk);
> - dump_instr(KERN_EMERG, regs);
> - }
> + dump_backtrace(regs, tsk);
> + dump_instr(KERN_EMERG, regs);
>
> return ret;
> }
Yeah, something like that. See my version below.
Will
--->8
diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
index 8ad119c3f665..29755989f616 100644
--- a/arch/arm64/kernel/traps.c
+++ b/arch/arm64/kernel/traps.c
@@ -102,10 +102,16 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
{
struct stackframe frame;
- int skip;
+ int skip = 0;
pr_debug("%s(regs = %p tsk = %p)\n", __func__, regs, tsk);
+ if (regs) {
+ if (user_mode(regs))
+ return;
+ skip = 1;
+ }
+
if (!tsk)
tsk = current;
@@ -126,7 +132,6 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
frame.graph = 0;
#endif
- skip = !!regs;
printk("Call trace:\n");
do {
/* skip until specified stack frame */
@@ -176,15 +181,13 @@ static int __die(const char *str, int err, struct pt_regs *regs)
return ret;
print_modules();
- __show_regs(regs);
pr_emerg("Process %.*s (pid: %d, stack limit = 0x%p)\n",
TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk),
end_of_stack(tsk));
+ show_regs(regs);
- if (!user_mode(regs)) {
- dump_backtrace(regs, tsk);
+ if (!user_mode(regs))
dump_instr(KERN_EMERG, regs);
- }
return ret;
}
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] arm64: skip dump_backtrace() in show_regs when user mode pt_regs
2019-04-05 16:42 ` Will Deacon
@ 2019-04-07 7:38 ` Kefeng Wang
2019-04-08 17:05 ` Will Deacon
0 siblings, 1 reply; 6+ messages in thread
From: Kefeng Wang @ 2019-04-07 7:38 UTC (permalink / raw)
To: Will Deacon; +Cc: Mark Rutland, Catalin Marinas, linux-arm-kernel
On 2019/4/6 0:42, Will Deacon wrote:
> On Wed, Apr 03, 2019 at 11:58:44PM +0800, Kefeng Wang wrote:
>> On 2019/4/3 20:44, Will Deacon wrote:
>>> On Thu, Mar 28, 2019 at 07:45:27PM +0800, Kefeng Wang wrote:
>>>
> Yeah, something like that. See my version below.
It's better, should I resend it or you will pick it directly?
>
> Will
>
> --->8
>
> diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
> index 8ad119c3f665..29755989f616 100644
> --- a/arch/arm64/kernel/traps.c
> +++ b/arch/arm64/kernel/traps.c
> @@ -102,10 +102,16 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
> void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
> {
> struct stackframe frame;
> - int skip;
> + int skip = 0;
>
> pr_debug("%s(regs = %p tsk = %p)\n", __func__, regs, tsk);
>
> + if (regs) {
> + if (user_mode(regs))
> + return;
> + skip = 1;
> + }
> +
> if (!tsk)
> tsk = current;
>
> @@ -126,7 +132,6 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
> frame.graph = 0;
> #endif
>
> - skip = !!regs;
> printk("Call trace:\n");
> do {
> /* skip until specified stack frame */
> @@ -176,15 +181,13 @@ static int __die(const char *str, int err, struct pt_regs *regs)
> return ret;
>
> print_modules();
> - __show_regs(regs);
> pr_emerg("Process %.*s (pid: %d, stack limit = 0x%p)\n",
> TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk),
> end_of_stack(tsk));
> + show_regs(regs);
>
> - if (!user_mode(regs)) {
> - dump_backtrace(regs, tsk);
> + if (!user_mode(regs))
> dump_instr(KERN_EMERG, regs);
> - }
>
> return ret;
> }
>
> .
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] arm64: skip dump_backtrace() in show_regs when user mode pt_regs
2019-04-07 7:38 ` Kefeng Wang
@ 2019-04-08 17:05 ` Will Deacon
0 siblings, 0 replies; 6+ messages in thread
From: Will Deacon @ 2019-04-08 17:05 UTC (permalink / raw)
To: Kefeng Wang; +Cc: Mark Rutland, Catalin Marinas, linux-arm-kernel
On Sun, Apr 07, 2019 at 03:38:19PM +0800, Kefeng Wang wrote:
>
> On 2019/4/6 0:42, Will Deacon wrote:
> > On Wed, Apr 03, 2019 at 11:58:44PM +0800, Kefeng Wang wrote:
> >> On 2019/4/3 20:44, Will Deacon wrote:
> >>> On Thu, Mar 28, 2019 at 07:45:27PM +0800, Kefeng Wang wrote:
> >>>
> > Yeah, something like that. See my version below.
>
> It's better, should I resend it or you will pick it directly?
I'll send it out as a patch.
Cheers,
Will
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-04-08 17:05 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-28 11:45 [PATCH] arm64: skip dump_backtrace() in show_regs when user mode pt_regs Kefeng Wang
2019-04-03 12:44 ` Will Deacon
2019-04-03 15:58 ` Kefeng Wang
2019-04-05 16:42 ` Will Deacon
2019-04-07 7:38 ` Kefeng Wang
2019-04-08 17:05 ` Will Deacon
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.