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