Merge tag 'cpumask-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[firefly-linux-kernel-4.4.55.git] / tools / perf / builtin-probe.c
index 921bb69425035f08f8cb85bd8933ba26cc9687cf..f7b1af67e9f686d86f8bd1539b96a935b04a4559 100644 (file)
@@ -56,6 +56,7 @@ static struct {
        bool mod_events;
        bool uprobes;
        bool quiet;
+       bool target_used;
        int nevents;
        struct perf_probe_event events[MAX_PROBES];
        struct strlist *dellist;
@@ -78,6 +79,12 @@ static int parse_probe_event(const char *str)
        }
 
        pev->uprobes = params.uprobes;
+       if (params.target) {
+               pev->target = strdup(params.target);
+               if (!pev->target)
+                       return -ENOMEM;
+               params.target_used = true;
+       }
 
        /* Parse a perf-probe command into event */
        ret = parse_perf_probe_command(str, pev);
@@ -102,6 +109,7 @@ static int set_target(const char *ptr)
                params.target = strdup(ptr);
                if (!params.target)
                        return -ENOMEM;
+               params.target_used = false;
 
                found = 1;
                buf = ptr + (strlen(ptr) - 3);
@@ -178,7 +186,7 @@ static int opt_set_target(const struct option *opt, const char *str,
        int ret = -ENOENT;
        char *tmp;
 
-       if  (str && !params.target) {
+       if  (str) {
                if (!strcmp(opt->long_name, "exec"))
                        params.uprobes = true;
 #ifdef HAVE_DWARF_SUPPORT
@@ -200,7 +208,9 @@ static int opt_set_target(const struct option *opt, const char *str,
                        if (!tmp)
                                return -ENOMEM;
                }
+               free(params.target);
                params.target = tmp;
+               params.target_used = false;
                ret = 0;
        }
 
@@ -485,9 +495,14 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
        }
 
        if (params.nevents) {
+               /* Ensure the last given target is used */
+               if (params.target && !params.target_used) {
+                       pr_warning("  Error: -x/-m must follow the probe definitions.\n");
+                       usage_with_options(probe_usage, options);
+               }
+
                ret = add_perf_probe_events(params.events, params.nevents,
                                            params.max_probe_points,
-                                           params.target,
                                            params.force_add);
                if (ret < 0) {
                        pr_err_with_code("  Error: Failed to add events.", ret);