OSDN Git Service
(root)
/
tomoyo
/
tomoyo-test1.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
db6b84a
)
riscv: stacktrace: pin the task's stack in get_wchan
author
Jisheng Zhang
<jszhang@kernel.org>
Fri, 23 Jul 2021 00:22:26 +0000
(08:22 +0800)
committer
Palmer Dabbelt
<palmerdabbelt@google.com>
Sat, 24 Jul 2021 00:29:03 +0000
(17:29 -0700)
Pin the task's stack before calling walk_stackframe() in get_wchan().
This can fix the panic as reported by Andreas when CONFIG_VMAP_STACK=y:
[ 65.609696] Unable to handle kernel paging request at virtual address
ffffffd0003bbde8
[ 65.610460] Oops [#1]
[ 65.610626] Modules linked in: virtio_blk virtio_mmio rtc_goldfish btrfs blake2b_generic libcrc32c xor raid6_pq sg dm_multipath dm_mod scsi_dh_rdac scsi_dh_emc scsi_dh_alua efivarfs
[ 65.611670] CPU: 2 PID: 1 Comm: systemd Not tainted 5.14.0-rc1-1.g34fe32a-default #1 openSUSE Tumbleweed (unreleased)
c62f7109153e5a0897ee58ba52393ad99b070fd2
[ 65.612334] Hardware name: riscv-virtio,qemu (DT)
[ 65.613008] epc : get_wchan+0x5c/0x88
[ 65.613334] ra : get_wchan+0x42/0x88
[ 65.613625] epc :
ffffffff800048a4
ra :
ffffffff8000488a
sp :
ffffffd00021bb90
[ 65.614008] gp :
ffffffff817709f8
tp :
ffffffe07fe91b80
t0 :
00000000000001f8
[ 65.614411] t1 :
0000000000020000
t2 :
0000000000000000
s0 :
ffffffd00021bbd0
[ 65.614818] s1 :
ffffffd0003bbdf0
a0 :
0000000000000001
a1 :
0000000000000002
[ 65.615237] a2 :
ffffffff81618008
a3 :
0000000000000000
a4 :
0000000000000000
[ 65.615637] a5 :
ffffffd0003bc000
a6 :
0000000000000002
a7 :
ffffffe27d370000
[ 65.616022] s2 :
ffffffd0003bbd90
s3 :
ffffffff8071a81e
s4 :
0000000000003fff
[ 65.616407] s5 :
ffffffffffffc000
s6 :
0000000000000000
s7 :
ffffffff81618008
[ 65.616845] s8 :
0000000000000001
s9 :
0000000180000040
s10:
0000000000000000
[ 65.617248] s11:
000000000000016b
t3 :
000000ff00000000
t4 :
0c6aec92de5e3fd7
[ 65.617672] t5 :
fff78f60608fcfff
t6 :
0000000000000078
[ 65.618088] status:
0000000000000120
badaddr:
ffffffd0003bbde8
cause:
000000000000000d
[ 65.618621] [<
ffffffff800048a4
>] get_wchan+0x5c/0x88
[ 65.619008] [<
ffffffff8022da88
>] do_task_stat+0x7a2/0xa46
[ 65.619325] [<
ffffffff8022e87e
>] proc_tgid_stat+0xe/0x16
[ 65.619637] [<
ffffffff80227dd6
>] proc_single_show+0x46/0x96
[ 65.619979] [<
ffffffff801ccb1e
>] seq_read_iter+0x190/0x31e
[ 65.620341] [<
ffffffff801ccd70
>] seq_read+0xc4/0x104
[ 65.620633] [<
ffffffff801a6bfe
>] vfs_read+0x6a/0x112
[ 65.620922] [<
ffffffff801a701c
>] ksys_read+0x54/0xbe
[ 65.621206] [<
ffffffff801a7094
>] sys_read+0xe/0x16
[ 65.621474] [<
ffffffff8000303e
>] ret_from_syscall+0x0/0x2
[ 65.622169] ---[ end trace
f24856ed2b8789c5
]---
[ 65.622832] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
arch/riscv/kernel/stacktrace.c
patch
|
blob
|
history
diff --git
a/arch/riscv/kernel/stacktrace.c
b/arch/riscv/kernel/stacktrace.c
index
ff467b9
..
ac75936
100644
(file)
--- a/
arch/riscv/kernel/stacktrace.c
+++ b/
arch/riscv/kernel/stacktrace.c
@@
-132,8
+132,12
@@
unsigned long get_wchan(struct task_struct *task)
{
unsigned long pc = 0;
- if (likely(task && task != current && !task_is_running(task)))
+ if (likely(task && task != current && !task_is_running(task))) {
+ if (!try_get_task_stack(task))
+ return 0;
walk_stackframe(task, NULL, save_wchan, &pc);
+ put_task_stack(task);
+ }
return pc;
}