2007-02-06 09:55:42

by Srinivasa Ds

[permalink] [raw]
Subject: [RFC] [PATCH] To list all active probes in the system

Hi folks

I have developed a patch, that lists all active probes in the
system. I have done this through /proc interface. Currently list is
available under /proc/kprobes/list. Any suggestions for better place and
name??

My patch scans through kprobe_table[],lists out all the probes, in an
order it finds them. It also takes care of aggregate handlers. Type of
the probe is recognised by the kind of pre_handler it has. I have
assigned letter for each probe, like "k" for kprobes, "j" for jprobes,
"r" for kretprobes. Along with type of the probe,it also lists the
address of the instruction,its symbolic name(function name + offset) and
the module name.


Output of /proc/kprobes/list looks like this
======================
[root@llm31 a]# cat /proc/kprobes/list
c0000000000c0720 r .sys_write+0x0
c0000000000c0720 k .sys_write+0x0
c00000000004c550 k .do_fork+0x0
c00000000004c550 k .do_fork+0x0
c00000000004c550 j .do_fork+0x0
c0000000000bfed4 r .vfs_read+0x0
c0000000000bddb4 r .sys_open+0x0
c0000000000c0694 r .sys_read+0x0
c0000000000c0694 k .sys_read+0x0
c00000000004c554 k .do_fork+0x4
d0000000000781b0 k .autofs4_dentry_release+0x0 autofs4
c0000000000275d0 k kretprobe_trampoline+0x0
c0000000000bfd18 k .vfs_write+0x0
====================================

Please let me know your comments on this.

Signed-off-by: Srinivasa DS <[email protected]>


Attachments:
kp.diff (4.81 kB)

2007-02-06 10:06:16

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [RFC] [PATCH] To list all active probes in the system

On Tue, Feb 06, 2007 at 03:25:35PM +0530, Srinivasa Ds wrote:
> Hi folks
>
> I have developed a patch, that lists all active probes in the
> system. I have done this through /proc interface. Currently list is
> available under /proc/kprobes/list. Any suggestions for better place and
> name??

/debug/kprobes/list? :)

2007-02-06 10:14:09

by Andrew Morton

[permalink] [raw]
Subject: Re: [RFC] [PATCH] To list all active probes in the system

On Tue, 06 Feb 2007 15:25:35 +0530 Srinivasa Ds <[email protected]> wrote:

> I have developed a patch, that lists all active probes in the
> system.

userspace added the probes, so userspace should know where they all are?

2007-02-06 10:21:49

by Srinivasa Ds

[permalink] [raw]
Subject: Re: [RFC] [PATCH] To list all active probes in the system

Andrew Morton wrote:
> On Tue, 06 Feb 2007 15:25:35 +0530 Srinivasa Ds <[email protected]> wrote:
>
>> I have developed a patch, that lists all active probes in the
>> system.
>
> userspace added the probes, so userspace should know where they all are?
Irrespective of the number of users/modules that use kprobes, this is
one place where you can get all the info.

2007-02-06 10:22:45

by Srinivasa Ds

[permalink] [raw]
Subject: Re: [RFC] [PATCH] To list all active probes in the system

Christoph Hellwig wrote:
> On Tue, Feb 06, 2007 at 03:25:35PM +0530, Srinivasa Ds wrote:
>> Hi folks
>>
>> I have developed a patch, that lists all active probes in the
>> system. I have done this through /proc interface. Currently list is
>> available under /proc/kprobes/list. Any suggestions for better place and
>> name??
>
> /debug/kprobes/list? :)
>
Good Idea, I will update my patch to use debugfs.

2007-02-06 14:47:09

by Srinivasa Ds

[permalink] [raw]
Subject: Re: [RFC] [PATCH] To list all active probes in the system

fs/debugfs/inode.c | 4 ++
include/linux/kprobes.h | 4 ++
kernel/kprobes.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 100 insertions(+)

