All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC] [PATCH] To list all active probes in the system
@ 2007-02-06  9:55 Srinivasa Ds
  2007-02-06 10:06 ` Christoph Hellwig
  2007-02-06 10:13 ` [RFC] [PATCH] To list all active probes in the system Andrew Morton
  0 siblings, 2 replies; 14+ messages in thread
From: Srinivasa Ds @ 2007-02-06  9:55 UTC (permalink / raw)
  To: linux-kernel, akpm, torvalds, jkenisto, anil.s.keshavamurthy,
	prasanna, ananth

[-- Attachment #1: Type: text/plain, Size: 1396 bytes --]

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 <srinivasa@in.ibm.com>


[-- Attachment #2: kp.diff --]
[-- Type: text/x-patch, Size: 4930 bytes --]

 fs/proc/root.c          |    4 ++
 include/linux/kprobes.h |    7 +++
 kernel/kprobes.c        |   87 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 98 insertions(+)

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,7 @@
 #include <linux/moduleloader.h>
 #include <linux/kallsyms.h>
 #include <linux/freezer.h>
+#include <linux/seq_file.h>
 #include <asm-generic/sections.h>
 #include <asm/cacheflush.h>
 #include <asm/errno.h>
@@ -815,6 +816,92 @@ 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 proc_kprobe_init(void)
+{
+	proc_mkdir("kprobes", NULL);
+	create_seq_entry("kprobes/list", 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
@@ -36,6 +36,7 @@
 #include <linux/spinlock.h>
 #include <linux/rcupdate.h>
 #include <linux/mutex.h>
+#include <linux/proc_fs.h>
 
 #ifdef CONFIG_KPROBES
 #include <asm/kprobes.h>
@@ -167,6 +168,8 @@ extern void show_registers(struct pt_reg
 extern kprobe_opcode_t *get_insn_slot(void);
 extern void free_insn_slot(kprobe_opcode_t *slot, int dirty);
 extern void kprobes_inc_nmissed_count(struct kprobe *p);
+extern void create_seq_entry(char *name, mode_t mode,
+		const struct file_operations *f);
 
 /* Get the kprobe at this addr (if any) - called with preemption disabled */
 struct kprobe *get_kprobe(void *addr);
@@ -203,6 +206,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 proc_kprobe_init(void);
 #else /* CONFIG_KPROBES */
 
 #define __kprobes	/**/
@@ -240,5 +244,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 */
Index: linux-2.6.20/fs/proc/root.c
===================================================================
--- linux-2.6.20.orig/fs/proc/root.c
+++ linux-2.6.20/fs/proc/root.c
@@ -18,6 +18,7 @@
 #include <linux/bitops.h>
 #include <linux/smp_lock.h>
 #include <linux/mount.h>
+#include <linux/kprobes.h>
 
 #include "internal.h"
 
@@ -85,6 +86,9 @@ void __init proc_root_init(void)
 	/* just give it a mountpoint */
 	proc_mkdir("openprom", NULL);
 #endif
+#ifdef CONFIG_KPROBES
+	proc_kprobe_init();
+#endif
 	proc_tty_init();
 #ifdef CONFIG_PROC_DEVICETREE
 	proc_device_tree_init();

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC] [PATCH] To list all active probes in the system
  2007-02-06  9:55 [RFC] [PATCH] To list all active probes in the system Srinivasa Ds
@ 2007-02-06 10:06 ` Christoph Hellwig
  2007-02-06 10:22   ` Srinivasa Ds
  2007-02-06 10:13 ` [RFC] [PATCH] To list all active probes in the system Andrew Morton
  1 sibling, 1 reply; 14+ messages in thread
From: Christoph Hellwig @ 2007-02-06 10:06 UTC (permalink / raw)
  To: Srinivasa Ds
  Cc: linux-kernel, akpm, torvalds, jkenisto, anil.s.keshavamurthy,
	prasanna, ananth

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? :)


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC] [PATCH] To list all active probes in the system
  2007-02-06  9:55 [RFC] [PATCH] To list all active probes in the system Srinivasa Ds
  2007-02-06 10:06 ` Christoph Hellwig
@ 2007-02-06 10:13 ` Andrew Morton
  2007-02-06 10:21   ` Srinivasa Ds
  2007-02-06 20:36   ` Ingo Molnar
  1 sibling, 2 replies; 14+ messages in thread
From: Andrew Morton @ 2007-02-06 10:13 UTC (permalink / raw)
  To: Srinivasa Ds
  Cc: linux-kernel, torvalds, jkenisto, anil.s.keshavamurthy, prasanna, ananth

On Tue, 06 Feb 2007 15:25:35 +0530 Srinivasa Ds <srinivasa@in.ibm.com> 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?

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC] [PATCH] To list all active probes in the system
  2007-02-06 10:13 ` [RFC] [PATCH] To list all active probes in the system Andrew Morton
@ 2007-02-06 10:21   ` Srinivasa Ds
  2007-02-06 20:36   ` Ingo Molnar
  1 sibling, 0 replies; 14+ messages in thread
From: Srinivasa Ds @ 2007-02-06 10:21 UTC (permalink / raw)
  To: Andrew Morton
  Cc: linux-kernel, torvalds, jkenisto, anil.s.keshavamurthy, prasanna, ananth

Andrew Morton wrote:
> On Tue, 06 Feb 2007 15:25:35 +0530 Srinivasa Ds <srinivasa@in.ibm.com> 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.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC] [PATCH] To list all active probes in the system
  2007-02-06 10:06 ` Christoph Hellwig
@ 2007-02-06 10:22   ` Srinivasa Ds
  2007-02-06 14:47     ` Srinivasa Ds
  0 siblings, 1 reply; 14+ messages in thread
From: Srinivasa Ds @ 2007-02-06 10:22 UTC (permalink / raw)
  To: Christoph Hellwig, Srinivasa Ds, linux-kernel, akpm, torvalds,
	jkenisto, anil.s.keshavamurthy, prasanna, ananth

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.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC] [PATCH] To list all active probes in the system
  2007-02-06 10:22   ` Srinivasa Ds
@ 2007-02-06 14:47     ` Srinivasa Ds
  2007-02-06 14:56       ` Frederik Deweerdt
  0 siblings, 1 reply; 14+ messages in thread
From: Srinivasa Ds @ 2007-02-06 14:47 UTC (permalink / raw)
  To: Srinivasa Ds
  Cc: Christoph Hellwig, linux-kernel, akpm, torvalds, jkenisto,
	anil.s.keshavamurthy, prasanna, ananth

[-- Attachment #1: Type: text/plain, Size: 527 bytes --]

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 <srinivasa@in.ibm.com>






[-- Attachment #2: final1.fix --]
[-- Type: text/plain, Size: 4426 bytes --]

 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 */

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC] [PATCH] To list all active probes in the system
  2007-02-06 14:47     ` Srinivasa Ds
@ 2007-02-06 14:56       ` Frederik Deweerdt
  2007-02-07  5:25         ` Srinivasa Ds
  0 siblings, 1 reply; 14+ messages in thread
From: Frederik Deweerdt @ 2007-02-06 14:56 UTC (permalink / raw)
  To: Srinivasa Ds
  Cc: Christoph Hellwig, linux-kernel, akpm, torvalds, jkenisto,
	anil.s.keshavamurthy, prasanna, ananth

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 <srinivasa@in.ibm.com>
> 
> 
> 
> 
> 

>  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

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC] [PATCH] To list all active probes in the system
  2007-02-06 10:13 ` [RFC] [PATCH] To list all active probes in the system Andrew Morton
  2007-02-06 10:21   ` Srinivasa Ds
@ 2007-02-06 20:36   ` Ingo Molnar
  1 sibling, 0 replies; 14+ messages in thread
From: Ingo Molnar @ 2007-02-06 20:36 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Srinivasa Ds, linux-kernel, torvalds, jkenisto,
	anil.s.keshavamurthy, prasanna, ananth


* Andrew Morton <akpm@linux-foundation.org> wrote:

> On Tue, 06 Feb 2007 15:25:35 +0530 Srinivasa Ds <srinivasa@in.ibm.com> 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

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC] [PATCH] To list all active probes in the system
  2007-02-06 14:56       ` Frederik Deweerdt
@ 2007-02-07  5:25         ` Srinivasa Ds
  2007-02-07 22:27           ` Andrew Morton
  0 siblings, 1 reply; 14+ messages in thread
From: Srinivasa Ds @ 2007-02-07  5:25 UTC (permalink / raw)
  To: Frederik Deweerdt
  Cc: Christoph Hellwig, linux-kernel, akpm, torvalds, jkenisto,
	anil.s.keshavamurthy, prasanna, ananth

[-- Attachment #1: Type: text/plain, Size: 3422 bytes --]

Frederik Deweerdt wrote:
> 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 <srinivasa@in.ibm.com>
>>
>>
>>
>>
>>
> 
>>  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

Oh, Iam sorry, It should be renamed to debugfs_kprobe_init().

So finally

 My 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 <srinivasa@in.ibm.com>



[-- Attachment #2: final-2.fix --]
[-- Type: text/plain, Size: 4396 bytes --]

 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 */

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC] [PATCH] To list all active probes in the system
  2007-02-07  5:25         ` Srinivasa Ds
@ 2007-02-07 22:27           ` Andrew Morton
  2007-02-08 11:46             ` [RFC] [PATCH] To list all active probes in the system---Take-2 Srinivasa Ds
  0 siblings, 1 reply; 14+ messages in thread
From: Andrew Morton @ 2007-02-07 22:27 UTC (permalink / raw)
  To: Srinivasa Ds
  Cc: Frederik Deweerdt, Christoph Hellwig, linux-kernel, torvalds,
	jkenisto, anil.s.keshavamurthy, prasanna, ananth

On Wed, 07 Feb 2007 10:55:23 +0530
Srinivasa Ds <srinivasa@in.ibm.com> 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.	

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC] [PATCH] To list all active probes in the system---Take-2
  2007-02-07 22:27           ` Andrew Morton
@ 2007-02-08 11:46             ` Srinivasa Ds
  2007-02-09  8:03               ` Andrew Morton
  2007-02-12  8:45               ` Andrew Morton
  0 siblings, 2 replies; 14+ messages in thread
From: Srinivasa Ds @ 2007-02-08 11:46 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Frederik Deweerdt, Christoph Hellwig, linux-kernel, torvalds,
	jkenisto, anil.s.keshavamurthy, prasanna, ananth

[-- Attachment #1: Type: text/plain, Size: 1876 bytes --]

Andrew Morton wrote:
> On Wed, 07 Feb 2007 10:55:23 +0530
> Srinivasa Ds <srinivasa@in.ibm.com> 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 <srinivasa@in.ibm.com>



[-- Attachment #2: list.patch --]
[-- Type: text/x-patch, Size: 3199 bytes --]

 kprobes.c |  104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 104 insertions(+)

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,108 @@ static int __init init_kprobes(void)
 	return err;
 }
 
+#ifdef CONFIG_DEBUG_FS
+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;
+	const char *sym = NULL;
+	unsigned int i = *(loff_t *) v;
+	unsigned long size, offset = 0;
+	char *modname, namebuf[128];
+
+	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 debugfs_kprobes_operations = {
+	.open           = kprobes_open,
+	.read           = seq_read,
+	.llseek         = seq_lseek,
+	.release        = seq_release,
+};
+
+static int __kprobes debugfs_kprobe_init(void)
+{
+	struct dentry *dir, *file;
+
+	dir = debugfs_create_dir("kprobes", NULL);
+	if (!dir)
+		return -ENOMEM;
+
+	file = debugfs_create_file("list", 0444, dir , 0 ,
+				&debugfs_kprobes_operations);
+	if (!file) {
+		debugfs_remove(dir);
+		return -ENOMEM;
+	}
+
+	return 0;
+}
+
+module_init(debugfs_kprobe_init);
+#endif /* CONFIG_DEBUG_FS */
+
 __initcall(init_kprobes);
 
 EXPORT_SYMBOL_GPL(register_kprobe);

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC] [PATCH] To list all active probes in the system---Take-2
  2007-02-08 11:46             ` [RFC] [PATCH] To list all active probes in the system---Take-2 Srinivasa Ds
@ 2007-02-09  8:03               ` Andrew Morton
  2007-02-12  8:45               ` Andrew Morton
  1 sibling, 0 replies; 14+ messages in thread
From: Andrew Morton @ 2007-02-09  8:03 UTC (permalink / raw)
  To: Srinivasa Ds
  Cc: Frederik Deweerdt, Christoph Hellwig, linux-kernel, torvalds,
	jkenisto, anil.s.keshavamurthy, prasanna, ananth

On Thu, 08 Feb 2007 17:16:15 +0530 Srinivasa Ds <srinivasa@in.ibm.com> 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);
-
_


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC] [PATCH] To list all active probes in the system---Take-2
  2007-02-08 11:46             ` [RFC] [PATCH] To list all active probes in the system---Take-2 Srinivasa Ds
  2007-02-09  8:03               ` Andrew Morton
@ 2007-02-12  8:45               ` Andrew Morton
  2007-02-12  9:29                 ` Ananth N Mavinakayanahalli
  1 sibling, 1 reply; 14+ messages in thread
From: Andrew Morton @ 2007-02-12  8:45 UTC (permalink / raw)
  To: Srinivasa Ds
  Cc: Frederik Deweerdt, Christoph Hellwig, linux-kernel, torvalds,
	jkenisto, anil.s.keshavamurthy, prasanna, ananth

On Thu, 08 Feb 2007 17:16:15 +0530 Srinivasa Ds <srinivasa@in.ibm.com> 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)

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [RFC] [PATCH] To list all active probes in the system---Take-2
  2007-02-12  8:45               ` Andrew Morton
@ 2007-02-12  9:29                 ` Ananth N Mavinakayanahalli
  0 siblings, 0 replies; 14+ messages in thread
From: Ananth N Mavinakayanahalli @ 2007-02-12  9:29 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Srinivasa Ds, Frederik Deweerdt, Christoph Hellwig, linux-kernel,
	torvalds, jkenisto, anil.s.keshavamurthy, prasanna, davem

On Mon, Feb 12, 2007 at 12:45:15AM -0800, Andrew Morton wrote:
> On Thu, 08 Feb 2007 17:16:15 +0530 Srinivasa Ds <srinivasa@in.ibm.com> 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 <ananth@in.ibm.com>

---
 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)

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2007-02-12  9:30 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-02-06  9:55 [RFC] [PATCH] To list all active probes in the system Srinivasa Ds
2007-02-06 10:06 ` Christoph Hellwig
2007-02-06 10:22   ` Srinivasa Ds
2007-02-06 14:47     ` Srinivasa Ds
2007-02-06 14:56       ` Frederik Deweerdt
2007-02-07  5:25         ` Srinivasa Ds
2007-02-07 22:27           ` Andrew Morton
2007-02-08 11:46             ` [RFC] [PATCH] To list all active probes in the system---Take-2 Srinivasa Ds
2007-02-09  8:03               ` Andrew Morton
2007-02-12  8:45               ` Andrew Morton
2007-02-12  9:29                 ` Ananth N Mavinakayanahalli
2007-02-06 10:13 ` [RFC] [PATCH] To list all active probes in the system Andrew Morton
2007-02-06 10:21   ` Srinivasa Ds
2007-02-06 20:36   ` Ingo Molnar

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.