]> Git Repo - linux.git/blobdiff - tools/perf/builtin-script.c
powerpc/vdso64: Fix CLOCK_MONOTONIC inconsistencies across Y2038
[linux.git] / tools / perf / builtin-script.c
index ac221f137ed2aa96665add3861d5a2655e8c18c6..53f78cf3113f9ed5fe4a9d9de42fdf2a3a0b9d6e 100644 (file)
@@ -10,6 +10,7 @@
 #include "util/perf_regs.h"
 #include "util/session.h"
 #include "util/tool.h"
+#include "util/map.h"
 #include "util/symbol.h"
 #include "util/thread.h"
 #include "util/trace-event.h"
@@ -148,6 +149,7 @@ static struct {
        unsigned int print_ip_opts;
        u64 fields;
        u64 invalid_fields;
+       u64 user_set_fields;
 } output[OUTPUT_TYPE_MAX] = {
 
        [PERF_TYPE_HARDWARE] = {
@@ -344,7 +346,7 @@ static int perf_evsel__do_check_stype(struct perf_evsel *evsel,
        if (attr->sample_type & sample_type)
                return 0;
 
-       if (output[type].user_set) {
+       if (output[type].user_set_fields & field) {
                if (allow_user_set)
                        return 0;
                evname = perf_evsel__name(evsel);
@@ -2559,6 +2561,10 @@ static int parse_output_fields(const struct option *opt __maybe_unused,
                        pr_warning("Overriding previous field request for %s events.\n",
                                   event_type(type));
 
+               /* Don't override defaults for +- */
+               if (strchr(tok, '+') || strchr(tok, '-'))
+                       goto parse;
+
                output[type].fields = 0;
                output[type].user_set = true;
                output[type].wildcard_set = false;
@@ -2627,10 +2633,13 @@ parse:
                                        pr_warning("\'%s\' not valid for %s events. Ignoring.\n",
                                                   all_output_options[i].str, event_type(j));
                                } else {
-                                       if (change == REMOVE)
+                                       if (change == REMOVE) {
                                                output[j].fields &= ~all_output_options[i].field;
-                                       else
+                                               output[j].user_set_fields &= ~all_output_options[i].field;
+                                       } else {
                                                output[j].fields |= all_output_options[i].field;
+                                               output[j].user_set_fields |= all_output_options[i].field;
+                                       }
                                        output[j].user_set = true;
                                        output[j].wildcard_set = true;
                                }
@@ -2643,6 +2652,10 @@ parse:
                                rc = -EINVAL;
                                goto out;
                        }
+                       if (change == REMOVE)
+                               output[type].fields &= ~all_output_options[i].field;
+                       else
+                               output[type].fields |= all_output_options[i].field;
                        output[type].user_set = true;
                        output[type].wildcard_set = true;
                }
@@ -2942,10 +2955,8 @@ int find_scripts(char **scripts_array, char **scripts_path_array)
        DIR *scripts_dir, *lang_dir;
        struct perf_session *session;
        struct perf_data data = {
-               .file      = {
-                       .path = input_name,
-               },
-               .mode      = PERF_DATA_MODE_READ,
+               .path = input_name,
+               .mode = PERF_DATA_MODE_READ,
        };
        char *temp;
        int i = 0;
@@ -3418,8 +3429,8 @@ int cmd_script(int argc, const char **argv)
        argc = parse_options_subcommand(argc, argv, options, script_subcommands, script_usage,
                             PARSE_OPT_STOP_AT_NON_OPTION);
 
-       data.file.path = input_name;
-       data.force     = symbol_conf.force;
+       data.path  = input_name;
+       data.force = symbol_conf.force;
 
        if (argc > 1 && !strncmp(argv[0], "rec", strlen("rec"))) {
                rec_script_path = get_script_path(argv[1], RECORD_SUFFIX);
@@ -3645,7 +3656,7 @@ int cmd_script(int argc, const char **argv)
                        goto out_delete;
                }
 
-               input = open(data.file.path, O_RDONLY); /* input_name */
+               input = open(data.path, O_RDONLY);      /* input_name */
                if (input < 0) {
                        err = -errno;
                        perror("failed to open file");
@@ -3688,37 +3699,13 @@ int cmd_script(int argc, const char **argv)
        if (err < 0)
                goto out_delete;
 
-       script.ptime_range = perf_time__range_alloc(script.time_str,
-                                                   &script.range_size);
-       if (!script.ptime_range) {
-               err = -ENOMEM;
-               goto out_delete;
-       }
-
-       /* needs to be parsed after looking up reference time */
-       if (perf_time__parse_str(script.ptime_range, script.time_str) != 0) {
-               if (session->evlist->first_sample_time == 0 &&
-                   session->evlist->last_sample_time == 0) {
-                       pr_err("HINT: no first/last sample time found in perf data.\n"
-                              "Please use latest perf binary to execute 'perf record'\n"
-                              "(if '--buildid-all' is enabled, please set '--timestamp-boundary').\n");
-                       err = -EINVAL;
-                       goto out_delete;
-               }
-
-               script.range_num = perf_time__percent_parse_str(
-                                       script.ptime_range, script.range_size,
-                                       script.time_str,
-                                       session->evlist->first_sample_time,
-                                       session->evlist->last_sample_time);
-
-               if (script.range_num < 0) {
-                       pr_err("Invalid time string\n");
-                       err = -EINVAL;
+       if (script.time_str) {
+               err = perf_time__parse_for_ranges(script.time_str, session,
+                                                 &script.ptime_range,
+                                                 &script.range_size,
+                                                 &script.range_num);
+               if (err < 0)
                        goto out_delete;
-               }
-       } else {
-               script.range_num = 1;
        }
 
        err = __cmd_script(&script);
@@ -3726,7 +3713,8 @@ int cmd_script(int argc, const char **argv)
        flush_scripting();
 
 out_delete:
-       zfree(&script.ptime_range);
+       if (script.ptime_range)
+               zfree(&script.ptime_range);
 
        perf_evlist__free_stats(session->evlist);
        perf_session__delete(session);
This page took 0.038685 seconds and 4 git commands to generate.