1*fd283ab1SHou Tao // SPDX-License-Identifier: GPL-2.0
2*fd283ab1SHou Tao /* Copyright (C) 2023. Huawei Technologies Co., Ltd */
3*fd283ab1SHou Tao #include <stdbool.h>
4*fd283ab1SHou Tao #include <errno.h>
5*fd283ab1SHou Tao #include <linux/types.h>
6*fd283ab1SHou Tao #include <linux/bpf.h>
7*fd283ab1SHou Tao #include <bpf/bpf_helpers.h>
8*fd283ab1SHou Tao #include <bpf/bpf_tracing.h>
9*fd283ab1SHou Tao 
10*fd283ab1SHou Tao #define OP_BATCH 64
11*fd283ab1SHou Tao 
12*fd283ab1SHou Tao struct update_ctx {
13*fd283ab1SHou Tao 	unsigned int from;
14*fd283ab1SHou Tao 	unsigned int step;
15*fd283ab1SHou Tao };
16*fd283ab1SHou Tao 
17*fd283ab1SHou Tao struct {
18*fd283ab1SHou Tao 	__uint(type, BPF_MAP_TYPE_HASH);
19*fd283ab1SHou Tao 	__uint(key_size, 4);
20*fd283ab1SHou Tao 	__uint(map_flags, BPF_F_NO_PREALLOC);
21*fd283ab1SHou Tao } htab SEC(".maps");
22*fd283ab1SHou Tao 
23*fd283ab1SHou Tao char _license[] SEC("license") = "GPL";
24*fd283ab1SHou Tao 
25*fd283ab1SHou Tao unsigned char zeroed_value[4096];
26*fd283ab1SHou Tao unsigned int nr_thread = 0;
27*fd283ab1SHou Tao long op_cnt = 0;
28*fd283ab1SHou Tao 
write_htab(unsigned int i,struct update_ctx * ctx,unsigned int flags)29*fd283ab1SHou Tao static int write_htab(unsigned int i, struct update_ctx *ctx, unsigned int flags)
30*fd283ab1SHou Tao {
31*fd283ab1SHou Tao 	bpf_map_update_elem(&htab, &ctx->from, zeroed_value, flags);
32*fd283ab1SHou Tao 	ctx->from += ctx->step;
33*fd283ab1SHou Tao 
34*fd283ab1SHou Tao 	return 0;
35*fd283ab1SHou Tao }
36*fd283ab1SHou Tao 
overwrite_htab(unsigned int i,struct update_ctx * ctx)37*fd283ab1SHou Tao static int overwrite_htab(unsigned int i, struct update_ctx *ctx)
38*fd283ab1SHou Tao {
39*fd283ab1SHou Tao 	return write_htab(i, ctx, 0);
40*fd283ab1SHou Tao }
41*fd283ab1SHou Tao 
newwrite_htab(unsigned int i,struct update_ctx * ctx)42*fd283ab1SHou Tao static int newwrite_htab(unsigned int i, struct update_ctx *ctx)
43*fd283ab1SHou Tao {
44*fd283ab1SHou Tao 	return write_htab(i, ctx, BPF_NOEXIST);
45*fd283ab1SHou Tao }
46*fd283ab1SHou Tao 
del_htab(unsigned int i,struct update_ctx * ctx)47*fd283ab1SHou Tao static int del_htab(unsigned int i, struct update_ctx *ctx)
48*fd283ab1SHou Tao {
49*fd283ab1SHou Tao 	bpf_map_delete_elem(&htab, &ctx->from);
50*fd283ab1SHou Tao 	ctx->from += ctx->step;
51*fd283ab1SHou Tao 
52*fd283ab1SHou Tao 	return 0;
53*fd283ab1SHou Tao }
54*fd283ab1SHou Tao 
55*fd283ab1SHou Tao SEC("?tp/syscalls/sys_enter_getpgid")
overwrite(void * ctx)56*fd283ab1SHou Tao int overwrite(void *ctx)
57*fd283ab1SHou Tao {
58*fd283ab1SHou Tao 	struct update_ctx update;
59*fd283ab1SHou Tao 
60*fd283ab1SHou Tao 	update.from = bpf_get_smp_processor_id();
61*fd283ab1SHou Tao 	update.step = nr_thread;
62*fd283ab1SHou Tao 	bpf_loop(OP_BATCH, overwrite_htab, &update, 0);
63*fd283ab1SHou Tao 	__sync_fetch_and_add(&op_cnt, 1);
64*fd283ab1SHou Tao 	return 0;
65*fd283ab1SHou Tao }
66*fd283ab1SHou Tao 
67*fd283ab1SHou Tao SEC("?tp/syscalls/sys_enter_getpgid")
batch_add_batch_del(void * ctx)68*fd283ab1SHou Tao int batch_add_batch_del(void *ctx)
69*fd283ab1SHou Tao {
70*fd283ab1SHou Tao 	struct update_ctx update;
71*fd283ab1SHou Tao 
72*fd283ab1SHou Tao 	update.from = bpf_get_smp_processor_id();
73*fd283ab1SHou Tao 	update.step = nr_thread;
74*fd283ab1SHou Tao 	bpf_loop(OP_BATCH, overwrite_htab, &update, 0);
75*fd283ab1SHou Tao 
76*fd283ab1SHou Tao 	update.from = bpf_get_smp_processor_id();
77*fd283ab1SHou Tao 	bpf_loop(OP_BATCH, del_htab, &update, 0);
78*fd283ab1SHou Tao 
79*fd283ab1SHou Tao 	__sync_fetch_and_add(&op_cnt, 2);
80*fd283ab1SHou Tao 	return 0;
81*fd283ab1SHou Tao }
82*fd283ab1SHou Tao 
83*fd283ab1SHou Tao SEC("?tp/syscalls/sys_enter_getpgid")
add_only(void * ctx)84*fd283ab1SHou Tao int add_only(void *ctx)
85*fd283ab1SHou Tao {
86*fd283ab1SHou Tao 	struct update_ctx update;
87*fd283ab1SHou Tao 
88*fd283ab1SHou Tao 	update.from = bpf_get_smp_processor_id() / 2;
89*fd283ab1SHou Tao 	update.step = nr_thread / 2;
90*fd283ab1SHou Tao 	bpf_loop(OP_BATCH, newwrite_htab, &update, 0);
91*fd283ab1SHou Tao 	__sync_fetch_and_add(&op_cnt, 1);
92*fd283ab1SHou Tao 	return 0;
93*fd283ab1SHou Tao }
94*fd283ab1SHou Tao 
95*fd283ab1SHou Tao SEC("?tp/syscalls/sys_enter_getppid")
del_only(void * ctx)96*fd283ab1SHou Tao int del_only(void *ctx)
97*fd283ab1SHou Tao {
98*fd283ab1SHou Tao 	struct update_ctx update;
99*fd283ab1SHou Tao 
100*fd283ab1SHou Tao 	update.from = bpf_get_smp_processor_id() / 2;
101*fd283ab1SHou Tao 	update.step = nr_thread / 2;
102*fd283ab1SHou Tao 	bpf_loop(OP_BATCH, del_htab, &update, 0);
103*fd283ab1SHou Tao 	__sync_fetch_and_add(&op_cnt, 1);
104*fd283ab1SHou Tao 	return 0;
105*fd283ab1SHou Tao }
106