summaryrefslogtreecommitdiffstats
path: root/kernel/events
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@redhat.com>2012-09-14 18:23:51 +0200
committerAnton Arapov <anton@redhat.com>2012-10-29 11:50:11 +0100
commited7fbc8e9d0ee3c217a14dd51e484c563220fc0a (patch)
tree1882e6ca73c48043cafdc39513fd9ac17f26c6d9 /kernel/events
parentf8f2b15a1ba940e7e6fe026f50e92499cda1b986 (diff)
downloadkernel-uprobes-ed7fbc8e9d0ee3c217a14dd51e484c563220fc0a.tar.gz
kernel-uprobes-ed7fbc8e9d0ee3c217a14dd51e484c563220fc0a.tar.xz
kernel-uprobes-ed7fbc8e9d0ee3c217a14dd51e484c563220fc0a.zip
uprobes: Do not setup ->active_uprobe/state prematurely
handle_swbp() sets utask->active_uprobe before handler_chain(), and UTASK_SSTEP before pre_ssout(). This complicates the code for no reason, arch_ hooks or consumer->handler() should not (and can't) use this info. Change handle_swbp() to initialize them after pre_ssout(), and remove the no longer needed cleanup-utask code. Signed-off-by: Oleg Nesterov <oleg@redhat.com> cked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Diffstat (limited to 'kernel/events')
-rw-r--r--kernel/events/uprobes.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
index 2c1ff05af6f..41f048c9142 100644
--- a/kernel/events/uprobes.c
+++ b/kernel/events/uprobes.c
@@ -1496,22 +1496,19 @@ static void handle_swbp(struct pt_regs *regs)
if (!utask)
goto cleanup_ret;
}
- utask->active_uprobe = uprobe;
+
handler_chain(uprobe, regs);
if (uprobe->flags & UPROBE_SKIP_SSTEP && can_skip_sstep(uprobe, regs))
goto cleanup_ret;
- utask->state = UTASK_SSTEP;
if (!pre_ssout(uprobe, regs, bp_vaddr)) {
arch_uprobe_enable_step(&uprobe->arch);
+ utask->active_uprobe = uprobe;
+ utask->state = UTASK_SSTEP;
return;
}
cleanup_ret:
- if (utask) {
- utask->active_uprobe = NULL;
- utask->state = UTASK_RUNNING;
- }
if (!(uprobe->flags & UPROBE_SKIP_SSTEP))
/*