Index: linux-2.6.20/fs/debugfs/inode.c
===================================================================
--- linux-2.6.20.orig/fs/debugfs/inode.c
+++ linux-2.6.20/fs/debugfs/inode.c
@@ -25,6 +25,7 @@
#include <linux/namei.h>
#include <linux/debugfs.h>
#include <linux/fsnotify.h>
+#include <linux/kprobes.h>

#define DEBUGFS_MAGIC 0x64626720

@@ -320,6 +321,9 @@ static int __init debugfs_init(void)
retval = register_filesystem(&debug_fs_type);
if (retval)
subsystem_unregister(&debug_subsys);
+#ifdef CONFIG_KPROBES
+ debugfs_kprobe_init();
+#endif
return retval;
}

Index: linux-2.6.20/kernel/kprobes.c
===================================================================
--- linux-2.6.20.orig/kernel/kprobes.c
+++ linux-2.6.20/kernel/kprobes.c
@@ -39,6 +39,8 @@
#include <linux/moduleloader.h>
#include <linux/kallsyms.h>
#include <linux/freezer.h>
+#include <linux/seq_file.h>
+#include <linux/debugfs.h>
#include <asm-generic/sections.h>
#include <asm/cacheflush.h>
#include <asm/errno.h>
@@ -815,6 +817,96 @@ static int __init init_kprobes(void)
return err;
}

+static void __kprobes report_probe(struct seq_file *pi, struct kprobe *p,
+ const char *sym, int offset,char *modname)
+{
+ char *kprobe_type;
+
+ if (p->pre_handler == pre_handler_kretprobe)
+ kprobe_type = "r";
+ else if (p->pre_handler == setjmp_pre_handler)
+ kprobe_type = "j";
+ else
+ kprobe_type = "k";
+ if (sym)
+ seq_printf(pi, "%p %s %s+0x%x %s\n", p->addr, kprobe_type,
+ sym, offset, (modname ? modname : " "));
+ else
+ 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)
+{
+ return (*pos < KPROBE_TABLE_SIZE) ? pos : NULL;
+}
+
+void __kprobes *kprobe_seq_next(struct seq_file *f, void *v, loff_t *pos)
+{
+ (*pos)++;
+ if (*pos >= KPROBE_TABLE_SIZE)
+ return NULL;
+ return pos;
+}
+
+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)
+{
+ struct hlist_head *head;
+ struct hlist_node *node;
+ struct kprobe *p, *kp;
+ unsigned int i = *(loff_t *) v;
+ unsigned long size, offset = 0;
+ char *modname, namebuf[128];
+ const char *sym = NULL;
+
+ head = &kprobe_table[i];
+ preempt_disable();
+ hlist_for_each_entry_rcu(p, node, head, hlist) {
+ sym = kallsyms_lookup((unsigned long)p->addr, &size,
+ &offset, &modname, namebuf);
+ if (p->pre_handler == aggr_pre_handler) {
+ list_for_each_entry_rcu(kp, &p->list, list)
+ report_probe(pi, kp, sym, offset, modname);
+ } else
+ report_probe(pi, p, sym, offset, modname);
+ }
+ preempt_enable();
+ return 0;
+}
+
+struct seq_operations kprobes_seq_ops = {
+ .start = kprobe_seq_start,
+ .next = kprobe_seq_next,
+ .stop = kprobe_seq_stop,
+ .show = show_kprobe_addr
+};
+
+static int __kprobes kprobes_open(struct inode *inode, struct file *filp)
+{
+ return seq_open(filp, &kprobes_seq_ops);
+}
+
+static struct file_operations proc_kprobes_operations = {
+ .open = kprobes_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};
+
+void __kprobes debugfs_kprobe_init(void)
+{
+ struct dentry *dir;
+
+ dir = debugfs_create_dir("kprobes", NULL);
+ if (dir == NULL)
+ return;
+ debugfs_create_file("list", 0444, dir , 0 , &proc_kprobes_operations);
+}
+
__initcall(init_kprobes);

