xref: /aosp_15_r20/external/bcc/libbpf-tools/bitesize.bpf.c (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0
2*387f9dfdSAndroid Build Coastguard Worker // Copyright (c) 2020 Wenbo Zhang
3*387f9dfdSAndroid Build Coastguard Worker #include <vmlinux.h>
4*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_helpers.h>
5*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_tracing.h>
6*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_core_read.h>
7*387f9dfdSAndroid Build Coastguard Worker #include "bitesize.h"
8*387f9dfdSAndroid Build Coastguard Worker #include "bits.bpf.h"
9*387f9dfdSAndroid Build Coastguard Worker #include "core_fixes.bpf.h"
10*387f9dfdSAndroid Build Coastguard Worker 
11*387f9dfdSAndroid Build Coastguard Worker const volatile char targ_comm[TASK_COMM_LEN] = {};
12*387f9dfdSAndroid Build Coastguard Worker const volatile bool filter_dev = false;
13*387f9dfdSAndroid Build Coastguard Worker const volatile __u32 targ_dev = 0;
14*387f9dfdSAndroid Build Coastguard Worker 
15*387f9dfdSAndroid Build Coastguard Worker extern __u32 LINUX_KERNEL_VERSION __kconfig;
16*387f9dfdSAndroid Build Coastguard Worker 
17*387f9dfdSAndroid Build Coastguard Worker struct {
18*387f9dfdSAndroid Build Coastguard Worker 	__uint(type, BPF_MAP_TYPE_HASH);
19*387f9dfdSAndroid Build Coastguard Worker 	__uint(max_entries, 10240);
20*387f9dfdSAndroid Build Coastguard Worker 	__type(key, struct hist_key);
21*387f9dfdSAndroid Build Coastguard Worker 	__type(value, struct hist);
22*387f9dfdSAndroid Build Coastguard Worker } hists SEC(".maps");
23*387f9dfdSAndroid Build Coastguard Worker 
24*387f9dfdSAndroid Build Coastguard Worker static struct hist initial_hist;
25*387f9dfdSAndroid Build Coastguard Worker 
comm_allowed(const char * comm)26*387f9dfdSAndroid Build Coastguard Worker static __always_inline bool comm_allowed(const char *comm)
27*387f9dfdSAndroid Build Coastguard Worker {
28*387f9dfdSAndroid Build Coastguard Worker 	int i;
29*387f9dfdSAndroid Build Coastguard Worker 
30*387f9dfdSAndroid Build Coastguard Worker 	for (i = 0; targ_comm[i] != '\0' && i < TASK_COMM_LEN; i++) {
31*387f9dfdSAndroid Build Coastguard Worker 		if (comm[i] != targ_comm[i])
32*387f9dfdSAndroid Build Coastguard Worker 			return false;
33*387f9dfdSAndroid Build Coastguard Worker 	}
34*387f9dfdSAndroid Build Coastguard Worker 	return true;
35*387f9dfdSAndroid Build Coastguard Worker }
36*387f9dfdSAndroid Build Coastguard Worker 
trace_rq_issue(struct request * rq)37*387f9dfdSAndroid Build Coastguard Worker static int trace_rq_issue(struct request *rq)
38*387f9dfdSAndroid Build Coastguard Worker {
39*387f9dfdSAndroid Build Coastguard Worker 	struct hist_key hkey;
40*387f9dfdSAndroid Build Coastguard Worker 	struct hist *histp;
41*387f9dfdSAndroid Build Coastguard Worker 	u64 slot;
42*387f9dfdSAndroid Build Coastguard Worker 
43*387f9dfdSAndroid Build Coastguard Worker 	if (filter_dev) {
44*387f9dfdSAndroid Build Coastguard Worker 		struct gendisk *disk = get_disk(rq);
45*387f9dfdSAndroid Build Coastguard Worker 		u32 dev;
46*387f9dfdSAndroid Build Coastguard Worker 
47*387f9dfdSAndroid Build Coastguard Worker 		dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
48*387f9dfdSAndroid Build Coastguard Worker 				BPF_CORE_READ(disk, first_minor)) : 0;
49*387f9dfdSAndroid Build Coastguard Worker 		if (targ_dev != dev)
50*387f9dfdSAndroid Build Coastguard Worker 			return 0;
51*387f9dfdSAndroid Build Coastguard Worker 	}
52*387f9dfdSAndroid Build Coastguard Worker 	bpf_get_current_comm(&hkey.comm, sizeof(hkey.comm));
53*387f9dfdSAndroid Build Coastguard Worker 	if (!comm_allowed(hkey.comm))
54*387f9dfdSAndroid Build Coastguard Worker 		return 0;
55*387f9dfdSAndroid Build Coastguard Worker 
56*387f9dfdSAndroid Build Coastguard Worker 	histp = bpf_map_lookup_elem(&hists, &hkey);
57*387f9dfdSAndroid Build Coastguard Worker 	if (!histp) {
58*387f9dfdSAndroid Build Coastguard Worker 		bpf_map_update_elem(&hists, &hkey, &initial_hist, 0);
59*387f9dfdSAndroid Build Coastguard Worker 		histp = bpf_map_lookup_elem(&hists, &hkey);
60*387f9dfdSAndroid Build Coastguard Worker 		if (!histp)
61*387f9dfdSAndroid Build Coastguard Worker 			return 0;
62*387f9dfdSAndroid Build Coastguard Worker 	}
63*387f9dfdSAndroid Build Coastguard Worker 	slot = log2l(rq->__data_len / 1024);
64*387f9dfdSAndroid Build Coastguard Worker 	if (slot >= MAX_SLOTS)
65*387f9dfdSAndroid Build Coastguard Worker 		slot = MAX_SLOTS - 1;
66*387f9dfdSAndroid Build Coastguard Worker 	__sync_fetch_and_add(&histp->slots[slot], 1);
67*387f9dfdSAndroid Build Coastguard Worker 
68*387f9dfdSAndroid Build Coastguard Worker 	return 0;
69*387f9dfdSAndroid Build Coastguard Worker }
70*387f9dfdSAndroid Build Coastguard Worker 
71*387f9dfdSAndroid Build Coastguard Worker SEC("tp_btf/block_rq_issue")
BPF_PROG(block_rq_issue)72*387f9dfdSAndroid Build Coastguard Worker int BPF_PROG(block_rq_issue)
73*387f9dfdSAndroid Build Coastguard Worker {
74*387f9dfdSAndroid Build Coastguard Worker 	/**
75*387f9dfdSAndroid Build Coastguard Worker 	 * commit a54895fa (v5.11-rc1) changed tracepoint argument list
76*387f9dfdSAndroid Build Coastguard Worker 	 * from TP_PROTO(struct request_queue *q, struct request *rq)
77*387f9dfdSAndroid Build Coastguard Worker 	 * to TP_PROTO(struct request *rq)
78*387f9dfdSAndroid Build Coastguard Worker 	 */
79*387f9dfdSAndroid Build Coastguard Worker 	if (LINUX_KERNEL_VERSION >= KERNEL_VERSION(5, 11, 0))
80*387f9dfdSAndroid Build Coastguard Worker 		return trace_rq_issue((void *)ctx[0]);
81*387f9dfdSAndroid Build Coastguard Worker 	else
82*387f9dfdSAndroid Build Coastguard Worker 		return trace_rq_issue((void *)ctx[1]);
83*387f9dfdSAndroid Build Coastguard Worker }
84*387f9dfdSAndroid Build Coastguard Worker 
85*387f9dfdSAndroid Build Coastguard Worker char LICENSE[] SEC("license") = "GPL";
86