From: Masami Hiramatsu <hiramatu@sdl.hitachi.co.jp>
To: systemtap@sources.redhat.com, ananth@in.ibm.com, "Keshavamurthy,
Anil S" <anil.s.keshavamurthy@intel.com>
Cc: sugita@sdl.hitachi.co.jp, Satoshi Oshima <soshima@redhat.com>,
Hideo Aoki <haoki@redhat.com>
Subject: [Patch 4/4][Djprobe][testing] Djprobe update for linux-2.6.14-rc5-mm1
Date: Thu, 27 Oct 2005 13:31:00 -0000 [thread overview]
Message-ID: <4360D6AC.9010001@sdl.hitachi.co.jp> (raw)
In-Reply-To: <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);
prev parent reply other threads:[~2005-10-27 13:31 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-10-27 13:22 [Patch 0/4][Djprobe] " Masami Hiramatsu
2005-10-27 13:26 ` [Patch 1/4][Djprobe] " Masami Hiramatsu
2005-10-27 13:28 ` [Patch 2/4][Djprobe] " Masami Hiramatsu
2005-10-27 13:30 ` [Patch 3/4][Djprobe] " Masami Hiramatsu
2005-10-27 13:31 ` Masami Hiramatsu [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4360D6AC.9010001@sdl.hitachi.co.jp \
--to=hiramatu@sdl.hitachi.co.jp \
--cc=ananth@in.ibm.com \
--cc=anil.s.keshavamurthy@intel.com \
--cc=haoki@redhat.com \
--cc=soshima@redhat.com \
--cc=sugita@sdl.hitachi.co.jp \
--cc=systemtap@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).