This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
[Patch 4/4][Djprobe][testing] Djprobe update for linux-2.6.14-rc5-mm1
- From: Masami Hiramatsu <hiramatu at sdl dot hitachi dot co dot jp>
- To: systemtap at sources dot redhat dot com, ananth at in dot ibm dot com,"Keshavamurthy, Anil S" <anil dot s dot keshavamurthy at intel dot com>
- Cc: sugita at sdl dot hitachi dot co dot jp, Satoshi Oshima <soshima at redhat dot com>,Hideo Aoki <haoki at redhat dot com>
- Date: Thu, 27 Oct 2005 22:31:24 +0900
- Subject: [Patch 4/4][Djprobe][testing] Djprobe update for linux-2.6.14-rc5-mm1
- References: <4360D47D.4010703@sdl.hitachi.co.jp>
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);