perf probe: Add --dry-run option
authorMasami Hiramatsu <mhiramat@redhat.com>
Tue, 16 Mar 2010 22:06:05 +0000 (18:06 -0400)
committerIngo Molnar <mingo@elte.hu>
Wed, 17 Mar 2010 10:32:31 +0000 (11:32 +0100)
Add --dry-run option for debugging and testing.

Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Cc: systemtap <systemtap@sources.redhat.com>
Cc: DLE <dle-develop@lists.sourceforge.net>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <20100316220605.32050.6571.stgit@localhost6.localdomain6>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
tools/perf/Documentation/perf-probe.txt
tools/perf/builtin-probe.c
tools/perf/util/probe-event.c
tools/perf/util/probe-event.h

index 34202b1..0f944b3 100644 (file)
@@ -57,6 +57,11 @@ OPTIONS
 --force::
        Forcibly add events with existing name.
 
+-n::
+--dry-run::
+       Dry run. With this option, --add and --del doesn't execute actual
+       adding and removal operations.
+
 PROBE SYNTAX
 ------------
 Probe points are defined by following syntax.
index f577e14..a1a2891 100644 (file)
@@ -175,6 +175,7 @@ static const struct option options[] = {
                     "FUNC[:RLN[+NUM|:RLN2]]|SRC:ALN[+NUM|:ALN2]",
                     "Show source code lines.", opt_show_lines),
 #endif
+       OPT__DRY_RUN(&probe_event_dry_run),
        OPT_END()
 };
 
index 1e60a65..ac41578 100644 (file)
@@ -49,6 +49,8 @@
 #define MAX_PROBE_ARGS 128
 #define PERFPROBE_GROUP "probe"
 
+bool probe_event_dry_run;      /* Dry run flag */
+
 #define semantic_error(msg ...) die("Semantic error :" msg)
 
 /* If there is no space to write, returns -E2BIG. */
@@ -430,7 +432,7 @@ error:
        return ret;
 }
 
-static int open_kprobe_events(int flags, int mode)
+static int open_kprobe_events(bool readwrite)
 {
        char buf[PATH_MAX];
        int ret;
@@ -439,7 +441,11 @@ static int open_kprobe_events(int flags, int mode)
        if (ret < 0)
                die("Failed to make kprobe_events path.");
 
-       ret = open(buf, flags, mode);
+       if (readwrite && !probe_event_dry_run)
+               ret = open(buf, O_RDWR, O_APPEND);
+       else
+               ret = open(buf, O_RDONLY, 0);
+
        if (ret < 0) {
                if (errno == ENOENT)
                        die("kprobe_events file does not exist -"
@@ -535,7 +541,7 @@ void show_perf_probe_events(void)
        setup_pager();
        memset(&pp, 0, sizeof(pp));
 
-       fd = open_kprobe_events(O_RDONLY, 0);
+       fd = open_kprobe_events(false);
        rawlist = get_trace_kprobe_event_rawlist(fd);
        close(fd);
 
@@ -585,9 +591,11 @@ static void write_trace_kprobe_event(int fd, const char *buf)
        int ret;
 
        pr_debug("Writing event: %s\n", buf);
-       ret = write(fd, buf, strlen(buf));
-       if (ret <= 0)
-               die("Failed to write event: %s", strerror(errno));
+       if (!probe_event_dry_run) {
+               ret = write(fd, buf, strlen(buf));
+               if (ret <= 0)
+                       die("Failed to write event: %s", strerror(errno));
+       }
 }
 
 static void get_new_event_name(char *buf, size_t len, const char *base,
@@ -630,7 +638,7 @@ static void __add_trace_kprobe_events(struct probe_point *probes,
        struct strlist *namelist;
        bool allow_suffix;
 
-       fd = open_kprobe_events(O_RDWR, O_APPEND);
+       fd = open_kprobe_events(true);
        /* Get current event names */
        namelist = get_perf_event_names(fd, false);
 
@@ -814,7 +822,7 @@ void del_trace_kprobe_events(struct strlist *dellist)
        struct str_node *ent;
        struct strlist *namelist;
 
-       fd = open_kprobe_events(O_RDWR, O_APPEND);
+       fd = open_kprobe_events(true);
        /* Get current event names */
        namelist = get_perf_event_names(fd, true);
 
index 3865e16..703b887 100644 (file)
@@ -5,6 +5,8 @@
 #include "probe-finder.h"
 #include "strlist.h"
 
+extern bool probe_event_dry_run;
+
 extern void parse_line_range_desc(const char *arg, struct line_range *lr);
 extern void parse_perf_probe_event(const char *str, struct probe_point *pp,
                                   bool *need_dwarf);