Merge branch 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[cascardo/linux.git] / tools / perf / builtin-record.c
index 6355902..67d2a90 100644 (file)
@@ -22,6 +22,7 @@
 #include "util/evlist.h"
 #include "util/evsel.h"
 #include "util/debug.h"
+#include "util/drv_configs.h"
 #include "util/session.h"
 #include "util/tool.h"
 #include "util/symbol.h"
@@ -42,7 +43,7 @@
 #include <sched.h>
 #include <sys/mman.h>
 #include <asm/bug.h>
-
+#include <linux/time64.h>
 
 struct record {
        struct perf_tool        tool;
@@ -96,7 +97,7 @@ backward_rb_find_range(void *buf, int mask, u64 head, u64 *start, u64 *end)
        *start = head;
        while (true) {
                if (evt_head - head >= (unsigned int)size) {
-                       pr_debug("Finshed reading backward ring buffer: rewind\n");
+                       pr_debug("Finished reading backward ring buffer: rewind\n");
                        if (evt_head - head > (unsigned int)size)
                                evt_head -= pheader->size;
                        *end = evt_head;
@@ -106,7 +107,7 @@ backward_rb_find_range(void *buf, int mask, u64 head, u64 *start, u64 *end)
                pheader = (struct perf_event_header *)(buf + (evt_head & mask));
 
                if (pheader->size == 0) {
-                       pr_debug("Finshed reading backward ring buffer: get start\n");
+                       pr_debug("Finished reading backward ring buffer: get start\n");
                        *end = evt_head;
                        return 0;
                }
@@ -383,6 +384,7 @@ static int record__open(struct record *rec)
        struct perf_evlist *evlist = rec->evlist;
        struct perf_session *session = rec->session;
        struct record_opts *opts = &rec->opts;
+       struct perf_evsel_config_term *err_term;
        int rc = 0;
 
        perf_evlist__config(evlist, opts, &callchain_param);
@@ -412,6 +414,14 @@ try_again:
                goto out;
        }
 
+       if (perf_evlist__apply_drv_configs(evlist, &pos, &err_term)) {
+               error("failed to set config \"%s\" on event %s with %d (%s)\n",
+                     err_term->val.drv_cfg, perf_evsel__name(pos), errno,
+                     str_error_r(errno, msg, sizeof(msg)));
+               rc = -1;
+               goto out;
+       }
+
        rc = record__mmap(rec);
        if (rc)
                goto out;
@@ -954,7 +964,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
        }
 
        if (opts->initial_delay) {
-               usleep(opts->initial_delay * 1000);
+               usleep(opts->initial_delay * USEC_PER_MSEC);
                perf_evlist__enable(rec->evlist);
        }
 
@@ -1563,29 +1573,39 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
        if (!rec->itr) {
                rec->itr = auxtrace_record__init(rec->evlist, &err);
                if (err)
-                       return err;
+                       goto out;
        }
 
        err = auxtrace_parse_snapshot_options(rec->itr, &rec->opts,
                                              rec->opts.auxtrace_snapshot_opts);
        if (err)
-               return err;
+               goto out;
+
+       /*
+        * Allow aliases to facilitate the lookup of symbols for address
+        * filters. Refer to auxtrace_parse_filters().
+        */
+       symbol_conf.allow_aliases = true;
+
+       symbol__init(NULL);
+
+       err = auxtrace_parse_filters(rec->evlist);
+       if (err)
+               goto out;
 
        if (dry_run)
-               return 0;
+               goto out;
 
        err = bpf__setup_stdout(rec->evlist);
        if (err) {
                bpf__strerror_setup_stdout(rec->evlist, err, errbuf, sizeof(errbuf));
                pr_err("ERROR: Setup BPF stdout failed: %s\n",
                         errbuf);
-               return err;
+               goto out;
        }
 
        err = -ENOMEM;
 
-       symbol__init(NULL);
-
        if (symbol_conf.kptr_restrict)
                pr_warning(
 "WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,\n"
@@ -1633,7 +1653,7 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
        if (rec->evlist->nr_entries == 0 &&
            perf_evlist__add_default(rec->evlist) < 0) {
                pr_err("Not enough memory for event selector list\n");
-               goto out_symbol_exit;
+               goto out;
        }
 
        if (rec->opts.target.tid && !rec->opts.no_inherit_set)
@@ -1653,7 +1673,7 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
                ui__error("%s", errbuf);
 
                err = -saved_errno;
-               goto out_symbol_exit;
+               goto out;
        }
 
        err = -ENOMEM;
@@ -1662,7 +1682,7 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
 
        err = auxtrace_record__options(rec->itr, rec->evlist, &rec->opts);
        if (err)
-               goto out_symbol_exit;
+               goto out;
 
        /*
         * We take all buildids when the file contains
@@ -1674,11 +1694,11 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
 
        if (record_opts__config(&rec->opts)) {
                err = -EINVAL;
-               goto out_symbol_exit;
+               goto out;
        }
 
        err = __cmd_record(&record, argc, argv);
-out_symbol_exit:
+out:
        perf_evlist__delete(rec->evlist);
        symbol__exit();
        auxtrace_record__free(rec->itr);