]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
perf stat: Add no-affinity flag
authorIan Rogers <irogers@google.com>
Tue, 10 Feb 2026 06:03:59 +0000 (22:03 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 10 Feb 2026 12:35:28 +0000 (09:35 -0300)
Add flag that disables affinity behavior.

Using sched_setaffinity() to place a perf thread on a CPU can avoid
certain interprocessor interrupts but may introduce a delay due to the
scheduling, particularly on loaded machines.

Add a command line option to disable the behavior.

This behavior is less present in other tools like `perf record`, as it
uses a ring buffer and doesn't make repeated system calls.

Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Andres Freund <andres@anarazel.de>
Cc: Dapeng Mi <dapeng1.mi@linux.intel.com>
Cc: Dr. David Alan Gilbert <linux@treblig.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Falcon <thomas.falcon@intel.com>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Yang Li <yang.lee@linux.alibaba.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Documentation/perf-stat.txt
tools/perf/builtin-stat.c
tools/perf/util/evlist.c
tools/perf/util/evlist.h

index 1a766d4a22334da70c749d47484b43ba6d8a683d..7cccc3a847d160150062708ae2c6a15ca30aadb3 100644 (file)
@@ -382,6 +382,11 @@ color the metric's computed value.
 Don't print output, warnings or messages. This is useful with perf stat
 record below to only write data to the perf.data file.
 
+--no-affinity::
+Don't change scheduler CPU affinities when iterating over
+CPUs. Disables an optimization aimed at minimizing interprocessor
+interrupts.
+
 STAT RECORD
 -----------
 Stores stat data into perf data file.
index c1bb40b99176a65be098067bfb04de1c65416f6a..73c2ba7e30760e1455571a569e2299952577de5c 100644 (file)
@@ -2426,6 +2426,7 @@ static int parse_tpebs_mode(const struct option *opt, const char *str,
 int cmd_stat(int argc, const char **argv)
 {
        struct opt_aggr_mode opt_mode = {};
+       bool affinity = true, affinity_set = false;
        struct option stat_options[] = {
                OPT_BOOLEAN('T', "transaction", &transaction_run,
                        "hardware transaction statistics"),
@@ -2554,6 +2555,8 @@ int cmd_stat(int argc, const char **argv)
                        "don't print 'summary' for CSV summary output"),
                OPT_BOOLEAN(0, "quiet", &quiet,
                        "don't print any output, messages or warnings (useful with record)"),
+               OPT_BOOLEAN_SET(0, "affinity", &affinity, &affinity_set,
+                       "enable (default) or disable affinity optimizations to reduce IPIs"),
                OPT_CALLBACK(0, "cputype", &evsel_list, "hybrid cpu type",
                        "Only enable events on applying cpu with this type "
                        "for hybrid platform (e.g. core or atom)",
@@ -2611,6 +2614,9 @@ int cmd_stat(int argc, const char **argv)
        } else
                stat_config.csv_sep = DEFAULT_SEPARATOR;
 
+       if (affinity_set)
+               evsel_list->no_affinity = !affinity;
+
        if (argc && strlen(argv[0]) > 2 && strstarts("record", argv[0])) {
                argc = __cmd_record(stat_options, &opt_mode, argc, argv);
                if (argc < 0)
index 45833244daf3c4deed6f240f61b63f7ed7dcdebb..591bdf0b3e2a10623afd529706244105cc600c4d 100644 (file)
@@ -369,11 +369,7 @@ static bool evlist__use_affinity(struct evlist *evlist)
        struct perf_cpu_map *used_cpus = NULL;
        bool ret = false;
 
-       /*
-        * With perf record core.user_requested_cpus is usually NULL.
-        * Use the old method to handle this for now.
-        */
-       if (!evlist->core.user_requested_cpus ||
+       if (evlist->no_affinity || !evlist->core.user_requested_cpus ||
            cpu_map__is_dummy(evlist->core.user_requested_cpus))
                return false;
 
index 30dff7484d3cedb3009ab137dbf00d463a3ebc4c..d17c3b57a409c34d8b08f35def539ec627f16d19 100644 (file)
@@ -59,6 +59,7 @@ struct event_enable_timer;
 struct evlist {
        struct perf_evlist core;
        bool             enabled;
+       bool             no_affinity;
        int              id_pos;
        int              is_pos;
        int              nr_br_cntr;