tools/lib/perf/evlist.c
Source file repositories/reference/linux-study-clean/tools/lib/perf/evlist.c
File Facts
- System
- Linux kernel
- Corpus path
tools/lib/perf/evlist.c- Extension
.c- Size
- 21163 bytes
- Lines
- 841
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
perf/evlist.hperf/evsel.hlinux/bitops.hlinux/list.hlinux/hash.hsys/ioctl.hinternal/evlist.hinternal/evsel.hinternal/xyarray.hinternal/mmap.hinternal/cpumap.hinternal/threadmap.hinternal/lib.hlinux/zalloc.hstdlib.herrno.hunistd.hfcntl.hsignal.hpoll.hsys/mman.hperf/cpumap.hperf/threadmap.hapi/fd/array.hinternal.h
Detected Declarations
function perf_evlist__initfunction __perf_evlist__propagate_mapsfunction CPUfunction perf_evlist__propagate_mapsfunction list_for_each_entry_safefunction perf_evlist__addfunction perf_evlist__removefunction perf_evlist__nextfunction perf_evlist__purgefunction perf_evlist__for_each_entry_safefunction perf_evlist__exitfunction perf_evlist__deletefunction perf_evlist__set_mapsfunction perf_evlist__openfunction perf_evlist__for_each_entryfunction perf_evlist__closefunction perf_evlist__enablefunction perf_evlist__disablefunction perf_evlist__read_formatfunction perf_evlist__id_hashfunction perf_evlist__reset_id_hashfunction perf_evlist__id_addfunction perf_evlist__id_add_fdfunction perf_evlist__alloc_pollfdfunction perf_evlist__for_each_entryfunction perf_evlist__add_pollfdfunction perf_evlist__munmap_filteredfunction perf_evlist__filter_pollfdfunction perf_evlist__pollfunction perf_evlist__alloc_mmapfunction perf_evsel__set_sid_idxfunction perf_evlist__mmap_cb_getfunction perf_evlist__mmap_cb_mmapfunction perf_evlist__set_mmap_firstfunction mmap_per_evselfunction perf_evlist__for_each_entryfunction mmap_per_threadfunction mmap_per_cpufunction perf_evlist__nr_mmapsfunction perf_evlist__mmap_opsfunction perf_evlist__for_each_entryfunction perf_evlist__mmapfunction perf_evlist__munmapfunction perf_evlist__next_mmapfunction __perf_evlist__set_leaderfunction __perf_evlist__for_each_entryfunction perf_evlist__set_leaderfunction perf_evlist__nr_groups
Annotated Snippet
if (perf_cpu_map__is_empty(evsel->pmu_cpus)) {
/*
* Assume the unset PMU cpus were for a system-wide
* event, like a software or tracepoint.
*/
evsel->pmu_cpus = perf_cpu_map__new_online_cpus();
}
if (evlist->has_user_cpus && !evsel->system_wide) {
/*
* Use the user CPUs unless the evsel is set to be
* system wide, such as the dummy event.
*/
evsel->cpus = perf_cpu_map__get(evlist->user_requested_cpus);
} else {
/*
* System wide and other modes, assume the cpu map
* should be set to all PMU CPUs.
*/
evsel->cpus = perf_cpu_map__get(evsel->pmu_cpus);
}
}
/*
* Avoid "any CPU"(-1) for uncore and PMUs that require a CPU, even if
* requested.
*/
if (evsel->requires_cpu && perf_cpu_map__has_any_cpu(evsel->cpus)) {
perf_cpu_map__put(evsel->cpus);
evsel->cpus = perf_cpu_map__get(evsel->pmu_cpus);
}
/*
* Globally requested CPUs replace user requested unless the evsel is
* set to be system wide.
*/
if (evlist->has_user_cpus && !evsel->system_wide) {
assert(!perf_cpu_map__has_any_cpu(evlist->user_requested_cpus));
if (!perf_cpu_map__equal(evsel->cpus, evlist->user_requested_cpus)) {
perf_cpu_map__put(evsel->cpus);
evsel->cpus = perf_cpu_map__get(evlist->user_requested_cpus);
}
}
/* Ensure cpus only references valid PMU CPUs. */
if (!perf_cpu_map__has_any_cpu(evsel->cpus) &&
!perf_cpu_map__is_subset(evsel->pmu_cpus, evsel->cpus)) {
struct perf_cpu_map *tmp = perf_cpu_map__intersect(evsel->pmu_cpus, evsel->cpus);
perf_cpu_map__put(evsel->cpus);
evsel->cpus = tmp;
}
/*
* Was event requested on all the PMU's CPUs but the user requested is
* any CPU (-1)? If so switch to using any CPU (-1) to reduce the number
* of events.
*/
if (!evsel->system_wide &&
!evsel->requires_cpu &&
perf_cpu_map__equal(evsel->cpus, evsel->pmu_cpus) &&
perf_cpu_map__has_any_cpu(evlist->user_requested_cpus)) {
perf_cpu_map__put(evsel->cpus);
evsel->cpus = perf_cpu_map__get(evlist->user_requested_cpus);
}
/*
* Tool events may only read on the first CPU index to avoid double
* counting things like duration_time. Make the evsel->cpus contain just
* that single entry otherwise we may spend time changing affinity to
* CPUs that just have tool events, etc.
*/
if (evsel->reads_only_on_cpu_idx0 && perf_cpu_map__nr(evsel->cpus) > 0) {
struct perf_cpu_map *srcs[3] = {
evlist->all_cpus,
evlist->user_requested_cpus,
evsel->pmu_cpus,
};
for (size_t i = 0; i < ARRAY_SIZE(srcs); i++) {
if (!srcs[i])
continue;
perf_cpu_map__put(evsel->cpus);
evsel->cpus = perf_cpu_map__new_int(perf_cpu_map__cpu(srcs[i], 0).cpu);
break;
}
}
/* Sanity check assert before the evsel is potentially removed. */
assert(!evsel->requires_cpu || !perf_cpu_map__has_any_cpu(evsel->cpus));
/*
Annotation
- Immediate include surface: `perf/evlist.h`, `perf/evsel.h`, `linux/bitops.h`, `linux/list.h`, `linux/hash.h`, `sys/ioctl.h`, `internal/evlist.h`, `internal/evsel.h`.
- Detected declarations: `function perf_evlist__init`, `function __perf_evlist__propagate_maps`, `function CPU`, `function perf_evlist__propagate_maps`, `function list_for_each_entry_safe`, `function perf_evlist__add`, `function perf_evlist__remove`, `function perf_evlist__next`, `function perf_evlist__purge`, `function perf_evlist__for_each_entry_safe`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.