EXPORT_SYMBOL_GPL(register_kprobe);
Index: linux-2.6.20/include/linux/kprobes.h
===================================================================
--- linux-2.6.20.orig/include/linux/kprobes.h
+++ linux-2.6.20/include/linux/kprobes.h
@@ -203,6 +203,7 @@ struct kretprobe_instance *get_free_rp_i
void add_rp_inst(struct kretprobe_instance *ri);
void kprobe_flush_task(struct task_struct *tk);
void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);
+void debugfs_kprobe_init(void);
#else /* CONFIG_KPROBES */

#define __kprobes /**/
@@ -240,5 +241,8 @@ static inline void unregister_kretprobe(
static inline void kprobe_flush_task(struct task_struct *tk)
{
}
+static inline void proc_kprobe_init(void)
+{
+}
#endif /* CONFIG_KPROBES */
#endif /* _LINUX_KPROBES_H */


Attachments:
final1.fix (4.32 kB)

2007-02-06 14:56:28

by Frederik Deweerdt

[permalink] [raw]
Subject: Re: [RFC] [PATCH] To list all active probes in the system

Hi,

Comments below,

On Tue, Feb 06, 2007 at 08:17:06PM +0530, Srinivasa Ds wrote:
> Srinivasa Ds wrote:
> > Christoph Hellwig wrote:
> >> On Tue, Feb 06, 2007 at 03:25:35PM +0530, Srinivasa Ds wrote:
> >>> Hi folks
> >>>
> >>> I have developed a patch, that lists all active probes in the
> >>> system. I have done this through /proc interface. Currently list is
> >>> available under /proc/kprobes/list. Any suggestions for better place and
> >>> name??
> >> /debug/kprobes/list? :)
> >>
> > Good Idea, I will update my patch to use debugfs.
> Patch that uses debugfs.
>
> Signed-off-by: Srinivasa DS <[email protected]>
>
>
>
>
>

> fs/debugfs/inode.c | 4 ++
> include/linux/kprobes.h | 4 ++
> kernel/kprobes.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 100 insertions(+)
>
> Index: linux-2.6.20/fs/debugfs/inode.c
> ===================================================================
> --- linux-2.6.20.orig/fs/debugfs/inode.c
> +++ linux-2.6.20/fs/debugfs/inode.c
> @@ -25,6 +25,7 @@
> #include <linux/namei.h>
> #include <linux/debugfs.h>
> #include <linux/fsnotify.h>
> +#include <linux/kprobes.h>
>
> #define DEBUGFS_MAGIC 0x64626720
>
> @@ -320,6 +321,9 @@ static int __init debugfs_init(void)
> retval = register_filesystem(&debug_fs_type);
> if (retval)
> subsystem_unregister(&debug_subsys);
> +#ifdef CONFIG_KPROBES
> + debugfs_kprobe_init();
> +#endif
The ifdef here could be skipped if ....
> return retval;
> }
>
[... snip ...]
> Index: linux-2.6.20/include/linux/kprobes.h
> ===================================================================
> --- linux-2.6.20.orig/include/linux/kprobes.h
> +++ linux-2.6.20/include/linux/kprobes.h
> @@ -203,6 +203,7 @@ struct kretprobe_instance *get_free_rp_i
> void add_rp_inst(struct kretprobe_instance *ri);
> void kprobe_flush_task(struct task_struct *tk);
> void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);
> +void debugfs_kprobe_init(void);
> #else /* CONFIG_KPROBES */
>
> #define __kprobes /**/
> @@ -240,5 +241,8 @@ static inline void unregister_kretprobe(
> static inline void kprobe_flush_task(struct task_struct *tk)
> {
> }
> +static inline void proc_kprobe_init(void)
> +{
> +}
... this was renamed to debugfs_kprobe_init() instead -which was your
first intention I suppose ;)-

Regards,
Frederik

2007-02-06 20:36:36

by Ingo Molnar

[permalink] [raw]
Subject: Re: [RFC] [PATCH] To list all active probes in the system


