summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrank Ch. Eigler <fche@elastic.org>2008-09-02 17:00:49 -0400
committerFrank Ch. Eigler <fche@elastic.org>2008-09-02 17:00:49 -0400
commitf02dd36464a34542d5f853d8643cc473af59c5b2 (patch)
tree4c03c7e0e99363e9d391938c7b98ce4fc4617db9
parentdb48cbe97f1de60f11dbb4ecc5f91c1023c24ef7 (diff)
downloadsystemtap-steved-f02dd36464a34542d5f853d8643cc473af59c5b2.tar.gz
systemtap-steved-f02dd36464a34542d5f853d8643cc473af59c5b2.tar.xz
systemtap-steved-f02dd36464a34542d5f853d8643cc473af59c5b2.zip
PR4225: minor uprobe unregistration speedup
-rw-r--r--ChangeLog5
-rw-r--r--tapsets.cxx9
2 files changed, 8 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index ddacadad..629b2b1a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-09-02 Frank Ch. Eigler <fche@elastic.org>
+
+ * tapsets.cxx (uprobe..emit_module_init): Leave dying-uprobe
+ loop as early as possible.
+
2008-09-02 Stan Cox <scox@redhat.com>
* elaborate.cxx (add_global_var_display): Simplify token use.
diff --git a/tapsets.cxx b/tapsets.cxx
index 4cda930f..4fa53a88 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -6790,9 +6790,8 @@ uprobe_derived_probe_group::emit_module_decls (systemtap_session& s)
// unregister old uprobe
s.op->newline(-1) << "} else if (!register_p && "
<< "sup->spec_index == spec_index && " // a u[ret]probe set up for this probe point
- << "((sups->return_p && sup->urp.u.pid == tsk->tgid) ||" // dying uretprobe
- << "(!sups->return_p && sup->up.pid == tsk->tgid))) {"; // dying uprobe
- // XXX: or just check sup->spec_index == spec_index?
+ << "((sups->return_p && sup->urp.u.pid == tsk->tgid && sup->urp.u.vaddr == relocation + sups->address) ||" // dying uretprobe
+ << "(!sups->return_p && sup->up.pid == tsk->tgid && sup->up.vaddr == relocation + sups->address))) {"; // dying uprobe
s.op->newline() << "if (sups->return_p) {";
s.op->newline(1) << "#ifdef DEBUG_UPROBES";
s.op->newline() << "printk (KERN_WARNING \"uretprobe unregister pid %d addr %p\\n\", sup->up.pid, (void*) sup->up.vaddr);";
@@ -6806,9 +6805,7 @@ uprobe_derived_probe_group::emit_module_decls (systemtap_session& s)
s.op->newline(-1) << "}";
s.op->newline(1) << "sup->spec_index = -1;";
s.op->newline() << "handled_p = 1;";
- // XXX: Do we need to keep searching the array for other processes, or
- // can we break just like for the register-new case?
-
+ s.op->newline() << "break;"; // exit to-free slot search
s.op->newline(-1) << "}"; // if/else
s.op->newline(-1) << "}"; // stap_uprobes[] loop