Allow the 'e' option to be followed by flags which will affect what errors
will or will not be reported. Each flag must be preceded by either '+' or
'-'. The flags are:
        o       overflow
        l       trace data lost

Signed-off-by: Adrian Hunter <adrian.hun...@intel.com>
---
 tools/perf/Documentation/itrace.txt |  6 ++++
 tools/perf/util/auxtrace.c          | 44 +++++++++++++++++++++++++++++
 tools/perf/util/auxtrace.h          | 12 +++++++-
 3 files changed, 61 insertions(+), 1 deletion(-)

diff --git a/tools/perf/Documentation/itrace.txt 
b/tools/perf/Documentation/itrace.txt
index e817179c5027..114d0544d7c7 100644
--- a/tools/perf/Documentation/itrace.txt
+++ b/tools/perf/Documentation/itrace.txt
@@ -47,3 +47,9 @@
        --itrace=i0nss1000000
 
        skips the first million instructions.
+
+       The 'e' option may be followed by flags which affect what errors will or
+       will not be reported. Each flag must be preceded by either '+' or '-'.
+       The flags are:
+               o       overflow
+               l       trace data lost
diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
index 25c639ac4ad4..f0b0758830ee 100644
--- a/tools/perf/util/auxtrace.c
+++ b/tools/perf/util/auxtrace.c
@@ -1349,6 +1349,47 @@ void itrace_synth_opts__set_default(struct 
itrace_synth_opts *synth_opts,
        synth_opts->initial_skip = 0;
 }
 
+static int get_flag(const char **ptr, unsigned int *flags)
+{
+       while (1) {
+               char c = **ptr;
+
+               if (c >= 'a' && c <= 'z') {
+                       *flags |= 1 << (c - 'a');
+                       ++*ptr;
+                       return 0;
+               } else if (c == ' ') {
+                       ++*ptr;
+                       continue;
+               } else {
+                       return -1;
+               }
+       }
+}
+
+static int get_flags(const char **ptr, unsigned int *plus_flags, unsigned int 
*minus_flags)
+{
+       while (1) {
+               switch (**ptr) {
+               case '+':
+                       ++*ptr;
+                       if (get_flag(ptr, plus_flags))
+                               return -1;
+                       break;
+               case '-':
+                       ++*ptr;
+                       if (get_flag(ptr, minus_flags))
+                               return -1;
+                       break;
+               case ' ':
+                       ++*ptr;
+                       break;
+               default:
+                       return 0;
+               }
+       }
+}
+
 /*
  * Please check tools/perf/Documentation/perf-script.txt for information
  * about the options parsed here, which is introduced after this cset,
@@ -1436,6 +1477,9 @@ int itrace_parse_synth_opts(const struct option *opt, 
const char *str,
                        break;
                case 'e':
                        synth_opts->errors = true;
+                       if (get_flags(&p, &synth_opts->error_plus_flags,
+                                     &synth_opts->error_minus_flags))
+                               goto out_err;
                        break;
                case 'd':
                        synth_opts->log = true;
diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h
index e3ce5fb03ca0..cfe6d00d8624 100644
--- a/tools/perf/util/auxtrace.h
+++ b/tools/perf/util/auxtrace.h
@@ -55,6 +55,9 @@ enum itrace_period_type {
        PERF_ITRACE_PERIOD_NANOSECS,
 };
 
+#define AUXTRACE_ERR_FLG_OVERFLOW      (1 << ('o' - 'a'))
+#define AUXTRACE_ERR_FLG_DATA_LOST     (1 << ('l' - 'a'))
+
 /**
  * struct itrace_synth_opts - AUX area tracing synthesis options.
  * @set: indicates whether or not options have been set
@@ -91,6 +94,8 @@ enum itrace_period_type {
  * @cpu_bitmap: CPUs for which to synthesize events, or NULL for all
  * @ptime_range: time intervals to trace or NULL
  * @range_num: number of time intervals to trace
+ * @error_plus_flags: flags to affect what errors are reported
+ * @error_minus_flags: flags to affect what errors are reported
  */
 struct itrace_synth_opts {
        bool                    set;
@@ -124,6 +129,8 @@ struct itrace_synth_opts {
        unsigned long           *cpu_bitmap;
        struct perf_time_interval *ptime_range;
        int                     range_num;
+       unsigned int            error_plus_flags;
+       unsigned int            error_minus_flags;
 };
 
 /**
@@ -613,7 +620,10 @@ bool auxtrace__evsel_is_auxtrace(struct perf_session 
*session,
 "                              p:                      synthesize power 
events\n"                      \
 "                              o:                      synthesize other events 
recorded due to the use\n" \
 "                                                      of aux-output (refer to 
perf record)\n" \
-"                              e:                      synthesize error 
events\n"                      \
+"                              e[flags]:               synthesize error 
events\n" \
+"                                                      each flag must be 
preceded by + or -\n" \
+"                                                      error flags are: o 
(overflow)\n" \
+"                                                                       l 
(data lost)\n" \
 "                              d:                      create a debug log\n"   
                \
 "                              f:                      synthesize first level 
cache events\n" \
 "                              m:                      synthesize last level 
cache events\n" \
-- 
2.17.1

Reply via email to