Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit afeb5270 authored by Daniel Borkmann's avatar Daniel Borkmann Committed by ivanmeler
Browse files

bpf, trace: add BPF_F_CURRENT_CPU flag for bpf_perf_event_read



Follow-up commit to 1e33759c788c ("bpf, trace: add BPF_F_CURRENT_CPU
flag for bpf_perf_event_output") to add the same functionality into
bpf_perf_event_read() helper. The split of index into flags and index
component is also safe here, since such large maps are rejected during
map allocation time.

Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 10e53323
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -586,7 +586,7 @@ enum bpf_func_id {
#define BPF_F_FAST_STACK_CMP		(1ULL << 9)
#define BPF_F_REUSE_STACKID		(1ULL << 10)

/* BPF_FUNC_perf_event_output flags. */
/* BPF_FUNC_perf_event_output flags and BPF_FUNC_perf_event_read. */
#define BPF_F_INDEX_MASK		0xffffffffULL
#define BPF_F_CURRENT_CPU		BPF_F_INDEX_MASK
/* BPF_FUNC_perf_event_output for sk_buff input context. */
+7 −2
Original line number Diff line number Diff line
@@ -246,9 +246,15 @@ const struct bpf_func_proto *bpf_get_trace_printk_proto(void)
BPF_CALL_2(bpf_perf_event_read, struct bpf_map *, map, u64, flags)
{
	struct bpf_array *array = container_of(map, struct bpf_array, map);
	unsigned int cpu = smp_processor_id();
	u64 index = flags & BPF_F_INDEX_MASK;
	struct bpf_event_entry *ee;
	struct perf_event *event;

	if (unlikely(flags & ~(BPF_F_INDEX_MASK)))
		return -EINVAL;
	if (index == BPF_F_CURRENT_CPU)
		index = cpu;
	if (unlikely(index >= array->map.max_entries))
		return -E2BIG;

@@ -262,8 +268,7 @@ BPF_CALL_2(bpf_perf_event_read, struct bpf_map *, map, u64, flags)
		return -EINVAL;

	/* make sure event is local and doesn't have pmu::count */
	if (event->oncpu != smp_processor_id() ||
	    event->pmu->count)
	if (unlikely(event->oncpu != cpu || event->pmu->count))
		return -EINVAL;

	if (unlikely(event->attr.type != PERF_TYPE_HARDWARE &&