tools/perf/util/perf_api_probe.c
Source file repositories/reference/linux-study-clean/tools/perf/util/perf_api_probe.c
File Facts
- System
- Linux kernel
- Corpus path
tools/perf/util/perf_api_probe.c- Extension
.c- Size
- 4210 bytes
- Lines
- 209
- 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-sys.hutil/cloexec.hutil/evlist.hutil/evsel.hutil/parse-events.hutil/perf_api_probe.hperf/cpumap.herrno.h
Detected Declarations
function perf_do_probe_apifunction perf_probe_apifunction perf_probe_sample_identifierfunction perf_probe_comm_execfunction perf_probe_context_switchfunction perf_probe_text_pokefunction perf_probe_build_idfunction perf_probe_cgroupfunction perf_can_sample_identifierfunction perf_can_comm_execfunction perf_can_record_switch_eventsfunction perf_can_record_text_poke_eventsfunction perf_can_record_cpu_widefunction perf_can_aux_samplefunction perf_can_record_build_idfunction perf_can_record_cgroup
Annotated Snippet
evsel->core.attr.context_switch = 1;
}
static void perf_probe_text_poke(struct evsel *evsel)
{
evsel->core.attr.text_poke = 1;
}
static void perf_probe_build_id(struct evsel *evsel)
{
evsel->core.attr.build_id = 1;
}
static void perf_probe_cgroup(struct evsel *evsel)
{
evsel->core.attr.cgroup = 1;
}
bool perf_can_sample_identifier(void)
{
return perf_probe_api(perf_probe_sample_identifier);
}
bool perf_can_comm_exec(void)
{
return perf_probe_api(perf_probe_comm_exec);
}
bool perf_can_record_switch_events(void)
{
return perf_probe_api(perf_probe_context_switch);
}
bool perf_can_record_text_poke_events(void)
{
return perf_probe_api(perf_probe_text_poke);
}
bool perf_can_record_cpu_wide(void)
{
struct perf_event_attr attr = {
.type = PERF_TYPE_SOFTWARE,
.config = PERF_COUNT_SW_CPU_CLOCK,
.exclude_kernel = 1,
};
struct perf_cpu_map *cpus;
struct perf_cpu cpu;
int fd;
cpus = perf_cpu_map__new_online_cpus();
if (!cpus)
return false;
cpu = perf_cpu_map__cpu(cpus, 0);
perf_cpu_map__put(cpus);
fd = sys_perf_event_open(&attr, -1, cpu.cpu, -1, 0);
if (fd < 0)
return false;
close(fd);
return true;
}
/*
* Architectures are expected to know if AUX area sampling is supported by the
* hardware. Here we check for kernel support.
*/
bool perf_can_aux_sample(void)
{
struct perf_event_attr attr = {
.size = sizeof(struct perf_event_attr),
.exclude_kernel = 1,
/*
* Non-zero value causes the kernel to calculate the effective
* attribute size up to that byte.
*/
.aux_sample_size = 1,
};
int fd;
fd = sys_perf_event_open(&attr, -1, 0, -1, 0);
/*
* If the kernel attribute is big enough to contain aux_sample_size
* then we assume that it is supported. We are relying on the kernel to
* validate the attribute size before anything else that could be wrong.
*/
if (fd < 0 && errno == E2BIG)
return false;
if (fd >= 0)
Annotation
- Immediate include surface: `perf-sys.h`, `util/cloexec.h`, `util/evlist.h`, `util/evsel.h`, `util/parse-events.h`, `util/perf_api_probe.h`, `perf/cpumap.h`, `errno.h`.
- Detected declarations: `function perf_do_probe_api`, `function perf_probe_api`, `function perf_probe_sample_identifier`, `function perf_probe_comm_exec`, `function perf_probe_context_switch`, `function perf_probe_text_poke`, `function perf_probe_build_id`, `function perf_probe_cgroup`, `function perf_can_sample_identifier`, `function perf_can_comm_exec`.
- 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.