From fe7b5641611f55c41d798f2a48d1b2af9ace5b1b Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Sat, 29 Sep 2012 21:56:57 +0200 Subject: [PATCH] --- yaml --- r: 334766 b: refs/heads/master c: 142b18ddc81439acda4bc4231b291e99fe67d507 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/events/uprobes.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 4cca67dc9eb3..196b88c3509a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 076a365b3da99b68c5d58e394714d0611f1fa002 +refs/heads/master: 142b18ddc81439acda4bc4231b291e99fe67d507 diff --git a/trunk/kernel/events/uprobes.c b/trunk/kernel/events/uprobes.c index a1b466d17c17..c718fef28617 100644 --- a/trunk/kernel/events/uprobes.c +++ b/trunk/kernel/events/uprobes.c @@ -596,6 +596,7 @@ install_breakpoint(struct uprobe *uprobe, struct mm_struct *mm, BUG_ON((uprobe->offset & ~PAGE_MASK) + UPROBE_SWBP_INSN_SIZE > PAGE_SIZE); + smp_wmb(); /* pairs with rmb() in find_active_uprobe() */ uprobe->flags |= UPROBE_COPY_INSN; } @@ -1436,6 +1437,14 @@ static void handle_swbp(struct pt_regs *regs) } return; } + /* + * TODO: move copy_insn/etc into _register and remove this hack. + * After we hit the bp, _unregister + _register can install the + * new and not-yet-analyzed uprobe at the same address, restart. + */ + smp_rmb(); /* pairs with wmb() in install_breakpoint() */ + if (unlikely(!(uprobe->flags & UPROBE_COPY_INSN))) + goto restart; utask = current->utask; if (!utask) {