summaryrefslogtreecommitdiffstats
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:47:42 +0100
commit32c38aef54b9e447d165fd07d7336232233e7720 (patch)
treeb08a6887aa55fcd86a1eb23a70c0ab689abdaba8
parent008571514135873267d4cfde6bbd517ba865e3a8 (diff)
downloadkernel-uprobes-32c38aef54b9e447d165fd07d7336232233e7720.zip
kernel-uprobes-32c38aef54b9e447d165fd07d7336232233e7720.tar.gz
kernel-uprobes-32c38aef54b9e447d165fd07d7336232233e7720.tar.xz
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>
-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 2c1ff05..41f048c 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))
/*