* Andrew Morton <[email protected]> wrote:

> On Tue, 06 Feb 2007 15:25:35 +0530 Srinivasa Ds <[email protected]> wrote:
>
> > I have developed a patch, that lists all active probes in
> > the system.
>
> userspace added the probes, so userspace should know where they all
> are?

it's a kernel resource that user-space can influence so it's sensible to
have some sort of visibility to them. For example if the userspace that
has the 'info' crashes then another piece of user-space might want to
recreate that info, to zap the probes.

also, this resource could leak, etc.

Ingo

2007-02-07 05:25:53

by Srinivasa Ds

[permalink] [raw]
Subject: Re: [RFC] [PATCH] To list all active probes in the system

fs/debugfs/inode.c | 2 +
include/linux/kprobes.h | 4 ++
kernel/kprobes.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 98 insertions(+)

Index: linux-2.6.20/fs/debugfs/inode.c
===================================================================
--- linux-2.6.20.orig/fs/debugfs/inode.c
+++ linux-2.6.20/fs/debugfs/inode.c
@@ -25,6 +25,7 @@
#include <linux/namei.h>
#include <linux/debugfs.h>
#include <linux/fsnotify.h>
+#include <linux/kprobes.h>

#define DEBUGFS_MAGIC 0x64626720

@@ -320,6 +321,7 @@ static int __init debugfs_init(void)
retval = register_filesystem(&debug_fs_type);
if (retval)
subsystem_unregister(&debug_subsys);
+ debugfs_kprobe_init();
return retval;
}

Index: linux-2.6.20/kernel/kprobes.c
===================================================================
--- linux-2.6.20.orig/kernel/kprobes.c
+++ linux-2.6.20/kernel/kprobes.c
@@ -39,6 +39,8 @@
#include <linux/moduleloader.h>
#include <linux/kallsyms.h>
#include <linux/freezer.h>
+#include <linux/seq_file.h>
+#include <linux/debugfs.h>
#include <asm-generic/sections.h>
#include <asm/cacheflush.h>
#include <asm/errno.h>
@@ -815,6 +817,96 @@ static int __init init_kprobes(void)
return err;
}

+static void __kprobes report_probe(struct seq_file *pi, struct kprobe *p,
+ const char *sym, int offset,char *modname)
+{
+ char *kprobe_type;
+
+ if (p->pre_handler == pre_handler_kretprobe)
+ kprobe_type = "r";
+ else if (p->pre_handler == setjmp_pre_handler)
+ kprobe_type = "j";
+ else
+ kprobe_type = "k";
+ if (sym)
+ seq_printf(pi, "%p %s %s+0x%x %s\n", p->addr, kprobe_type,
+ sym, offset, (modname ? modname : " "));
+ else
+ 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)
+{
+ return (*pos < KPROBE_TABLE_SIZE) ? pos : NULL;
+}
+
+void __kprobes *kprobe_seq_next(struct seq_file *f, void *v, loff_t *pos)
+{
+ (*pos)++;
+ if (*pos >= KPROBE_TABLE_SIZE)
+ return NULL;
+ return pos;
+}
+
+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)
+{
+ struct hlist_head *head;
+ struct hlist_node *node;
+ struct kprobe *p, *kp;
+ unsigned int i = *(loff_t *) v;
+ unsigned long size, offset = 0;
+ char *modname, namebuf[128];
+ const char *sym = NULL;
+
+ head = &kprobe_table[i];
+ preempt_disable();
+ hlist_for_each_entry_rcu(p, node, head, hlist) {
+ sym = kallsyms_lookup((unsigned long)p->addr, &size,
+ &offset, &modname, namebuf);
+ if (p->pre_handler == aggr_pre_handler) {
+ list_for_each_entry_rcu(kp, &p->list, list)
+ report_probe(pi, kp, sym, offset, modname);
+ } else
+ report_probe(pi, p, sym, offset, modname);
+ }
+ preempt_enable();
+ return 0;
+}
+
+struct seq_operations kprobes_seq_ops = {
+ .start = kprobe_seq_start,
+ .next = kprobe_seq_next,
+ .stop = kprobe_seq_stop,
+ .show = show_kprobe_addr
+};
+
+static int __kprobes kprobes_open(struct inode *inode, struct file *filp)
+{
+ return seq_open(filp, &kprobes_seq_ops);
+}
+
+static struct file_operations proc_kprobes_operations = {
+ .open = kprobes_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_release,
+};
+
+void __kprobes debugfs_kprobe_init(void)
+{
+ struct dentry *dir;
+
+ dir = debugfs_create_dir("kprobes", NULL);
+ if (dir == NULL)
+ return;
+ debugfs_create_file("list", 0444, dir , 0 , &proc_kprobes_operations);
+}
+
__initcall(init_kprobes);

