* [PATCH v6 0/3] Introduce --task-name and --fuzzy-name options in perf sched map
@ 2024-07-07 18:27 Madadi Vineeth Reddy
2024-07-07 18:27 ` [PATCH v6 1/3] perf sched map: Add task-name option to filter the output map Madadi Vineeth Reddy
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Madadi Vineeth Reddy @ 2024-07-07 18:27 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Namhyung Kim, Ian Rogers,
Athira Rajeev, Chen Yu
Cc: Peter Zijlstra, Ingo Molnar, Mark Rutland, Alexander Shishkin,
Jiri Olsa, Adrian Hunter, Kan Liang, acme, linux-perf-users,
LKML, Madadi Vineeth Reddy
This patch-set aims to reduce the amount of output printed on the terminal
when using perf sched map, allowing users to focus only on the tasks of
interest.
This helps in visualizing how a benchmark or a task is spread over
the available CPUs while also knowing which CPUs are idle(.) and which
are not(-). This will be more useful as number of CPUs increase.
Changelog:
=========
Changes in v6:
- Utilize strlist for simplified task matching. (Namhyung Kim)
- Include relevant symbols while printing row for sched-out. (Namhyung Kim)
- Rebase against perf-tools-next commit 608c3b1e612a ("perf install:
Don't propagate subdir to Documentation submake")
- Link to v5: https://lore.kernel.org/all/20240626091550.46707-1-vineethr@linux.ibm.com/
Changes in v5:
- Split the changes into different commits. (Namhyung Kim)
- Rebase against perf-tools-next commit c7a5592e8e4d ("perf mem: Fix a
segfault with NULL event->name")
- Link to v4: https://lore.kernel.org/all/20240618180708.14144-1-vineethr@linux.ibm.com/
Changes in v4:
- Handle possible memory allocation failures. (Chen Yu)
- Link to v3: https://lore.kernel.org/all/20240617125006.31654-1-vineethr@linux.ibm.com/
Changes in v3:
- Print the sched-out timestamp as a row when using the --command-name
option. (Namhyung Kim)
- Refactor the code.
- Rebase against perf-tools-next commit eae7044b67a6 ("perf hist: Honor
symbol conf.skip_empty")
- Link to v2: https://lore.kernel.org/all/20240608124915.33860-1-vineethr@linux.ibm.com/
Changes in v2:
- Add support for giving multiple command-names in CSV. (Namhyung Kim)
- Add fuzzy name matching option. (Chen Yu)
- Add Reviewed-and-tested-by tag from Athira Rajeev.
- Rebase against perf-tools-next commit d2307fd4f989 ("perf maps: Add/use
a sorted insert for fixup overlap and insert")
- Link to v1: https://lore.kernel.org/all/20240417152521.80340-1-vineethr@linux.ibm.com/
Madadi Vineeth Reddy (3):
perf sched map: Add task-name option to filter the output map
perf sched map: Add support for multiple task names using CSV
perf sched map: Add --fuzzy-name option for fuzzy matching in task
names
tools/perf/Documentation/perf-sched.txt | 10 ++
tools/perf/builtin-sched.c | 175 +++++++++++++++++++-----
2 files changed, 149 insertions(+), 36 deletions(-)
--
2.43.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v6 1/3] perf sched map: Add task-name option to filter the output map
2024-07-07 18:27 [PATCH v6 0/3] Introduce --task-name and --fuzzy-name options in perf sched map Madadi Vineeth Reddy
@ 2024-07-07 18:27 ` Madadi Vineeth Reddy
2024-07-07 18:27 ` [PATCH v6 2/3] perf sched map: Add support for multiple task names using CSV Madadi Vineeth Reddy
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Madadi Vineeth Reddy @ 2024-07-07 18:27 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Namhyung Kim, Ian Rogers,
Athira Rajeev, Chen Yu
Cc: Peter Zijlstra, Ingo Molnar, Mark Rutland, Alexander Shishkin,
Jiri Olsa, Adrian Hunter, Kan Liang, acme, linux-perf-users,
LKML, Madadi Vineeth Reddy
By default, perf sched map prints sched-in events for all the tasks
which may not be required all the time as it prints lot of symbols
and rows to the terminal.
With --task-name option, one could specify the specific task name
for which the map has to be shown. This would help in analyzing the
CPU usage patterns easier for that specific task. Since multiple
PID's might have the same task name, using task-name filter
would be more useful for debugging.
For other tasks, instead of printing the symbol, '-' is printed and
the same '.' is used to represent idle. '-' is used instead of symbol
for other tasks because it helps in clear visualization of task
of interest and secondly the symbol itself doesn't mean anything
because the sched-in of that symbol will not be printed(first sched-in
contains pid and the corresponding symbol).
When using the --task-name option, the sched-out time is represented
by a '*-'. Since not all task sched-in events are printed, the sched-out
time of the relevant task might be lost. This representation ensures
that the sched-out time of the interested task is not overlooked.
6.10.0-rc1
==========
*A0 131040.639793 secs A0 => migration/0:19
*. 131040.639801 secs . => swapper:0
. *B0 131040.639830 secs B0 => migration/1:24
. *. 131040.639836 secs
. . *C0 131040.640108 secs C0 => migration/2:30
. . *. 131040.640163 secs
. . . *D0 131040.640386 secs D0 => migration/3:36
. . . *. 131040.640395 secs
6.10.0-rc1 + patch (--task-name wdavdaemon)
=============
. *A0 . . . . - . 131040.641346 secs A0 => wdavdaemon:62509
. A0 *B0 . . . - . 131040.641378 secs B0 => wdavdaemon:62274
- *- B0 . . . - . 131040.641379 secs
*C0 . B0 . . . . . 131040.641572 secs C0 => wdavdaemon:62283
C0 . B0 . *D0 . . . 131040.641572 secs D0 => wdavdaemon:62277
C0 . B0 . D0 . *E0 . 131040.641578 secs E0 => wdavdaemon:62270
*- . B0 . D0 . E0 . 131040.641581 secs
. . B0 . D0 . *- . 131040.641583 secs
Reviewed-and-tested-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Signed-off-by: Madadi Vineeth Reddy <vineethr@linux.ibm.com>
---
tools/perf/Documentation/perf-sched.txt | 6 +
tools/perf/builtin-sched.c | 147 ++++++++++++++++++------
2 files changed, 117 insertions(+), 36 deletions(-)
diff --git a/tools/perf/Documentation/perf-sched.txt b/tools/perf/Documentation/perf-sched.txt
index f0e5617f6652..964036c48ac4 100644
--- a/tools/perf/Documentation/perf-sched.txt
+++ b/tools/perf/Documentation/perf-sched.txt
@@ -130,6 +130,12 @@ OPTIONS for 'perf sched map'
--color-pids::
Highlight the given pids.
+--task-name <task>::
+ Map output only for the given task name. The sched-out
+ time is printed and is represented by '*-' for the given
+ task name
+ ('-' indicates other tasks while '.' is idle).
+
OPTIONS for 'perf sched timehist'
---------------------------------
-k::
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
index 24e9d83c7bb6..3ee3f7fd78b0 100644
--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -156,6 +156,7 @@ struct perf_sched_map {
const char *color_pids_str;
struct perf_cpu_map *color_cpus;
const char *color_cpus_str;
+ const char *task_name;
struct perf_cpu_map *cpus;
const char *cpus_str;
};
@@ -177,6 +178,7 @@ struct perf_sched {
struct perf_cpu max_cpu;
u32 *curr_pid;
struct thread **curr_thread;
+ struct thread **curr_out_thread;
char next_shortname1;
char next_shortname2;
unsigned int replay_repeat;
@@ -1538,23 +1540,75 @@ map__findnew_thread(struct perf_sched *sched, struct machine *machine, pid_t pid
return thread;
}
+static void print_sched_map(struct perf_sched *sched, struct perf_cpu this_cpu, int cpus_nr,
+ const char *color, bool sched_out)
+{
+ for (int i = 0; i < cpus_nr; i++) {
+ struct perf_cpu cpu = {
+ .cpu = sched->map.comp ? sched->map.comp_cpus[i].cpu : i,
+ };
+ struct thread *curr_thread = sched->curr_thread[cpu.cpu];
+ struct thread *curr_out_thread = sched->curr_out_thread[cpu.cpu];
+ struct thread_runtime *curr_tr;
+ const char *pid_color = color;
+ const char *cpu_color = color;
+ char symbol = ' ';
+ struct thread *thread_to_check = sched_out ? curr_out_thread : curr_thread;
+
+ if (thread_to_check && thread__has_color(thread_to_check))
+ pid_color = COLOR_PIDS;
+
+ if (sched->map.color_cpus && perf_cpu_map__has(sched->map.color_cpus, cpu))
+ cpu_color = COLOR_CPUS;
+
+ if (cpu.cpu == this_cpu.cpu)
+ symbol = '*';
+
+ color_fprintf(stdout, cpu.cpu != this_cpu.cpu ? color : cpu_color, "%c", symbol);
+
+ thread_to_check = sched_out ? sched->curr_out_thread[cpu.cpu] :
+ sched->curr_thread[cpu.cpu];
+
+ if (thread_to_check) {
+ curr_tr = thread__get_runtime(thread_to_check);
+ if (curr_tr == NULL)
+ return;
+
+ if (sched_out) {
+ if (cpu.cpu == this_cpu.cpu)
+ color_fprintf(stdout, color, "- ");
+ else {
+ curr_tr = thread__get_runtime(sched->curr_thread[cpu.cpu]);
+ if (curr_tr != NULL)
+ color_fprintf(stdout, pid_color, "%2s ",
+ curr_tr->shortname);
+ }
+ } else
+ color_fprintf(stdout, pid_color, "%2s ", curr_tr->shortname);
+ } else
+ color_fprintf(stdout, color, " ");
+ }
+}
+
static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,
struct perf_sample *sample, struct machine *machine)
{
const u32 next_pid = evsel__intval(evsel, sample, "next_pid");
- struct thread *sched_in;
+ const u32 prev_pid = evsel__intval(evsel, sample, "prev_pid");
+ struct thread *sched_in, *sched_out;
struct thread_runtime *tr;
int new_shortname;
u64 timestamp0, timestamp = sample->time;
s64 delta;
- int i;
struct perf_cpu this_cpu = {
.cpu = sample->cpu,
};
int cpus_nr;
+ int proceed;
bool new_cpu = false;
const char *color = PERF_COLOR_NORMAL;
char stimestamp[32];
+ const char *str;
BUG_ON(this_cpu.cpu >= MAX_CPUS || this_cpu.cpu < 0);
@@ -1583,7 +1637,8 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,
}
sched_in = map__findnew_thread(sched, machine, -1, next_pid);
- if (sched_in == NULL)
+ sched_out = map__findnew_thread(sched, machine, -1, prev_pid);
+ if (sched_in == NULL || sched_out == NULL)
return -1;
tr = thread__get_runtime(sched_in);
@@ -1593,7 +1648,9 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,
}
sched->curr_thread[this_cpu.cpu] = thread__get(sched_in);
+ sched->curr_out_thread[this_cpu.cpu] = thread__get(sched_out);
+ str = thread__comm_str(sched_in);
new_shortname = 0;
if (!tr->shortname[0]) {
if (!strcmp(thread__comm_str(sched_in), "swapper")) {
@@ -1603,7 +1660,7 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,
*/
tr->shortname[0] = '.';
tr->shortname[1] = ' ';
- } else {
+ } else if (!sched->map.task_name || !strcmp(str, sched->map.task_name)) {
tr->shortname[0] = sched->next_shortname1;
tr->shortname[1] = sched->next_shortname2;
@@ -1616,6 +1673,9 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,
else
sched->next_shortname2 = '0';
}
+ } else {
+ tr->shortname[0] = '-';
+ tr->shortname[1] = ' ';
}
new_shortname = 1;
}
@@ -1623,42 +1683,28 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,
if (sched->map.cpus && !perf_cpu_map__has(sched->map.cpus, this_cpu))
goto out;
- printf(" ");
-
- for (i = 0; i < cpus_nr; i++) {
- struct perf_cpu cpu = {
- .cpu = sched->map.comp ? sched->map.comp_cpus[i].cpu : i,
- };
- struct thread *curr_thread = sched->curr_thread[cpu.cpu];
- struct thread_runtime *curr_tr;
- const char *pid_color = color;
- const char *cpu_color = color;
-
- if (curr_thread && thread__has_color(curr_thread))
- pid_color = COLOR_PIDS;
-
- if (sched->map.cpus && !perf_cpu_map__has(sched->map.cpus, cpu))
- continue;
-
- if (sched->map.color_cpus && perf_cpu_map__has(sched->map.color_cpus, cpu))
- cpu_color = COLOR_CPUS;
-
- if (cpu.cpu != this_cpu.cpu)
- color_fprintf(stdout, color, " ");
+ proceed = 0;
+ str = thread__comm_str(sched_in);
+ /*
+ * Check which of sched_in and sched_out matches the passed --task-name
+ * arguments and call the corresponding print_sched_map.
+ */
+ if (sched->map.task_name && strcmp(str, sched->map.task_name)) {
+ if (strcmp(thread__comm_str(sched_out), sched->map.task_name))
+ goto out;
else
- color_fprintf(stdout, cpu_color, "*");
+ goto sched_out;
- if (sched->curr_thread[cpu.cpu]) {
- curr_tr = thread__get_runtime(sched->curr_thread[cpu.cpu]);
- if (curr_tr == NULL) {
- thread__put(sched_in);
- return -1;
- }
- color_fprintf(stdout, pid_color, "%2s ", curr_tr->shortname);
- } else
- color_fprintf(stdout, color, " ");
+ } else {
+ str = thread__comm_str(sched_out);
+ if (!(sched->map.task_name && strcmp(str, sched->map.task_name)))
+ proceed = 1;
}
+ printf(" ");
+
+ print_sched_map(sched, this_cpu, cpus_nr, color, false);
+
timestamp__scnprintf_usec(timestamp, stimestamp, sizeof(stimestamp));
color_fprintf(stdout, color, " %12s secs ", stimestamp);
if (new_shortname || tr->comm_changed || (verbose > 0 && thread__tid(sched_in))) {
@@ -1675,9 +1721,32 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,
if (sched->map.comp && new_cpu)
color_fprintf(stdout, color, " (CPU %d)", this_cpu);
+ if (proceed != 1) {
+ color_fprintf(stdout, color, "\n");
+ goto out;
+ }
+
+sched_out:
+ if (sched->map.task_name) {
+ tr = thread__get_runtime(sched->curr_out_thread[this_cpu.cpu]);
+ if (strcmp(tr->shortname, "") == 0)
+ goto out;
+
+ if (proceed == 1)
+ color_fprintf(stdout, color, "\n");
+
+ printf(" ");
+ print_sched_map(sched, this_cpu, cpus_nr, color, true);
+ timestamp__scnprintf_usec(timestamp, stimestamp, sizeof(stimestamp));
+ color_fprintf(stdout, color, " %12s secs ", stimestamp);
+ }
+
color_fprintf(stdout, color, "\n");
out:
+ if (sched->map.task_name)
+ thread__put(sched_out);
+
thread__put(sched_in);
return 0;
@@ -3310,6 +3379,10 @@ static int perf_sched__map(struct perf_sched *sched)
if (!sched->curr_thread)
return rc;
+ sched->curr_out_thread = calloc(MAX_CPUS, sizeof(*(sched->curr_out_thread)));
+ if (!sched->curr_out_thread)
+ return rc;
+
if (setup_cpus_switch_event(sched))
goto out_free_curr_thread;
@@ -3566,6 +3639,8 @@ int cmd_sched(int argc, const char **argv)
"highlight given CPUs in map"),
OPT_STRING(0, "cpus", &sched.map.cpus_str, "cpus",
"display given CPUs in map"),
+ OPT_STRING(0, "task-name", &sched.map.task_name, "task",
+ "map output only for the given task name"),
OPT_PARENT(sched_options)
};
const struct option timehist_options[] = {
--
2.43.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v6 2/3] perf sched map: Add support for multiple task names using CSV
2024-07-07 18:27 [PATCH v6 0/3] Introduce --task-name and --fuzzy-name options in perf sched map Madadi Vineeth Reddy
2024-07-07 18:27 ` [PATCH v6 1/3] perf sched map: Add task-name option to filter the output map Madadi Vineeth Reddy
@ 2024-07-07 18:27 ` Madadi Vineeth Reddy
2024-07-07 18:27 ` [PATCH v6 3/3] perf sched map: Add --fuzzy-name option for fuzzy matching in task names Madadi Vineeth Reddy
2024-07-12 16:45 ` [PATCH v6 0/3] Introduce --task-name and --fuzzy-name options in perf sched map Namhyung Kim
3 siblings, 0 replies; 5+ messages in thread
From: Madadi Vineeth Reddy @ 2024-07-07 18:27 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Namhyung Kim, Ian Rogers,
Athira Rajeev, Chen Yu
Cc: Peter Zijlstra, Ingo Molnar, Mark Rutland, Alexander Shishkin,
Jiri Olsa, Adrian Hunter, Kan Liang, acme, linux-perf-users,
LKML, Madadi Vineeth Reddy
To track the scheduling patterns of multiple tasks simultaneously,
multiple task names can be specified using a comma separator
without any whitespace.
Sample output for --task-name perf,wdavdaemon
=============
. *A0 . . . . - . 131040.641346 secs A0 => wdavdaemon:62509
. A0 *B0 . . . - . 131040.641378 secs B0 => wdavdaemon:62274
. *- B0 . . . - . 131040.641379 secs
*C0 . B0 . . . . . 131040.641572 secs C0 => wdavdaemon:62283
...
. *- . . . . . . 131041.395649 secs
. . . . . . . *X2 131041.403969 secs X2 => perf:70211
. . . . . . . *- 131041.404006 secs
Suggested-by: Namhyung Kim <namhyung@kernel.org>
Reviewed-and-tested-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Signed-off-by: Madadi Vineeth Reddy <vineethr@linux.ibm.com>
---
tools/perf/Documentation/perf-sched.txt | 5 ++--
tools/perf/builtin-sched.c | 32 +++++++++++++++++++++----
2 files changed, 30 insertions(+), 7 deletions(-)
diff --git a/tools/perf/Documentation/perf-sched.txt b/tools/perf/Documentation/perf-sched.txt
index 964036c48ac4..4f8216ee4a74 100644
--- a/tools/perf/Documentation/perf-sched.txt
+++ b/tools/perf/Documentation/perf-sched.txt
@@ -131,9 +131,10 @@ OPTIONS for 'perf sched map'
Highlight the given pids.
--task-name <task>::
- Map output only for the given task name. The sched-out
+ Map output only for the given task name(s). Separate the
+ task names with a comma (without whitespace). The sched-out
time is printed and is represented by '*-' for the given
- task name
+ task name(s).
('-' indicates other tasks while '.' is idle).
OPTIONS for 'perf sched timehist'
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
index 3ee3f7fd78b0..7de29c2f3d23 100644
--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -157,6 +157,7 @@ struct perf_sched_map {
struct perf_cpu_map *color_cpus;
const char *color_cpus_str;
const char *task_name;
+ struct strlist *task_names;
struct perf_cpu_map *cpus;
const char *cpus_str;
};
@@ -1540,6 +1541,18 @@ map__findnew_thread(struct perf_sched *sched, struct machine *machine, pid_t pid
return thread;
}
+static bool sched_match_task(const char *comm_str, struct strlist *task_names)
+{
+ struct str_node *node;
+
+ strlist__for_each_entry(node, task_names) {
+ if (strcmp(comm_str, node->s) == 0)
+ return true;
+ }
+
+ return false;
+}
+
static void print_sched_map(struct perf_sched *sched, struct perf_cpu this_cpu, int cpus_nr,
const char *color, bool sched_out)
{
@@ -1609,6 +1622,7 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,
const char *color = PERF_COLOR_NORMAL;
char stimestamp[32];
const char *str;
+ struct strlist *task_names = sched->map.task_names;
BUG_ON(this_cpu.cpu >= MAX_CPUS || this_cpu.cpu < 0);
@@ -1660,7 +1674,7 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,
*/
tr->shortname[0] = '.';
tr->shortname[1] = ' ';
- } else if (!sched->map.task_name || !strcmp(str, sched->map.task_name)) {
+ } else if (!sched->map.task_name || sched_match_task(str, task_names)) {
tr->shortname[0] = sched->next_shortname1;
tr->shortname[1] = sched->next_shortname2;
@@ -1689,15 +1703,15 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,
* Check which of sched_in and sched_out matches the passed --task-name
* arguments and call the corresponding print_sched_map.
*/
- if (sched->map.task_name && strcmp(str, sched->map.task_name)) {
- if (strcmp(thread__comm_str(sched_out), sched->map.task_name))
+ if (sched->map.task_name && !sched_match_task(str, task_names)) {
+ if (!sched_match_task(thread__comm_str(sched_out), task_names))
goto out;
else
goto sched_out;
} else {
str = thread__comm_str(sched_out);
- if (!(sched->map.task_name && strcmp(str, sched->map.task_name)))
+ if (!(sched->map.task_name && !sched_match_task(str, task_names)))
proceed = 1;
}
@@ -3640,7 +3654,7 @@ int cmd_sched(int argc, const char **argv)
OPT_STRING(0, "cpus", &sched.map.cpus_str, "cpus",
"display given CPUs in map"),
OPT_STRING(0, "task-name", &sched.map.task_name, "task",
- "map output only for the given task name"),
+ "map output only for the given task name(s)."),
OPT_PARENT(sched_options)
};
const struct option timehist_options[] = {
@@ -3739,6 +3753,14 @@ int cmd_sched(int argc, const char **argv)
argc = parse_options(argc, argv, map_options, map_usage, 0);
if (argc)
usage_with_options(map_usage, map_options);
+
+ if (sched.map.task_name) {
+ sched.map.task_names = strlist__new(sched.map.task_name, NULL);
+ if (sched.map.task_names == NULL) {
+ fprintf(stderr, "Failed to parse task names\n");
+ return -1;
+ }
+ }
}
sched.tp_handler = &map_ops;
setup_sorting(&sched, latency_options, latency_usage);
--
2.43.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v6 3/3] perf sched map: Add --fuzzy-name option for fuzzy matching in task names
2024-07-07 18:27 [PATCH v6 0/3] Introduce --task-name and --fuzzy-name options in perf sched map Madadi Vineeth Reddy
2024-07-07 18:27 ` [PATCH v6 1/3] perf sched map: Add task-name option to filter the output map Madadi Vineeth Reddy
2024-07-07 18:27 ` [PATCH v6 2/3] perf sched map: Add support for multiple task names using CSV Madadi Vineeth Reddy
@ 2024-07-07 18:27 ` Madadi Vineeth Reddy
2024-07-12 16:45 ` [PATCH v6 0/3] Introduce --task-name and --fuzzy-name options in perf sched map Namhyung Kim
3 siblings, 0 replies; 5+ messages in thread
From: Madadi Vineeth Reddy @ 2024-07-07 18:27 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Namhyung Kim, Ian Rogers,
Athira Rajeev, Chen Yu
Cc: Peter Zijlstra, Ingo Molnar, Mark Rutland, Alexander Shishkin,
Jiri Olsa, Adrian Hunter, Kan Liang, acme, linux-perf-users,
LKML, Madadi Vineeth Reddy
The --fuzzy-name option can be used if fuzzy name matching is required.
For example, "taskname" can be matched to any string that contains
"taskname" as its substring.
Sample output for --task-name wdav --fuzzy-name
=============
. *A0 . . . . - . 131040.641346 secs A0 => wdavdaemon:62509
. A0 *B0 . . . - . 131040.641378 secs B0 => wdavdaemon:62274
. *- B0 . . . - . 131040.641379 secs
*C0 . B0 . . . . . 131040.641572 secs C0 => wdavdaemon:62283
C0 . B0 . *D0 . . . 131040.641572 secs D0 => wdavdaemon:62277
C0 . B0 . D0 . *E0 . 131040.641578 secs E0 => wdavdaemon:62270
*- . B0 . D0 . E0 . 131040.641581 secs
Suggested-by: Chen Yu <yu.c.chen@intel.com>
Reviewed-and-tested-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Signed-off-by: Madadi Vineeth Reddy <vineethr@linux.ibm.com>
---
tools/perf/Documentation/perf-sched.txt | 3 +++
tools/perf/builtin-sched.c | 20 +++++++++++++-------
2 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/tools/perf/Documentation/perf-sched.txt b/tools/perf/Documentation/perf-sched.txt
index 4f8216ee4a74..84d49f9241b1 100644
--- a/tools/perf/Documentation/perf-sched.txt
+++ b/tools/perf/Documentation/perf-sched.txt
@@ -137,6 +137,9 @@ OPTIONS for 'perf sched map'
task name(s).
('-' indicates other tasks while '.' is idle).
+--fuzzy-name::
+ Given task name(s) can be partially matched (fuzzy matching).
+
OPTIONS for 'perf sched timehist'
---------------------------------
-k::
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
index 7de29c2f3d23..8750b5f2d49b 100644
--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -158,6 +158,7 @@ struct perf_sched_map {
const char *color_cpus_str;
const char *task_name;
struct strlist *task_names;
+ bool fuzzy;
struct perf_cpu_map *cpus;
const char *cpus_str;
};
@@ -1541,12 +1542,16 @@ map__findnew_thread(struct perf_sched *sched, struct machine *machine, pid_t pid
return thread;
}
-static bool sched_match_task(const char *comm_str, struct strlist *task_names)
+static bool sched_match_task(struct perf_sched *sched, const char *comm_str)
{
+ bool fuzzy_match = sched->map.fuzzy;
+ struct strlist *task_names = sched->map.task_names;
struct str_node *node;
strlist__for_each_entry(node, task_names) {
- if (strcmp(comm_str, node->s) == 0)
+ bool match_found = fuzzy_match ? !!strstr(comm_str, node->s) :
+ !strcmp(comm_str, node->s);
+ if (match_found)
return true;
}
@@ -1622,7 +1627,6 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,
const char *color = PERF_COLOR_NORMAL;
char stimestamp[32];
const char *str;
- struct strlist *task_names = sched->map.task_names;
BUG_ON(this_cpu.cpu >= MAX_CPUS || this_cpu.cpu < 0);
@@ -1674,7 +1678,7 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,
*/
tr->shortname[0] = '.';
tr->shortname[1] = ' ';
- } else if (!sched->map.task_name || sched_match_task(str, task_names)) {
+ } else if (!sched->map.task_name || sched_match_task(sched, str)) {
tr->shortname[0] = sched->next_shortname1;
tr->shortname[1] = sched->next_shortname2;
@@ -1703,15 +1707,15 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel,
* Check which of sched_in and sched_out matches the passed --task-name
* arguments and call the corresponding print_sched_map.
*/
- if (sched->map.task_name && !sched_match_task(str, task_names)) {
- if (!sched_match_task(thread__comm_str(sched_out), task_names))
+ if (sched->map.task_name && !sched_match_task(sched, str)) {
+ if (!sched_match_task(sched, thread__comm_str(sched_out)))
goto out;
else
goto sched_out;
} else {
str = thread__comm_str(sched_out);
- if (!(sched->map.task_name && !sched_match_task(str, task_names)))
+ if (!(sched->map.task_name && !sched_match_task(sched, str)))
proceed = 1;
}
@@ -3655,6 +3659,8 @@ int cmd_sched(int argc, const char **argv)
"display given CPUs in map"),
OPT_STRING(0, "task-name", &sched.map.task_name, "task",
"map output only for the given task name(s)."),
+ OPT_BOOLEAN(0, "fuzzy-name", &sched.map.fuzzy,
+ "given command name can be partially matched (fuzzy matching)"),
OPT_PARENT(sched_options)
};
const struct option timehist_options[] = {
--
2.43.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v6 0/3] Introduce --task-name and --fuzzy-name options in perf sched map
2024-07-07 18:27 [PATCH v6 0/3] Introduce --task-name and --fuzzy-name options in perf sched map Madadi Vineeth Reddy
` (2 preceding siblings ...)
2024-07-07 18:27 ` [PATCH v6 3/3] perf sched map: Add --fuzzy-name option for fuzzy matching in task names Madadi Vineeth Reddy
@ 2024-07-12 16:45 ` Namhyung Kim
3 siblings, 0 replies; 5+ messages in thread
From: Namhyung Kim @ 2024-07-12 16:45 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Ian Rogers, Athira Rajeev, Chen Yu,
Madadi Vineeth Reddy
Cc: Peter Zijlstra, Ingo Molnar, Mark Rutland, Alexander Shishkin,
Jiri Olsa, Adrian Hunter, Kan Liang, acme, linux-perf-users,
LKML
On Sun, 07 Jul 2024 23:57:13 +0530, Madadi Vineeth Reddy wrote:
> This patch-set aims to reduce the amount of output printed on the terminal
> when using perf sched map, allowing users to focus only on the tasks of
> interest.
>
> This helps in visualizing how a benchmark or a task is spread over
> the available CPUs while also knowing which CPUs are idle(.) and which
> are not(-). This will be more useful as number of CPUs increase.
>
> [...]
Applied to perf-tools-next, thanks!
Best regards,
Namhyung
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-07-12 16:45 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-07-07 18:27 [PATCH v6 0/3] Introduce --task-name and --fuzzy-name options in perf sched map Madadi Vineeth Reddy
2024-07-07 18:27 ` [PATCH v6 1/3] perf sched map: Add task-name option to filter the output map Madadi Vineeth Reddy
2024-07-07 18:27 ` [PATCH v6 2/3] perf sched map: Add support for multiple task names using CSV Madadi Vineeth Reddy
2024-07-07 18:27 ` [PATCH v6 3/3] perf sched map: Add --fuzzy-name option for fuzzy matching in task names Madadi Vineeth Reddy
2024-07-12 16:45 ` [PATCH v6 0/3] Introduce --task-name and --fuzzy-name options in perf sched map Namhyung Kim
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®