login
Header Space

 
 

[PATCH -mm 3/5] kprobes: add (un)register_kretprobes for batch registration

Previous thread: [PATCH -mm 5/5] kprobes: update document about batch registration by Masami Hiramatsu on Friday, March 14, 2008 - 4:41 pm. (1 message)

Next thread: [PATCH -mm 4/5] kprobes: add (un)register_jprobes for batch registration by Masami Hiramatsu on Friday, March 14, 2008 - 4:41 pm. (1 message)
To: Andrew Morton <akpm@...>
Cc: Ananth N Mavinakayanahalli <ananth@...>, Jim Keniston <jkenisto@...>, Prasanna S Panchamukhi <prasanna@...>, Shaohua Li <shaohua.li@...>, David Miller <davem@...>, LKML <linux-kernel@...>, systemtap-ml <systemtap@...>, Frank Ch. Eigler <fche@...>
Date: Friday, March 14, 2008 - 4:41 pm

Introduce unregister_/register_kretprobes() for kretprobe
batch registration.

Signed-off-by: Masami Hiramatsu &lt;mhiramat@redhat.com&gt;
---

 include/linux/kprobes.h |    9 ++++
 kernel/kprobes.c        |  108 +++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 97 insertions(+), 20 deletions(-)

Index: 2.6.25-rc5-mm1/kernel/kprobes.c
===================================================================
--- 2.6.25-rc5-mm1.orig/kernel/kprobes.c
+++ 2.6.25-rc5-mm1/kernel/kprobes.c
@@ -429,6 +429,21 @@ static inline void free_rp_inst(struct k
 	}
 }

+static void __kprobes cleanup_rp_inst(struct kretprobe *rp)
+{
+	unsigned long flags;
+	struct kretprobe_instance *ri;
+	struct hlist_node *pos, *next;
+	/* No race here */
+	spin_lock_irqsave(&amp;kretprobe_lock, flags);
+	hlist_for_each_entry_safe(ri, pos, next, &amp;rp-&gt;used_instances, uflist) {
+		ri-&gt;rp = NULL;
+		hlist_del(&amp;ri-&gt;uflist);
+	}
+	spin_unlock_irqrestore(&amp;kretprobe_lock, flags);
+	free_rp_inst(rp);
+}
+
 /*
  * Keep all fields in the kprobe consistent
  */
@@ -798,7 +813,8 @@ static int __kprobes pre_handler_kretpro
 	return 0;
 }

-int __kprobes register_kretprobe(struct kretprobe *rp)
+static int __kprobes __register_kretprobe(struct kretprobe *rp,
+					  unsigned long called_from)
 {
 	int ret = 0;
 	struct kretprobe_instance *inst;
@@ -844,43 +860,93 @@ int __kprobes register_kretprobe(struct

 	rp-&gt;nmissed = 0;
 	/* Establish function entry probe point */
-	if ((ret = __register_kprobe(&amp;rp-&gt;kp,
-		(unsigned long)__builtin_return_address(0))) != 0)
+	ret = __register_kprobe(&amp;rp-&gt;kp, called_from);
+	if (ret != 0)
 		free_rp_inst(rp);
 	return ret;
 }

+static int __register_kretprobes(struct kretprobe **rps, int num,
+	unsigned long called_from)
+{
+	int ret = 0, i;
+
+	if (num &lt;= 0)
+		return -EINVAL;
+	for (i = 0; i &lt; num; i++) {
+		ret = __register_kretprobe(rps[i], called_from);
+		if (ret &lt; 0 &amp;&amp; i &gt; 0) {
+			...
Previous thread: [PATCH -mm 5/5] kprobes: update document about batch registration by Masami Hiramatsu on Friday, March 14, 2008 - 4:41 pm. (1 message)

Next thread: [PATCH -mm 4/5] kprobes: add (un)register_jprobes for batch registration by Masami Hiramatsu on Friday, March 14, 2008 - 4:41 pm. (1 message)
speck-geostationary