EXPORT_SYMBOL_GPL(register_kprobe);
Index: linux-2.6.20/include/linux/kprobes.h
===================================================================
--- linux-2.6.20.orig/include/linux/kprobes.h
+++ linux-2.6.20/include/linux/kprobes.h
@@ -203,6 +203,7 @@ struct kretprobe_instance *get_free_rp_i
void add_rp_inst(struct kretprobe_instance *ri);
void kprobe_flush_task(struct task_struct *tk);
void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);
+void debugfs_kprobe_init(void);
#else /* CONFIG_KPROBES */

#define __kprobes /**/
@@ -240,5 +241,8 @@ static inline void unregister_kretprobe(
static inline void kprobe_flush_task(struct task_struct *tk)
{
}
+static inline void debugfs_kprobe_init(void)
+{
+}
#endif /* CONFIG_KPROBES */
#endif /* _LINUX_KPROBES_H */


Attachments:
final-2.fix (4.29 kB)

2007-02-07 22:27:51

by Andrew Morton

[permalink] [raw]
Subject: Re: [RFC] [PATCH] To list all active probes in the system

On Wed, 07 Feb 2007 10:55:23 +0530
Srinivasa Ds <[email protected]> wrote:

> --- linux-2.6.20.orig/fs/debugfs/inode.c
> +++ linux-2.6.20/fs/debugfs/inode.c
> @@ -25,6 +25,7 @@
> #include <linux/namei.h>
> #include <linux/debugfs.h>
> #include <linux/fsnotify.h>
> +#include <linux/kprobes.h>
>
> #define DEBUGFS_MAGIC 0x64626720
>
> @@ -320,6 +321,7 @@ static int __init debugfs_init(void)
> retval = register_filesystem(&debug_fs_type);
> if (retval)
> subsystem_unregister(&debug_subsys);
> + debugfs_kprobe_init();
> return retval;
> }

eww. Didn't it feel bad when you did that?


As this module has a dependency upon debugfs, I'd have thought the
approproate way of expressing that would be to run debugfs_kprobe_init()
at a lower initcall priority than debugfs_init()

> +void __kprobes debugfs_kprobe_init(void)
> +{
> + struct dentry *dir;
> +
> + dir = debugfs_create_dir("kprobes", NULL);
> + if (dir == NULL)
> + return;
> + debugfs_create_file("list", 0444, dir , 0 , &proc_kprobes_operations);
> +}
> +
> __initcall(init_kprobes);

debugfs_init() already runs at core_initcall level, presumably so that
debugfs clients can use plain old module_init().

>
> +static inline void debugfs_kprobe_init(void)
> +{
> +}

In which case we don't need this.

2007-02-08 11:46:22

by Srinivasa Ds

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

