From c9ec5bf127874b0e8c633488caebeb85593d4fac Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Mon, 31 Dec 2012 18:20:42 +0100 Subject: [PATCH] --- yaml --- r: 350095 b: refs/heads/master c: 608e7427c0a06de0d70374a9fd7defc8eb228b7e h: refs/heads/master i: 350093: 5dc01398eae0e08767005b73ae394ac3a84e32b5 350091: 5a686c8c2ada4a0d3b76c788ab966df9fa7af2f0 350087: fdc4f80ede8da5fd1777df4591c428856b7caa35 350079: d406930bb4190f5ee38efa5f5aa031e74c5c6b9c v: v3 --- [refs] | 2 +- trunk/kernel/events/uprobes.c | 16 ++++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/[refs] b/[refs] index 0485520eff20..42d120425b00 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: aba51024e7159c93914557caaa2b8cda26331091 +refs/heads/master: 608e7427c0a06de0d70374a9fd7defc8eb228b7e diff --git a/trunk/kernel/events/uprobes.c b/trunk/kernel/events/uprobes.c index 0527379dac5b..071edcb3e62d 100644 --- a/trunk/kernel/events/uprobes.c +++ b/trunk/kernel/events/uprobes.c @@ -1308,7 +1308,9 @@ pre_ssout(struct uprobe *uprobe, struct pt_regs *regs, unsigned long bp_vaddr) unsigned long xol_vaddr; int err; - utask = current->utask; + utask = get_utask(); + if (!utask) + return -ENOMEM; xol_vaddr = xol_get_insn_slot(uprobe); if (!xol_vaddr) @@ -1323,6 +1325,8 @@ pre_ssout(struct uprobe *uprobe, struct pt_regs *regs, unsigned long bp_vaddr) return err; } + utask->active_uprobe = uprobe; + utask->state = UTASK_SSTEP; return 0; } @@ -1474,7 +1478,6 @@ static void handler_chain(struct uprobe *uprobe, struct pt_regs *regs) */ static void handle_swbp(struct pt_regs *regs) { - struct uprobe_task *utask; struct uprobe *uprobe; unsigned long bp_vaddr; int uninitialized_var(is_swbp); @@ -1512,19 +1515,12 @@ static void handle_swbp(struct pt_regs *regs) if (unlikely(!test_bit(UPROBE_COPY_INSN, &uprobe->flags))) goto out; - utask = get_utask(); - if (!utask) - goto out; /* re-execute the instruction. */ - handler_chain(uprobe, regs); if (can_skip_sstep(uprobe, regs)) goto out; - if (!pre_ssout(uprobe, regs, bp_vaddr)) { - utask->active_uprobe = uprobe; - utask->state = UTASK_SSTEP; + if (!pre_ssout(uprobe, regs, bp_vaddr)) return; - } /* can_skip_sstep() succeeded, or restart if can't singlestep */ out: