tools/perf/util/build-id.c
Source file repositories/reference/linux-study-clean/tools/perf/util/build-id.c
File Facts
- System
- Linux kernel
- Corpus path
tools/perf/util/build-id.c- Extension
.c- Size
- 23420 bytes
- Lines
- 981
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
util.hdirent.herrno.hstdio.hsys/stat.hsys/types.hutil/copyfile.hdso.hbuild-id.hevent.hnamespaces.hmap.hsymbol.hthread.hlinux/kernel.hdebug.hsession.htool.hheader.hvdso.hpath.hprobe-file.hstrlist.helfutils/debuginfod.hlinux/ctype.hlinux/zalloc.hlinux/string.hasm/bug.h
Detected Declarations
struct machine__write_buildid_table_cb_argsfunction mark_dso_hit_callbackfunction build_id__mark_dso_hitfunction build_id__snprintffunction sysfs__snprintf_build_idfunction filename__snprintf_build_idfunction asnprintffunction build_id_cache__valid_idfunction write_buildidfunction machine__write_buildid_table_cbfunction machine__write_buildid_tablefunction perf_session__write_buildid_tablefunction disable_buildid_cachefunction lsdir_bid_head_filterfunction lsdir_bid_tail_filterfunction strlist__for_each_entryfunction strlist__for_each_entryfunction str_is_build_idfunction strlist__for_each_entryfunction build_id_cache__list_build_idsfunction build_id_cache__add_sdt_cachefunction build_id_cache__addfunction build_id_cache__basenamefunction strncmpfunction __build_id_cache__add_sfunction build_id_cache__add_bfunction build_id_cache__cachedfunction build_id_cache__remove_sfunction filename__read_build_id_nsfunction dso__build_id_mismatchfunction dso__cache_build_idfunction machines__for_each_dsofunction __perf_session__cache_build_idsfunction perf_session__cache_build_idsfunction machine__read_build_idsfunction perf_session__read_build_idsfunction build_id__initfunction build_id__is_defined
Annotated Snippet
struct machine__write_buildid_table_cb_args {
struct machine *machine;
struct feat_fd *fd;
u16 kmisc, umisc;
};
static int machine__write_buildid_table_cb(struct dso *dso, void *data)
{
struct machine__write_buildid_table_cb_args *args = data;
const char *name;
size_t name_len;
bool in_kernel = false;
if (!dso__has_build_id(dso))
return 0;
if (!dso__hit(dso) && !dso__is_vdso(dso))
return 0;
if (dso__is_vdso(dso)) {
name = dso__short_name(dso);
name_len = dso__short_name_len(dso);
} else if (dso__is_kcore(dso)) {
name = args->machine->mmap_name;
name_len = strlen(name);
} else {
name = dso__long_name(dso);
name_len = dso__long_name_len(dso);
}
in_kernel = dso__kernel(dso) || is_kernel_module(name, PERF_RECORD_MISC_CPUMODE_UNKNOWN);
return write_buildid(name, name_len, &dso__id(dso)->build_id, args->machine->pid,
in_kernel ? args->kmisc : args->umisc, args->fd);
}
static int machine__write_buildid_table(struct machine *machine, struct feat_fd *fd)
{
struct machine__write_buildid_table_cb_args args = {
.machine = machine,
.fd = fd,
.kmisc = PERF_RECORD_MISC_KERNEL,
.umisc = PERF_RECORD_MISC_USER,
};
if (!machine__is_host(machine)) {
args.kmisc = PERF_RECORD_MISC_GUEST_KERNEL;
args.umisc = PERF_RECORD_MISC_GUEST_USER;
}
return dsos__for_each_dso(&machine->dsos, machine__write_buildid_table_cb, &args);
}
int perf_session__write_buildid_table(struct perf_session *session,
struct feat_fd *fd)
{
struct rb_node *nd;
int err = machine__write_buildid_table(&session->machines.host, fd);
if (err)
return err;
for (nd = rb_first_cached(&session->machines.guests); nd;
nd = rb_next(nd)) {
struct machine *pos = rb_entry(nd, struct machine, rb_node);
err = machine__write_buildid_table(pos, fd);
if (err)
break;
}
return err;
}
void disable_buildid_cache(void)
{
no_buildid_cache = true;
}
static bool lsdir_bid_head_filter(const char *name __maybe_unused,
struct dirent *d)
{
return (strlen(d->d_name) == 2) &&
isxdigit(d->d_name[0]) && isxdigit(d->d_name[1]);
}
static bool lsdir_bid_tail_filter(const char *name __maybe_unused,
struct dirent *d)
{
int i = 0;
while (isxdigit(d->d_name[i]) && i < SBUILD_ID_SIZE - 3)
i++;
return (i >= SBUILD_ID_MIN_SIZE - 3) && (i <= SBUILD_ID_SIZE - 3) &&
Annotation
- Immediate include surface: `util.h`, `dirent.h`, `errno.h`, `stdio.h`, `sys/stat.h`, `sys/types.h`, `util/copyfile.h`, `dso.h`.
- Detected declarations: `struct machine__write_buildid_table_cb_args`, `function mark_dso_hit_callback`, `function build_id__mark_dso_hit`, `function build_id__snprintf`, `function sysfs__snprintf_build_id`, `function filename__snprintf_build_id`, `function asnprintf`, `function build_id_cache__valid_id`, `function write_buildid`, `function machine__write_buildid_table_cb`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.