14659fba1SMartin KaFai Lau // SPDX-License-Identifier: GPL-2.0
24659fba1SMartin KaFai Lau /* Copyright (c) 2023 Meta Platforms, Inc. and affiliates. */
34659fba1SMartin KaFai Lau 
44659fba1SMartin KaFai Lau #include "vmlinux.h"
54659fba1SMartin KaFai Lau #include "bpf_tracing_net.h"
64659fba1SMartin KaFai Lau #include <bpf/bpf_tracing.h>
74659fba1SMartin KaFai Lau #include <bpf/bpf_helpers.h>
84659fba1SMartin KaFai Lau 
94659fba1SMartin KaFai Lau long create_errs = 0;
104659fba1SMartin KaFai Lau long create_cnts = 0;
114659fba1SMartin KaFai Lau long kmalloc_cnts = 0;
124659fba1SMartin KaFai Lau __u32 bench_pid = 0;
134659fba1SMartin KaFai Lau 
144659fba1SMartin KaFai Lau struct storage {
154659fba1SMartin KaFai Lau 	__u8 data[64];
164659fba1SMartin KaFai Lau };
174659fba1SMartin KaFai Lau 
184659fba1SMartin KaFai Lau struct {
194659fba1SMartin KaFai Lau 	__uint(type, BPF_MAP_TYPE_SK_STORAGE);
204659fba1SMartin KaFai Lau 	__uint(map_flags, BPF_F_NO_PREALLOC);
214659fba1SMartin KaFai Lau 	__type(key, int);
224659fba1SMartin KaFai Lau 	__type(value, struct storage);
234659fba1SMartin KaFai Lau } sk_storage_map SEC(".maps");
244659fba1SMartin KaFai Lau 
25cbe9d93dSMartin KaFai Lau struct {
26cbe9d93dSMartin KaFai Lau 	__uint(type, BPF_MAP_TYPE_TASK_STORAGE);
27cbe9d93dSMartin KaFai Lau 	__uint(map_flags, BPF_F_NO_PREALLOC);
28cbe9d93dSMartin KaFai Lau 	__type(key, int);
29cbe9d93dSMartin KaFai Lau 	__type(value, struct storage);
30cbe9d93dSMartin KaFai Lau } task_storage_map SEC(".maps");
31cbe9d93dSMartin KaFai Lau 
324659fba1SMartin KaFai Lau SEC("raw_tp/kmalloc")
BPF_PROG(kmalloc,unsigned long call_site,const void * ptr,size_t bytes_req,size_t bytes_alloc,gfp_t gfp_flags,int node)334659fba1SMartin KaFai Lau int BPF_PROG(kmalloc, unsigned long call_site, const void *ptr,
344659fba1SMartin KaFai Lau 	     size_t bytes_req, size_t bytes_alloc, gfp_t gfp_flags,
354659fba1SMartin KaFai Lau 	     int node)
364659fba1SMartin KaFai Lau {
374659fba1SMartin KaFai Lau 	__sync_fetch_and_add(&kmalloc_cnts, 1);
384659fba1SMartin KaFai Lau 
394659fba1SMartin KaFai Lau 	return 0;
404659fba1SMartin KaFai Lau }
414659fba1SMartin KaFai Lau 
42cbe9d93dSMartin KaFai Lau SEC("tp_btf/sched_process_fork")
BPF_PROG(sched_process_fork,struct task_struct * parent,struct task_struct * child)439af0f555SJames Hilliard int BPF_PROG(sched_process_fork, struct task_struct *parent, struct task_struct *child)
44cbe9d93dSMartin KaFai Lau {
45cbe9d93dSMartin KaFai Lau 	struct storage *stg;
46cbe9d93dSMartin KaFai Lau 
47cbe9d93dSMartin KaFai Lau 	if (parent->tgid != bench_pid)
48cbe9d93dSMartin KaFai Lau 		return 0;
49cbe9d93dSMartin KaFai Lau 
50cbe9d93dSMartin KaFai Lau 	stg = bpf_task_storage_get(&task_storage_map, child, NULL,
51cbe9d93dSMartin KaFai Lau 				   BPF_LOCAL_STORAGE_GET_F_CREATE);
52cbe9d93dSMartin KaFai Lau 	if (stg)
53cbe9d93dSMartin KaFai Lau 		__sync_fetch_and_add(&create_cnts, 1);
54cbe9d93dSMartin KaFai Lau 	else
55cbe9d93dSMartin KaFai Lau 		__sync_fetch_and_add(&create_errs, 1);
56cbe9d93dSMartin KaFai Lau 
57cbe9d93dSMartin KaFai Lau 	return 0;
58cbe9d93dSMartin KaFai Lau }
59cbe9d93dSMartin KaFai Lau 
604659fba1SMartin KaFai Lau SEC("lsm.s/socket_post_create")
BPF_PROG(socket_post_create,struct socket * sock,int family,int type,int protocol,int kern)614659fba1SMartin KaFai Lau int BPF_PROG(socket_post_create, struct socket *sock, int family, int type,
624659fba1SMartin KaFai Lau 	     int protocol, int kern)
634659fba1SMartin KaFai Lau {
6439f8a293SAlexei Starovoitov 	struct sock *sk = sock->sk;
654659fba1SMartin KaFai Lau 	struct storage *stg;
664659fba1SMartin KaFai Lau 	__u32 pid;
674659fba1SMartin KaFai Lau 
684659fba1SMartin KaFai Lau 	pid = bpf_get_current_pid_tgid() >> 32;
6939f8a293SAlexei Starovoitov 	if (pid != bench_pid || !sk)
704659fba1SMartin KaFai Lau 		return 0;
714659fba1SMartin KaFai Lau 
7239f8a293SAlexei Starovoitov 	stg = bpf_sk_storage_get(&sk_storage_map, sk, NULL,
734659fba1SMartin KaFai Lau 				 BPF_LOCAL_STORAGE_GET_F_CREATE);
744659fba1SMartin KaFai Lau 
754659fba1SMartin KaFai Lau 	if (stg)
764659fba1SMartin KaFai Lau 		__sync_fetch_and_add(&create_cnts, 1);
774659fba1SMartin KaFai Lau 	else
784659fba1SMartin KaFai Lau 		__sync_fetch_and_add(&create_errs, 1);
794659fba1SMartin KaFai Lau 
804659fba1SMartin KaFai Lau 	return 0;
814659fba1SMartin KaFai Lau }
824659fba1SMartin KaFai Lau 
834659fba1SMartin KaFai Lau char __license[] SEC("license") = "GPL";
84