2023-07-27 09:19:35

by Changbin Du

[permalink] [raw]
Subject: [PATCH v4 0/4] perf: add new option '--workload-attr' to set workload sched_policy/priority/cpumask

This adds a new option '--workload-attr' to set the sched_policy/priority/cpumask
of the workload to reduce system noise.

$ sudo perf stat --workload-attr fifo,40,0-3:7 -- ls

Please see patch 2/4 for more details.

v4:
- add a test case for perf-stat. (suggeted by Ian Rogers)
- fix warning found by 0-DAY.
v3:
- replace taskset with --workload-attr option in documents and tests.
v2:
- Use cpu list spec instead of cpu mask number.
- Update documents.

Changbin Du (4):
perf cpumap: Add __perf_cpu_map__new and perf_cpu_map__2_cpuset
perf: add new option '--workload-attr' to set workload
sched_policy/priority/cpumask
perf: replace taskset with --workload-attr option
perf test: add test case for --workload-attr option

tools/lib/perf/cpumap.c | 45 ++++++-
tools/lib/perf/include/perf/cpumap.h | 4 +
tools/lib/perf/libperf.map | 2 +
tools/perf/Documentation/intel-hybrid.txt | 2 +-
tools/perf/Documentation/perf-record.txt | 7 ++
tools/perf/Documentation/perf-stat.txt | 8 +-
tools/perf/builtin-record.c | 26 ++++
tools/perf/builtin-stat.c | 18 +++
tools/perf/tests/cpumap.c | 23 ++++
tools/perf/tests/shell/stat.sh | 19 +++
.../tests/shell/stat_bpf_counters_cgrp.sh | 2 +-
tools/perf/tests/shell/test_arm_coresight.sh | 2 +-
tools/perf/tests/shell/test_data_symbol.sh | 2 +-
tools/perf/tests/shell/test_intel_pt.sh | 2 +-
tools/perf/util/evlist.c | 116 ++++++++++++++++++
tools/perf/util/evlist.h | 3 +
tools/perf/util/target.h | 9 ++
17 files changed, 281 insertions(+), 9 deletions(-)

--
2.25.1



2023-07-27 09:39:43

by Changbin Du

[permalink] [raw]
Subject: [PATCH v4 3/4] perf: replace taskset with --workload-attr option

Replace the taskset with our new option --workload-attr.

Signed-off-by: Changbin Du <[email protected]>
---
tools/perf/Documentation/intel-hybrid.txt | 2 +-
tools/perf/Documentation/perf-stat.txt | 2 +-
tools/perf/tests/shell/stat_bpf_counters_cgrp.sh | 2 +-
tools/perf/tests/shell/test_arm_coresight.sh | 2 +-
tools/perf/tests/shell/test_data_symbol.sh | 2 +-
tools/perf/tests/shell/test_intel_pt.sh | 2 +-
6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/tools/perf/Documentation/intel-hybrid.txt b/tools/perf/Documentation/intel-hybrid.txt
index e7a776ad25d7..b4adb1eeba3f 100644
--- a/tools/perf/Documentation/intel-hybrid.txt
+++ b/tools/perf/Documentation/intel-hybrid.txt
@@ -132,7 +132,7 @@ displayed. The percentage is the event's running time/enabling time.
One example, 'triad_loop' runs on cpu16 (atom core), while we can see the
scaled value for core cycles is 160,444,092 and the percentage is 0.47%.

-perf stat -e cycles \-- taskset -c 16 ./triad_loop
+perf stat -e cycles --workload-attr other,0,16 \-- ./triad_loop

As previous, two events are created.

diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentation/perf-stat.txt
index 18d0f73458b1..fb52ddcea622 100644
--- a/tools/perf/Documentation/perf-stat.txt
+++ b/tools/perf/Documentation/perf-stat.txt
@@ -464,7 +464,7 @@ on workload with changing phases.

