tools/perf/util/bpf_skel/func_latency.bpf.c

Source file repositories/reference/linux-study-clean/tools/perf/util/bpf_skel/func_latency.bpf.c

File Facts

System
Linux kernel
Corpus path
tools/perf/util/bpf_skel/func_latency.bpf.c
Extension
.c
Size
3767 bytes
Lines
200
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

if (min_latency > 0) {
			if (val > min_latency)
				val -= min_latency;
			else
				goto do_lookup;
		}

		// Less than 1 unit (ms or ns), or, in the future,
		// than the min latency desired.
		if (val > 0) { // 1st entry: [ 1 unit .. bucket_range units )
			key = val / bucket_range + 1;
			if (key >= bucket_num)
				key = bucket_num - 1;
		}

		goto do_lookup;
	}
	// calculate index using delta
	for (key = 0; key < (bucket_num - 1); key++) {
		if (delta < (cmp_base << key))
			break;
	}

do_lookup:
	hist = bpf_map_lookup_elem(&latency, &key);
	if (!hist)
		return;

	__sync_fetch_and_add(hist, 1);

	__sync_fetch_and_add(&total, delta); // always in nsec
	__sync_fetch_and_add(&count, 1);

	if (delta > max)
		max = delta;
	if (delta < min)
		min = delta;
}

SEC("kprobe/func")
int BPF_PROG(func_begin)
{
	__u64 key, now;

	if (!enabled || !can_record())
		return 0;

	key = bpf_get_current_pid_tgid();
	now = bpf_ktime_get_ns();

	// overwrite timestamp for nested functions
	bpf_map_update_elem(&functime, &key, &now, BPF_ANY);
	return 0;
}

SEC("kretprobe/func")
int BPF_PROG(func_end)
{
	__u64 tid;
	__u64 *start;

	if (!enabled)
		return 0;

	tid = bpf_get_current_pid_tgid();

	start = bpf_map_lookup_elem(&functime, &tid);
	if (start) {
		update_latency(bpf_ktime_get_ns() - *start);
		bpf_map_delete_elem(&functime, &tid);
	}

	return 0;
}

SEC("raw_tp")
int BPF_PROG(event_begin)
{
	__u64 key, now;

	if (!enabled || !can_record())
		return 0;

	key = bpf_get_current_pid_tgid();
	now = bpf_ktime_get_ns();

	// overwrite timestamp for nested events
	bpf_map_update_elem(&functime, &key, &now, BPF_ANY);
	return 0;
}

Annotation

Implementation Notes