kprobes: Show blacklist entries via debugfs
authorMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Thu, 17 Apr 2014 08:18:49 +0000 (17:18 +0900)
committerIngo Molnar <mingo@kernel.org>
Thu, 24 Apr 2014 08:26:41 +0000 (10:26 +0200)
Show blacklist entries (function names with the address
range) via /sys/kernel/debug/kprobes/blacklist.

Note that at this point the blacklist supports only
in vmlinux, not module. So the list is fixed and
not updated.

Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
Cc: David S. Miller <davem@davemloft.net>
Link: http://lkml.kernel.org/r/20140417081849.26341.11609.stgit@ltc230.yrl.intra.hitachi.co.jp
Signed-off-by: Ingo Molnar <mingo@kernel.org>
kernel/kprobes.c

index a21b4e67fd971fafdcda04cc78909beb75099532..3214289df5a7a8f6917718a9a00f418794efeab1 100644 (file)
@@ -2249,6 +2249,46 @@ static const struct file_operations debugfs_kprobes_operations = {
        .release        = seq_release,
 };
 
+/* kprobes/blacklist -- shows which functions can not be probed */
+static void *kprobe_blacklist_seq_start(struct seq_file *m, loff_t *pos)
+{
+       return seq_list_start(&kprobe_blacklist, *pos);
+}
+
+static void *kprobe_blacklist_seq_next(struct seq_file *m, void *v, loff_t *pos)
+{
+       return seq_list_next(v, &kprobe_blacklist, pos);
+}
+
+static int kprobe_blacklist_seq_show(struct seq_file *m, void *v)
+{
+       struct kprobe_blacklist_entry *ent =
+               list_entry(v, struct kprobe_blacklist_entry, list);
+
+       seq_printf(m, "0x%p-0x%p\t%ps\n", (void *)ent->start_addr,
+                  (void *)ent->end_addr, (void *)ent->start_addr);
+       return 0;
+}
+
+static const struct seq_operations kprobe_blacklist_seq_ops = {
+       .start = kprobe_blacklist_seq_start,
+       .next  = kprobe_blacklist_seq_next,
+       .stop  = kprobe_seq_stop,       /* Reuse void function */
+       .show  = kprobe_blacklist_seq_show,
+};
+
+static int kprobe_blacklist_open(struct inode *inode, struct file *filp)
+{
+       return seq_open(filp, &kprobe_blacklist_seq_ops);
+}
+
+static const struct file_operations debugfs_kprobe_blacklist_ops = {
+       .open           = kprobe_blacklist_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = seq_release,
+};
+
 static void arm_all_kprobes(void)
 {
        struct hlist_head *head;
@@ -2372,19 +2412,24 @@ static int __init debugfs_kprobe_init(void)
 
        file = debugfs_create_file("list", 0444, dir, NULL,
                                &debugfs_kprobes_operations);
-       if (!file) {
-               debugfs_remove(dir);
-               return -ENOMEM;
-       }
+       if (!file)
+               goto error;
 
        file = debugfs_create_file("enabled", 0600, dir,
                                        &value, &fops_kp);
-       if (!file) {
-               debugfs_remove(dir);
-               return -ENOMEM;
-       }
+       if (!file)
+               goto error;
+
+       file = debugfs_create_file("blacklist", 0444, dir, NULL,
+                               &debugfs_kprobe_blacklist_ops);
+       if (!file)
+               goto error;
 
        return 0;
+
+error:
+       debugfs_remove(dir);
+       return -ENOMEM;
 }
 
 late_initcall(debugfs_kprobe_init);