Re: [RFC] [PATCH] To list all active probes in the system---Take-2

From: Andrew Morton
Date: Fri Feb 09 2007 - 03:04:47 EST


On Thu, 08 Feb 2007 17:16:15 +0530 Srinivasa Ds <srinivasa@xxxxxxxxxx> wrote:

> +module_init(debugfs_kprobe_init);
> +#endif /* CONFIG_DEBUG_FS */
> +
> __initcall(init_kprobes);

I think you'll find this doesn't work when loaded as a module: we only
support a single initcall per module. (Which might be a bit dumb of us -
it's probably easy to fix and is an inconsistency between modular and
built-in).

<looks>

Oh, kernel/kprobes.o can't be linked as a module. It looks like it could
be though?

You have a little race: debugfs_kprobe_init() will be called before
init_kprobes(). If someone were able to read from the debugfs files in
that window (they probably can't as we don't support modular kprobes.ko)
they'll crash the kernel. I'll switch debugfs_kprobe_init() to
late_initcall to fix that.

There are quite a few things in there which could have static scope.


I'll apply this:



diff -puN kernel/kprobes.c~kprobes-list-all-active-probes-in-the-system-tidy kernel/kprobes.c
--- a/kernel/kprobes.c~kprobes-list-all-active-probes-in-the-system-tidy
+++ a/kernel/kprobes.c
@@ -836,12 +836,12 @@ static void __kprobes report_probe(struc
seq_printf(pi, "%p %s %p\n", p->addr, kprobe_type, p->addr);
}

-void __kprobes *kprobe_seq_start(struct seq_file *f, loff_t *pos)
+static void __kprobes *kprobe_seq_start(struct seq_file *f, loff_t *pos)
{
return (*pos < KPROBE_TABLE_SIZE) ? pos : NULL;
}

-void __kprobes *kprobe_seq_next(struct seq_file *f, void *v, loff_t *pos)
+static void __kprobes *kprobe_seq_next(struct seq_file *f, void *v, loff_t *pos)
{
(*pos)++;
if (*pos >= KPROBE_TABLE_SIZE)
@@ -849,12 +849,12 @@ void __kprobes *kprobe_seq_next(struct s
return pos;
}

-void __kprobes kprobe_seq_stop(struct seq_file *f, void *v)
+static void __kprobes kprobe_seq_stop(struct seq_file *f, void *v)
{
/* Nothing to do */
}

-int __kprobes show_kprobe_addr(struct seq_file *pi, void *v)
+static int __kprobes show_kprobe_addr(struct seq_file *pi, void *v)
{
struct hlist_head *head;
struct hlist_node *node;
@@ -879,7 +879,7 @@ int __kprobes show_kprobe_addr(struct se
return 0;
}

-struct seq_operations kprobes_seq_ops = {
+static struct seq_operations kprobes_seq_ops = {
.start = kprobe_seq_start,
.next = kprobe_seq_next,
.stop = kprobe_seq_stop,
@@ -916,10 +916,10 @@ static int __kprobes debugfs_kprobe_init
return 0;
}

-module_init(debugfs_kprobe_init);
+late_initcall(debugfs_kprobe_init);
#endif /* CONFIG_DEBUG_FS */

-__initcall(init_kprobes);
+module_init(init_kprobes);

EXPORT_SYMBOL_GPL(register_kprobe);
EXPORT_SYMBOL_GPL(unregister_kprobe);
@@ -928,4 +928,3 @@ EXPORT_SYMBOL_GPL(unregister_jprobe);
EXPORT_SYMBOL_GPL(jprobe_return);
EXPORT_SYMBOL_GPL(register_kretprobe);
EXPORT_SYMBOL_GPL(unregister_kretprobe);
-
_

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/