Andrew Morton wrote:
> On Wed, 07 Feb 2007 10:55:23 +0530
> Srinivasa Ds <[email protected]> wrote:
>
>> --- linux-2.6.20.orig/fs/debugfs/inode.c
>> +++ linux-2.6.20/fs/debugfs/inode.c
>> @@ -25,6 +25,7 @@
>>
>> if (retval)
>> subsystem_unregister(&debug_subsys);
>> + debugfs_kprobe_init();
>> return retval;
>> }
>
> eww. Didn't it feel bad when you did that?
>
>
> As this module has a dependency upon debugfs, I'd have thought the
> approproate way of expressing that would be to run debugfs_kprobe_init()
> at a lower initcall priority than debugfs_init()
>
>> +
>> + if (dir == NULL)
>> + return;
>> + debugfs_create_file("list", 0444, dir , 0 , &proc_kprobes_operations);
>> +}
>> +
>> __initcall(init_kprobes);
>
> debugfs_init() already runs at core_initcall level, presumably so that
> debugfs clients can use plain old module_init().
>
>> +static inline void debugfs_kprobe_init(void)
>> +{
>> +}
>
> In which case we don't need this.

Updating the patch according to Andrew's comment.

This patch lists all active probes in the system by scanning through
kprobe_table[]. It takes care of aggregate handlers and prints the type
of the probe.
Letter "k" for kprobes, "j" for jprobes, "r" for kretprobes. It also
lists address of the instruction,its symbolic name(function name +
offset) and the module name. One can access this file through
/sys/kernel/debug/kprobes/list.

Output looks like this
=====================
llm40:~/a # cat /sys/kernel/debug/kprobes/list
c0169ae3 r sys_read+0x0
c0169ae3 k sys_read+0x0
c01694c8 k vfs_write+0x0
c0167d20 r sys_open+0x0
f8e658a6 k reiserfs_delete_inode+0x0 reiserfs
c0120f4a k do_fork+0x0
c0120f4a j do_fork+0x0
c0169b4a r sys_write+0x0
c0169b4a k sys_write+0x0
c0169622 r vfs_read+0x0
=================================


Signed-off-by: Srinivasa DS <[email protected]>



Attachments:
list.patch (3.12 kB)

2007-02-09 08:04:27

by Andrew Morton

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

On Thu, 08 Feb 2007 17:16:15 +0530 Srinivasa Ds <[email protected]> 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);
-
_

2007-02-12 09:02:37

by Andrew Morton

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

On Thu, 08 Feb 2007 17:16:15 +0530 Srinivasa Ds <[email protected]> wrote:

> + if (p->pre_handler == pre_handler_kretprobe)

This breaks on sparc64:

kernel/kprobes.c: In function `report_probe':
kernel/kprobes.c:826: error: `pre_handler_kretprobe' undeclared (first use in this function)

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

On Mon, Feb 12, 2007 at 12:45:15AM -0800, Andrew Morton wrote:
> On Thu, 08 Feb 2007 17:16:15 +0530 Srinivasa Ds <[email protected]> wrote:
>
> > + if (p->pre_handler == pre_handler_kretprobe)
>
> This breaks on sparc64:
>
> kernel/kprobes.c: In function `report_probe':
> kernel/kprobes.c:826: error: `pre_handler_kretprobe' undeclared (first use in this function)

Andrew,

Here is a patch to fix the issue, compile tested with crosstools. Sorry for
the trouble.

Do you want a comprehensive patch that folds all the related changes
into one?

Ananth
--

Fix kprobes compilation breakage on sparc64 caused due to
kprobes-list-all-active-probes-in-the-system.patch

Signed-off-by: Ananth N Mavinakayanahalli <[email protected]>

---
kernel/kprobes.c | 6 ++++++
1 files changed, 6 insertions(+)

Index: linux-2.6.20/kernel/kprobes.c
===================================================================
--- linux-2.6.20.orig/kernel/kprobes.c
+++ linux-2.6.20/kernel/kprobes.c
@@ -780,6 +780,12 @@ int __kprobes register_kretprobe(struct
return -ENOSYS;
}

+static int __kprobes pre_handler_kretprobe(struct kprobe *p,
+ struct pt_regs *regs)
+{
+ return 0;
+}
+
#endif /* ARCH_SUPPORTS_KRETPROBES */

void __kprobes unregister_kretprobe(struct kretprobe *rp)