mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-28 21:45:01 +08:00
perf events x86: Use function to add missing lock
Switch from loop macro maps__for_each_entry to maps__for_each_map function that takes a callback. The function holds the maps lock, which should be held during iteration. 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: Athira Rajeev <atrajeev@linux.vnet.ibm.com> Cc: Changbin Du <changbin.du@huawei.com> Cc: Colin Ian King <colin.i.king@gmail.com> Cc: Dmitrii Dolgov <9erthalion6@gmail.com> Cc: German Gomez <german.gomez@arm.com> Cc: Guilherme Amadio <amadio@gentoo.org> Cc: Huacai Chen <chenhuacai@kernel.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@arm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: K Prateek Nayak <kprateek.nayak@amd.com> Cc: Kajol Jain <kjain@linux.ibm.com> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Leo Yan <leo.yan@linaro.org> Cc: Li Dong <lidong@vivo.com> Cc: Liam Howlett <liam.howlett@oracle.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Miguel Ojeda <ojeda@kernel.org> Cc: Ming Wang <wangming01@loongson.cn> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Nick Terrell <terrelln@fb.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ravi Bangoria <ravi.bangoria@amd.com> Cc: Sandipan Das <sandipan.das@amd.com> Cc: Sean Christopherson <seanjc@google.com> Cc: Steinar H. Gunderson <sesse@google.com> Cc: Vincent Whitchurch <vincent.whitchurch@axis.com> Cc: Wenyu Liu <liuwenyu7@huawei.com> Cc: Yang Jihong <yangjihong1@huawei.com> Link: https://lore.kernel.org/r/20231207011722.1220634-4-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
19b5bd9a59
commit
bc4bc56d9d
@ -14,66 +14,79 @@
|
||||
|
||||
#if defined(__x86_64__)
|
||||
|
||||
struct perf_event__synthesize_extra_kmaps_cb_args {
|
||||
struct perf_tool *tool;
|
||||
perf_event__handler_t process;
|
||||
struct machine *machine;
|
||||
union perf_event *event;
|
||||
};
|
||||
|
||||
static int perf_event__synthesize_extra_kmaps_cb(struct map *map, void *data)
|
||||
{
|
||||
struct perf_event__synthesize_extra_kmaps_cb_args *args = data;
|
||||
union perf_event *event = args->event;
|
||||
struct kmap *kmap;
|
||||
size_t size;
|
||||
|
||||
if (!__map__is_extra_kernel_map(map))
|
||||
return 0;
|
||||
|
||||
kmap = map__kmap(map);
|
||||
|
||||
size = sizeof(event->mmap) - sizeof(event->mmap.filename) +
|
||||
PERF_ALIGN(strlen(kmap->name) + 1, sizeof(u64)) +
|
||||
args->machine->id_hdr_size;
|
||||
|
||||
memset(event, 0, size);
|
||||
|
||||
event->mmap.header.type = PERF_RECORD_MMAP;
|
||||
|
||||
/*
|
||||
* kernel uses 0 for user space maps, see kernel/perf_event.c
|
||||
* __perf_event_mmap
|
||||
*/
|
||||
if (machine__is_host(args->machine))
|
||||
event->header.misc = PERF_RECORD_MISC_KERNEL;
|
||||
else
|
||||
event->header.misc = PERF_RECORD_MISC_GUEST_KERNEL;
|
||||
|
||||
event->mmap.header.size = size;
|
||||
|
||||
event->mmap.start = map__start(map);
|
||||
event->mmap.len = map__size(map);
|
||||
event->mmap.pgoff = map__pgoff(map);
|
||||
event->mmap.pid = args->machine->pid;
|
||||
|
||||
strlcpy(event->mmap.filename, kmap->name, PATH_MAX);
|
||||
|
||||
if (perf_tool__process_synth_event(args->tool, event, args->machine, args->process) != 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int perf_event__synthesize_extra_kmaps(struct perf_tool *tool,
|
||||
perf_event__handler_t process,
|
||||
struct machine *machine)
|
||||
{
|
||||
int rc = 0;
|
||||
struct map_rb_node *pos;
|
||||
int rc;
|
||||
struct maps *kmaps = machine__kernel_maps(machine);
|
||||
union perf_event *event = zalloc(sizeof(event->mmap) +
|
||||
machine->id_hdr_size);
|
||||
struct perf_event__synthesize_extra_kmaps_cb_args args = {
|
||||
.tool = tool,
|
||||
.process = process,
|
||||
.machine = machine,
|
||||
.event = zalloc(sizeof(args.event->mmap) + machine->id_hdr_size),
|
||||
};
|
||||
|
||||
if (!event) {
|
||||
if (!args.event) {
|
||||
pr_debug("Not enough memory synthesizing mmap event "
|
||||
"for extra kernel maps\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
maps__for_each_entry(kmaps, pos) {
|
||||
struct kmap *kmap;
|
||||
size_t size;
|
||||
struct map *map = pos->map;
|
||||
rc = maps__for_each_map(kmaps, perf_event__synthesize_extra_kmaps_cb, &args);
|
||||
|
||||
if (!__map__is_extra_kernel_map(map))
|
||||
continue;
|
||||
|
||||
kmap = map__kmap(map);
|
||||
|
||||
size = sizeof(event->mmap) - sizeof(event->mmap.filename) +
|
||||
PERF_ALIGN(strlen(kmap->name) + 1, sizeof(u64)) +
|
||||
machine->id_hdr_size;
|
||||
|
||||
memset(event, 0, size);
|
||||
|
||||
event->mmap.header.type = PERF_RECORD_MMAP;
|
||||
|
||||
/*
|
||||
* kernel uses 0 for user space maps, see kernel/perf_event.c
|
||||
* __perf_event_mmap
|
||||
*/
|
||||
if (machine__is_host(machine))
|
||||
event->header.misc = PERF_RECORD_MISC_KERNEL;
|
||||
else
|
||||
event->header.misc = PERF_RECORD_MISC_GUEST_KERNEL;
|
||||
|
||||
event->mmap.header.size = size;
|
||||
|
||||
event->mmap.start = map__start(map);
|
||||
event->mmap.len = map__size(map);
|
||||
event->mmap.pgoff = map__pgoff(map);
|
||||
event->mmap.pid = machine->pid;
|
||||
|
||||
strlcpy(event->mmap.filename, kmap->name, PATH_MAX);
|
||||
|
||||
if (perf_tool__process_synth_event(tool, event, machine,
|
||||
process) != 0) {
|
||||
rc = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
free(event);
|
||||
free(args.event);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user