perf kmem: Support legacy tracepoints

Commit 11e9734bcb ("mm/slab_common: unify NUMA and UMA version of
tracepoints") removed tracepoints 'kmalloc_node' and
'kmem_cache_alloc_node', we need to consider the tool should be backward
compatible.

If it detect the tracepoint "kmem:kmalloc_node", this patch enables the
legacy tracepoints, otherwise, it will ignore them.

Fixes: 11e9734bcb ("mm/slab_common: unify NUMA and UMA version of tracepoints")
Reported-by: Ravi Bangoria <ravi.bangoria@amd.com>
Reviewed-by: James Clark <james.clark@arm.com>
Signed-off-by: Leo Yan <leo.yan@linaro.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Hyeonggon Yoo <42.hyeyoo@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Vlastimil Babka <vbabka@suse.cz>
Link: https://lore.kernel.org/r/20230108062400.250690-1-leo.yan@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Leo Yan 2023-01-08 14:23:59 +08:00 committed by Arnaldo Carvalho de Melo
parent d891f2b724
commit b3719108ae

View File

@ -1824,6 +1824,19 @@ static int parse_line_opt(const struct option *opt __maybe_unused,
return 0;
}
static bool slab_legacy_tp_is_exposed(void)
{
/*
* The tracepoints "kmem:kmalloc_node" and
* "kmem:kmem_cache_alloc_node" have been removed on the latest
* kernel, if the tracepoint "kmem:kmalloc_node" is existed it
* means the tool is running on an old kernel, we need to
* rollback to support these legacy tracepoints.
*/
return IS_ERR(trace_event__tp_format("kmem", "kmalloc_node")) ?
false : true;
}
static int __cmd_record(int argc, const char **argv)
{
const char * const record_args[] = {
@ -1831,22 +1844,28 @@ static int __cmd_record(int argc, const char **argv)
};
const char * const slab_events[] = {
"-e", "kmem:kmalloc",
"-e", "kmem:kmalloc_node",
"-e", "kmem:kfree",
"-e", "kmem:kmem_cache_alloc",
"-e", "kmem:kmem_cache_alloc_node",
"-e", "kmem:kmem_cache_free",
};
const char * const slab_legacy_events[] = {
"-e", "kmem:kmalloc_node",
"-e", "kmem:kmem_cache_alloc_node",
};
const char * const page_events[] = {
"-e", "kmem:mm_page_alloc",
"-e", "kmem:mm_page_free",
};
unsigned int rec_argc, i, j;
const char **rec_argv;
unsigned int slab_legacy_tp_exposed = slab_legacy_tp_is_exposed();
rec_argc = ARRAY_SIZE(record_args) + argc - 1;
if (kmem_slab)
if (kmem_slab) {
rec_argc += ARRAY_SIZE(slab_events);
if (slab_legacy_tp_exposed)
rec_argc += ARRAY_SIZE(slab_legacy_events);
}
if (kmem_page)
rec_argc += ARRAY_SIZE(page_events) + 1; /* for -g */
@ -1861,6 +1880,10 @@ static int __cmd_record(int argc, const char **argv)
if (kmem_slab) {
for (j = 0; j < ARRAY_SIZE(slab_events); j++, i++)
rec_argv[i] = strdup(slab_events[j]);
if (slab_legacy_tp_exposed) {
for (j = 0; j < ARRAY_SIZE(slab_legacy_events); j++, i++)
rec_argv[i] = strdup(slab_legacy_events[j]);
}
}
if (kmem_page) {
rec_argv[i++] = strdup("-g");