This is the mail archive of the systemtap@sourceware.org mailing list for the systemtap project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch 4/4][Djprobe][testing] Djprobe update for linux-2.6.14-rc5-mm1


Hi,

This patch provides bulk registration/unregistration interfaces
to djprobe.

-- 
Masami HIRAMATSU
2nd Research Dept.
Hitachi, Ltd., Systems Development Laboratory
E-mail: hiramatu@sdl.hitachi.co.jp

 include/linux/djprobe.h |   20 ++++++++++++
 kernel/djprobe.c        |   80 +++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 86 insertions(+), 14 deletions(-)
diff -Narup linux-2.6.14-rc5-mm1.djp.3/include/linux/djprobe.h linux-2.6.14-rc5-mm1.djp.4/include/linux/djprobe.h
--- linux-2.6.14-rc5-mm1.djp.3/include/linux/djprobe.h	2005-10-26 15:52:22.000000000 +0900
+++ linux-2.6.14-rc5-mm1.djp.4/include/linux/djprobe.h	2005-10-27 11:16:31.000000000 +0900
@@ -56,6 +56,12 @@ struct djprobe {
 	struct djprobe_instance *inst;
 };

+struct djprobe_param {
+	struct djprobe *djp;
+	void *addr;
+	int size;
+};
+
 #ifdef CONFIG_DJPROBE
 extern int arch_prepare_djprobe_instance(struct djprobe_instance *djpi,
 					 unsigned long size);
@@ -67,14 +73,28 @@ extern void arch_uninstall_djprobe_insta
 struct djprobe_instance *__kprobes get_djprobe_instance(void *addr, int size);

 int register_djprobe(struct djprobe *p, void *addr, int size);
+void register_bulk_djprobes(int nr_probes, struct djprobe_param params[]);
 void unregister_djprobe(struct djprobe *p);
+void unregister_bulk_djprobes(int nr_probes, struct djprobe_param params[]);
 #else /* CONFIG_DJPROBE */
 static inline int register_djprobe(struct djprobe *p)
 {
 	return -ENOSYS;
 }
+static inline void register_bulk_djprobes(int nr_probes,
+					  struct djprobe_param params[])
+{
+	int i;
+	for (i=0;i<nr_probes;i++)
+		params[i].djp->inst = NULL;
+}
+
 static inline void unregister_djprobe(struct djprobe *p)
 {
 }
+static inline void unregister_bulk_djprobes(int nr_probes,
+					    struct djprobe_param params[])
+{
+}
 #endif				/* CONFIG_DJPROBE */
 #endif				/* _LINUX_DJPROBE_H */
diff -Narup linux-2.6.14-rc5-mm1.djp.3/kernel/djprobe.c linux-2.6.14-rc5-mm1.djp.4/kernel/djprobe.c
--- linux-2.6.14-rc5-mm1.djp.3/kernel/djprobe.c	2005-10-27 11:59:10.000000000 +0900
+++ linux-2.6.14-rc5-mm1.djp.4/kernel/djprobe.c	2005-10-27 12:01:54.000000000 +0900
@@ -163,7 +163,8 @@ static void __kprobes __check_safety(voi
 	unlock_cpu_hotplug();
 }

-int __kprobes register_djprobe(struct djprobe *djp, void *addr, int size)
+static int __kprobes __register_djprobe(struct djprobe *djp, void *addr,
+					int size)
 {
 	struct djprobe_instance *djpi;
 	struct kprobe *kp;
@@ -177,7 +178,6 @@ int __kprobes register_djprobe(struct dj
 	if ((ret = in_kprobes_functions((unsigned long)addr)) != 0)
 		return ret;

-	down(&djprobe_mutex);
 	INIT_LIST_HEAD(&djp->plist);
 	/* check confliction with other djprobes */
 	djpi = __get_djprobe_instance(addr, size);
@@ -211,32 +211,82 @@ int __kprobes register_djprobe(struct dj
 		djp->inst = NULL;
 		list_del_rcu(&djp->plist);
 		__free_djprobe_instance(djpi);
-	} else {
-		__check_safety();
-		arch_install_djprobe_instance(djpi);
 	}
        out:
+	return ret;
+}
+
+int __kprobes register_djprobe(struct djprobe *djp, void *addr, int size)
+{
+	int ret;
+	down(&djprobe_mutex);
+	ret = __register_djprobe(djp, addr, size);
+	if (ret == 0) {
+		__check_safety();
+		arch_install_djprobe_instance(djp->inst);
+	}
 	up(&djprobe_mutex);
 	return ret;
 }

-void __kprobes unregister_djprobe(struct djprobe *djp)
+void __kprobes register_bulk_djprobes(int nr_probes,
+				      struct djprobe_param params[])
 {
-	struct djprobe_instance *djpi;
+	int i;
+	down(&djprobe_mutex);
+	for (i = 0; i < nr_probes; i++) {
+		params[i].djp->inst = NULL;
+		__register_djprobe(params[i].djp, params[i].addr,
+				   params[i].size);
+ 	}
+	__check_safety();
+	for (i = 0; i < nr_probes; i++) {
+		if (params[i].djp->inst)
+			arch_install_djprobe_instance(params[i].djp->inst);
+	}
+	up(&djprobe_mutex);
+}

+static void __kprobes __unregister_djprobe(struct djprobe *djp)
+{
 	BUG_ON(in_interrupt());

+	if (djp->plist.next == djp->plist.prev) {
+		/* this requires irq enabled */
+		arch_uninstall_djprobe_instance(djp->inst);
+	}
+	list_del_rcu(&djp->plist);
+	djp->inst = NULL;
+}
+
+void __kprobes unregister_djprobe(struct djprobe *djp)
+{
+	struct djprobe_instance *djpi;
 	down(&djprobe_mutex);
 	djpi = djp->inst;
-	if (djp->plist.next == djp->plist.prev) {
-		arch_uninstall_djprobe_instance(djpi);	/* this requires irq enabled */
-		list_del_rcu(&djp->plist);
-		djp->inst = NULL;
+	__unregister_djprobe(djp);
+	if (DJPI_EMPTY(djpi)) {
 		__check_safety();
 		__free_djprobe_instance(djpi);
-	} else {
-		list_del_rcu(&djp->plist);
-		djp->inst = NULL;
+	}
+	up(&djprobe_mutex);
+}
+
+void __kprobes unregister_bulk_djprobes(int nr_probes,
+					struct djprobe_param params[])
+{
+	struct djprobe_instance *djpi;
+	int i;
+	down(&djprobe_mutex);
+	for (i = 0; i < nr_probes; i++) {
+		__unregister_djprobe(params[i].djp);
+	}
+	__check_safety();
+	for (i = 0; i < nr_probes; i++) {
+		djpi = __get_djprobe_instance(params[i].addr, 1);
+		if (djpi && DJPI_EMPTY(djpi)) {
+			__free_djprobe_instance(djpi);
+		}
 	}
 	up(&djprobe_mutex);
 }
@@ -250,4 +300,6 @@ static int __init init_djprobe(void)
 __initcall(init_djprobe);

 EXPORT_SYMBOL_GPL(register_djprobe);
+EXPORT_SYMBOL_GPL(register_bulk_djprobes);
 EXPORT_SYMBOL_GPL(unregister_djprobe);
+EXPORT_SYMBOL_GPL(unregister_bulk_djprobes);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]