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.

Dependency Surface

Detected Declarations

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

Implementation Notes