This is the mail archive of the
systemtap@sources.redhat.com
mailing list for the systemtap project.
[RFC PATCH 4/4] kprobes: x86_64 specific preempt changes
x86_64 specific preempt_enable/disable() changes
Signed-off-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
arch/x86_64/kernel/kprobes.c | 26 +++++++++++++-------------
1 files changed, 13 insertions(+), 13 deletions(-)
Index: linux-2.6.13-rc3/arch/x86_64/kernel/kprobes.c
===================================================================
--- linux-2.6.13-rc3.orig/arch/x86_64/kernel/kprobes.c 2005-07-27 13:11:05.000000000 -0400
+++ linux-2.6.13-rc3/arch/x86_64/kernel/kprobes.c 2005-07-27 13:29:38.000000000 -0400
@@ -302,9 +302,6 @@ int __kprobes kprobe_handler(struct pt_r
int ret = 0;
kprobe_opcode_t *addr = (kprobe_opcode_t *)(regs->rip - sizeof(kprobe_opcode_t));
- /* We're in an interrupt, but this is clear and BUG()-safe. */
- preempt_disable();
-
/* Check we're not actually recursing */
if (kprobe_running()) {
/* We *are* holding lock here, so this is safe.
@@ -378,6 +375,11 @@ int __kprobes kprobe_handler(struct pt_r
ss_probe:
prepare_singlestep(p, regs);
kprobe_status = KPROBE_HIT_SS;
+ /*
+ * This preempt_disable() matches the preempt_enable_no_resched()
+ * in post_kprobe_handler()
+ */
+ preempt_disable();
return 1;
no_kprobe:
@@ -447,7 +449,6 @@ int __kprobes trampoline_probe_handler(s
regs->rip = orig_ret_address;
unlock_kprobes();
- preempt_enable_no_resched();
/*
* By returning a non-zero value, we are telling
@@ -595,29 +596,29 @@ int __kprobes kprobe_exceptions_notify(s
unsigned long val, void *data)
{
struct die_args *args = (struct die_args *)data;
+ int ret = NOTIFY_DONE;
+
+ preempt_disable();
switch (val) {
case DIE_INT3:
if (kprobe_handler(args->regs))
- return NOTIFY_STOP;
+ ret = NOTIFY_STOP;
break;
case DIE_DEBUG:
if (post_kprobe_handler(args->regs))
- return NOTIFY_STOP;
+ ret = NOTIFY_STOP;
break;
case DIE_GPF:
- if (kprobe_running() &&
- kprobe_fault_handler(args->regs, args->trapnr))
- return NOTIFY_STOP;
- break;
case DIE_PAGE_FAULT:
if (kprobe_running() &&
kprobe_fault_handler(args->regs, args->trapnr))
- return NOTIFY_STOP;
+ ret = NOTIFY_STOP;
break;
default:
break;
}
- return NOTIFY_DONE;
+ preempt_enable();
+ return ret;
}
int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
@@ -643,7 +644,6 @@ int __kprobes setjmp_pre_handler(struct
void __kprobes jprobe_return(void)
{
- preempt_enable_no_resched();
asm volatile (" xchg %%rbx,%%rsp \n"
" int3 \n"
" .globl jprobe_return_end \n"