Browse Source

perf record: Support weak groups

Implement a weak group fallback for 'perf record', similar to the
existing 'perf stat' support.  This allows to use groups that might be
longer than the available counters without failing.

Before:

  $ perf record  -e '{cycles,cache-misses,cache-references,cpu_clk_unhalted.thread,cycles,cycles,cycles}' -a sleep 1
  Error:
  The sys_perf_event_open() syscall returned with 22 (Invalid argument) for event (cycles).
  /bin/dmesg | grep -i perf may provide additional information.

After:

  $ ./perf record  -e '{cycles,cache-misses,cache-references,cpu_clk_unhalted.thread,cycles,cycles,cycles}:W' -a sleep 1
  WARNING: No sample_id_all support, falling back to unordered processing
  [ perf record: Woken up 3 times to write data ]
  [ perf record: Captured and wrote 8.136 MB perf.data (134069 samples) ]

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/20181001195927.14211-2-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Andi Kleen 6 years ago
parent
commit
cf99ad1424
2 changed files with 6 additions and 2 deletions
  1. 0 1
      tools/perf/Documentation/perf-list.txt
  2. 6 1
      tools/perf/builtin-record.c

+ 0 - 1
tools/perf/Documentation/perf-list.txt

@@ -55,7 +55,6 @@ counted. The following modifiers exist:
  S - read sample value (PERF_SAMPLE_READ)
  S - read sample value (PERF_SAMPLE_READ)
  D - pin the event to the PMU
  D - pin the event to the PMU
  W - group is weak and will fallback to non-group if not schedulable,
  W - group is weak and will fallback to non-group if not schedulable,
-     only supported in 'perf stat' for now.
 
 
 The 'p' modifier can be used for specifying how precise the instruction
 The 'p' modifier can be used for specifying how precise the instruction
 address should be. The 'p' modifier can be specified multiple times:
 address should be. The 'p' modifier can be specified multiple times:

+ 6 - 1
tools/perf/builtin-record.c

@@ -391,7 +391,12 @@ try_again:
 					ui__warning("%s\n", msg);
 					ui__warning("%s\n", msg);
 				goto try_again;
 				goto try_again;
 			}
 			}
-
+			if ((errno == EINVAL || errno == EBADF) &&
+			    pos->leader != pos &&
+			    pos->weak_group) {
+			        pos = perf_evlist__reset_weak_group(evlist, pos);
+				goto try_again;
+			}
 			rc = -errno;
 			rc = -errno;
 			perf_evsel__open_strerror(pos, &opts->target,
 			perf_evsel__open_strerror(pos, &opts->target,
 						  errno, msg, sizeof(msg));
 						  errno, msg, sizeof(msg));