To interpret the results it is usually needed to know on which
CPUs the workload runs on. If needed the CPUs can be forced using
-taskset.
+--workload-attr option.

--td-level::
Print the top-down statistics that equal the input level. It allows
diff --git a/tools/perf/tests/shell/stat_bpf_counters_cgrp.sh b/tools/perf/tests/shell/stat_bpf_counters_cgrp.sh
index d724855d097c..b13bf391b137 100755
--- a/tools/perf/tests/shell/stat_bpf_counters_cgrp.sh
+++ b/tools/perf/tests/shell/stat_bpf_counters_cgrp.sh
@@ -64,7 +64,7 @@ check_cpu_list_counted()
{
local output

- output=$(perf stat -C 1 --bpf-counters --for-each-cgroup ${test_cgroups} -e cpu-clock -x, taskset -c 1 sleep 1 2>&1)
+ output=$(perf stat -C 1 --bpf-counters --for-each-cgroup ${test_cgroups} -e cpu-clock -x, --workload-attr other,0,1 -- sleep 1 2>&1)
if echo ${output} | grep -q -F "<not "; then
echo "Some CPU events are not counted"
if [ "${verbose}" = "1" ]; then
diff --git a/tools/perf/tests/shell/test_arm_coresight.sh b/tools/perf/tests/shell/test_arm_coresight.sh
index f1bf5621160f..e00d04570aa8 100755
--- a/tools/perf/tests/shell/test_arm_coresight.sh
+++ b/tools/perf/tests/shell/test_arm_coresight.sh
@@ -38,7 +38,7 @@ record_touch_file() {
echo "Recording trace (only user mode) with path: CPU$2 => $1"
rm -f $file
perf record -o ${perfdata} -e cs_etm/@$1/u --per-thread \
- -- taskset -c $2 touch $file > /dev/null 2>&1
+ --workload-attr other,0,$2 -- touch $file > /dev/null 2>&1
}

perf_script_branch_samples() {
diff --git a/tools/perf/tests/shell/test_data_symbol.sh b/tools/perf/tests/shell/test_data_symbol.sh
index 69bb6fe86c50..02c6a97e3d0f 100755
--- a/tools/perf/tests/shell/test_data_symbol.sh
+++ b/tools/perf/tests/shell/test_data_symbol.sh
@@ -50,7 +50,7 @@ echo "Recording workload..."
# specific CPU and test in per-CPU mode.
is_amd=$(grep -E -c 'vendor_id.*AuthenticAMD' /proc/cpuinfo)
if (($is_amd >= 1)); then
- perf mem record -o ${PERF_DATA} -C 0 -- taskset -c 0 $TEST_PROGRAM &
+ perf mem record -o ${PERF_DATA} -C 0 --workload-attr other,0,0 -- $TEST_PROGRAM &
else
perf mem record --all-user -o ${PERF_DATA} -- $TEST_PROGRAM &
fi
diff --git a/tools/perf/tests/shell/test_intel_pt.sh b/tools/perf/tests/shell/test_intel_pt.sh
index 3a8b9bffa022..0dc085c72593 100755
--- a/tools/perf/tests/shell/test_intel_pt.sh
+++ b/tools/perf/tests/shell/test_intel_pt.sh
@@ -110,7 +110,7 @@ test_system_wide_side_band()
can_cpu_wide 1 || return $?

# Record on CPU 0 a task running on CPU 1
- perf_record_no_decode -o "${perfdatafile}" -e intel_pt//u -C 0 -- taskset --cpu-list 1 uname
+ perf_record_no_decode -o "${perfdatafile}" -e intel_pt//u -C 0 --workload-attr other,0,1 -- uname

# Should get MMAP events from CPU 1 because they can be needed to decode
mmap_cnt=$(perf script -i "${perfdatafile}" --no-itrace --show-mmap-events -C 1 2>/dev/null | grep -c MMAP)
--
2.25.1