tools/perf/util/bpf_counter_cgroup.c
Source file repositories/reference/linux-study-clean/tools/perf/util/bpf_counter_cgroup.c
File Facts
- System
- Linux kernel
- Corpus path
tools/perf/util/bpf_counter_cgroup.c- Extension
.c- Size
- 7894 bytes
- Lines
- 332
- 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
assert.herrno.hlimits.hunistd.hsys/file.hsys/time.hsys/resource.hlinux/err.hlinux/perf_event.hapi/fs/fs.hbpf/bpf.hperf/bpf_perf.haffinity.hbpf_counter.hcgroup.hcounts.hdebug.hevsel.hevlist.htarget.hcpumap.hthread_map.hbpf_skel/bperf_cgroup.hbpf_skel/bperf_cgroup.skel.h
Detected Declarations
function setup_rodatafunction test_max_events_program_loadfunction bperf_load_programfunction perf_cpu_map__for_each_cpufunction evlist__for_each_entryfunction perf_cpu_map__for_each_cpufunction bperf_cgrp__loadfunction bperf_cgrp__install_pefunction bperf_cgrp__sync_countersfunction bperf_cgrp__enablefunction bperf_cgrp__disablefunction bperf_cgrp__readfunction evlist__for_each_entryfunction perf_cpu_map__for_each_cpufunction bperf_cgrp__destroy
Annotated Snippet
if (IS_ERR(link)) {
pr_err("Failed to attach cgroup program\n");
err = PTR_ERR(link);
goto out;
}
}
/*
* Update cgrp_idx map from cgroup-id to event index.
*/
cgrp = NULL;
i = 0;
evlist__for_each_entry(evlist, evsel) {
if (cgrp == NULL || evsel->cgrp == leader_cgrp) {
unsigned int j;
leader_cgrp = evsel->cgrp;
evsel->cgrp = NULL;
/* open single copy of the events w/o cgroup */
err = evsel__open_per_cpu(evsel, evsel->core.cpus, -1);
if (err == 0)
evsel->supported = true;
map_fd = bpf_map__fd(skel->maps.events);
perf_cpu_map__for_each_cpu(cpu, j, evsel->core.cpus) {
int fd = FD(evsel, j);
__u32 idx = evsel->core.idx * total_cpus + cpu.cpu;
bpf_map_update_elem(map_fd, &idx, &fd, BPF_ANY);
}
evsel->cgrp = leader_cgrp;
}
if (evsel->cgrp == cgrp)
continue;
cgrp = evsel->cgrp;
if (read_cgroup_id(cgrp) < 0) {
pr_debug("Failed to get cgroup id for %s\n", cgrp->name);
cgrp->id = 0;
}
map_fd = bpf_map__fd(skel->maps.cgrp_idx);
err = bpf_map_update_elem(map_fd, &cgrp->id, &i, BPF_ANY);
if (err < 0) {
pr_err("Failed to update cgroup index map\n");
goto out;
}
i++;
}
/*
* bperf uses BPF_PROG_TEST_RUN to get accurate reading. Check
* whether the kernel support it
*/
prog_fd = bpf_program__fd(skel->progs.trigger_read);
err = bperf_trigger_reading(prog_fd, 0);
if (err) {
pr_warning("The kernel does not support test_run for raw_tp BPF programs.\n"
"Therefore, --for-each-cgroup might show inaccurate readings\n");
err = 0;
}
out:
return err;
}
static int bperf_cgrp__load(struct evsel *evsel,
struct target *target __maybe_unused)
{
static bool bperf_loaded = false;
evsel->bperf_leader_prog_fd = -1;
evsel->bperf_leader_link_fd = -1;
if (!bperf_loaded && bperf_load_program(evsel->evlist))
return -1;
bperf_loaded = true;
/* just to bypass bpf_counter_skip() */
evsel->follower_skel = (struct bperf_follower_bpf *)skel;
return 0;
}
Annotation
- Immediate include surface: `assert.h`, `errno.h`, `limits.h`, `unistd.h`, `sys/file.h`, `sys/time.h`, `sys/resource.h`, `linux/err.h`.
- Detected declarations: `function setup_rodata`, `function test_max_events_program_load`, `function bperf_load_program`, `function perf_cpu_map__for_each_cpu`, `function evlist__for_each_entry`, `function perf_cpu_map__for_each_cpu`, `function bperf_cgrp__load`, `function bperf_cgrp__install_pe`, `function bperf_cgrp__sync_counters`, `function bperf_cgrp__enable`.
- 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.