brintos

brintos / linux-shallow public Read only

0
0
Text · 1.7 KiB · f193998 Raw
79 lines · c
1// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)2// Copyright (c) 2021 Facebook3#include "vmlinux.h"4#include <bpf/bpf_helpers.h>5#include <bpf/bpf_tracing.h>6#include "bperf_u.h"7 8struct {9	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);10	__uint(key_size, sizeof(__u32));11	__uint(value_size, sizeof(struct bpf_perf_event_value));12	__uint(max_entries, 1);13} diff_readings SEC(".maps");14 15struct {16	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);17	__uint(key_size, sizeof(__u32));18	__uint(value_size, sizeof(struct bpf_perf_event_value));19	__uint(max_entries, 1);20} accum_readings SEC(".maps");21 22struct {23	__uint(type, BPF_MAP_TYPE_HASH);24	__uint(key_size, sizeof(__u32));25	__uint(value_size, sizeof(__u32));26} filter SEC(".maps");27 28enum bperf_filter_type type = 0;29int enabled = 0;30 31SEC("fexit/XXX")32int BPF_PROG(fexit_XXX)33{34	struct bpf_perf_event_value *diff_val, *accum_val;35	__u32 filter_key, zero = 0;36	__u32 *accum_key;37 38	if (!enabled)39		return 0;40 41	switch (type) {42	case BPERF_FILTER_GLOBAL:43		accum_key = &zero;44		goto do_add;45	case BPERF_FILTER_CPU:46		filter_key = bpf_get_smp_processor_id();47		break;48	case BPERF_FILTER_PID:49		filter_key = bpf_get_current_pid_tgid() & 0xffffffff;50		break;51	case BPERF_FILTER_TGID:52		filter_key = bpf_get_current_pid_tgid() >> 32;53		break;54	default:55		return 0;56	}57 58	accum_key = bpf_map_lookup_elem(&filter, &filter_key);59	if (!accum_key)60		return 0;61 62do_add:63	diff_val = bpf_map_lookup_elem(&diff_readings, &zero);64	if (!diff_val)65		return 0;66 67	accum_val = bpf_map_lookup_elem(&accum_readings, accum_key);68	if (!accum_val)69		return 0;70 71	accum_val->counter += diff_val->counter;72	accum_val->enabled += diff_val->enabled;73	accum_val->running += diff_val->running;74 75	return 0;76}77 78char LICENSE[] SEC("license") = "Dual BSD/GPL";79