Skip to content

Commit 3dbe582

Browse files
Yipeng Zoupalmer-dabbelt
authored andcommitted
riscv:uprobe fix SR_SPIE set/clear handling
In riscv the process of uprobe going to clear spie before exec the origin insn,and set spie after that.But When access the page which origin insn has been placed a page fault may happen and irq was disabled in arch_uprobe_pre_xol function,It cause a WARN as follows. There is no need to clear/set spie in arch_uprobe_pre/post/abort_xol. We can just remove it. [ 31.684157] BUG: sleeping function called from invalid context at kernel/locking/rwsem.c:1488 [ 31.684677] in_atomic(): 0, irqs_disabled(): 1, non_block: 0, pid: 76, name: work [ 31.684929] preempt_count: 0, expected: 0 [ 31.685969] CPU: 2 PID: 76 Comm: work Tainted: G [ 31.686542] Hardware name: riscv-virtio,qemu (DT) [ 31.686797] Call Trace: [ 31.687053] [<ffffffff80006442>] dump_backtrace+0x30/0x38 [ 31.687699] [<ffffffff80812118>] show_stack+0x40/0x4c [ 31.688141] [<ffffffff8081817a>] dump_stack_lvl+0x44/0x5c [ 31.688396] [<ffffffff808181aa>] dump_stack+0x18/0x20 [ 31.688653] [<ffffffff8003e454>] __might_resched+0x114/0x122 [ 31.688948] [<ffffffff8003e4b2>] __might_sleep+0x50/0x7a [ 31.689435] [<ffffffff80822676>] down_read+0x30/0x130 [ 31.689728] [<ffffffff8000b650>] do_page_fault+0x166/x446 [ 31.689997] [<ffffffff80003c0c>] ret_from_exception+0x0/0xc Fixes: 7478408 ("riscv: Add uprobes supported") Signed-off-by: Yipeng Zou <[email protected]> Reviewed-by: Guo Ren <[email protected]> Cc: [email protected] Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent b60cf8e commit 3dbe582

File tree

1 file changed

+0
-6
lines changed

1 file changed

+0
-6
lines changed

arch/riscv/kernel/probes/uprobes.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,6 @@ int arch_uprobe_pre_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)
5959

6060
instruction_pointer_set(regs, utask->xol_vaddr);
6161

62-
regs->status &= ~SR_SPIE;
63-
6462
return 0;
6563
}
6664

@@ -72,8 +70,6 @@ int arch_uprobe_post_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)
7270

7371
instruction_pointer_set(regs, utask->vaddr + auprobe->insn_size);
7472

75-
regs->status |= SR_SPIE;
76-
7773
return 0;
7874
}
7975

@@ -111,8 +107,6 @@ void arch_uprobe_abort_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)
111107
* address.
112108
*/
113109
instruction_pointer_set(regs, utask->vaddr);
114-
115-
regs->status &= ~SR_SPIE;
116110
}
117111

118112
bool arch_uretprobe_is_alive(struct return_instance *ret, enum rp_check ctx,

0 commit comments

Comments
 (0)