forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/tools/testing/selftests/bpf/test_cgroup_storage.c
....@@ -4,6 +4,7 @@
44 #include <linux/filter.h>
55 #include <stdio.h>
66 #include <stdlib.h>
7
+#include <sys/sysinfo.h>
78
89 #include "bpf_rlimit.h"
910 #include "cgroup_helpers.h"
....@@ -15,22 +16,39 @@
1516 int main(int argc, char **argv)
1617 {
1718 struct bpf_insn prog[] = {
19
+ BPF_LD_MAP_FD(BPF_REG_1, 0), /* percpu map fd */
20
+ BPF_MOV64_IMM(BPF_REG_2, 0), /* flags, not used */
21
+ BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
22
+ BPF_FUNC_get_local_storage),
23
+ BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0),
24
+ BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 0x1),
25
+ BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
26
+
1827 BPF_LD_MAP_FD(BPF_REG_1, 0), /* map fd */
1928 BPF_MOV64_IMM(BPF_REG_2, 0), /* flags, not used */
2029 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
2130 BPF_FUNC_get_local_storage),
2231 BPF_MOV64_IMM(BPF_REG_1, 1),
2332 BPF_STX_XADD(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
24
- BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0),
33
+ BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
2534 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0x1),
2635 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
2736 BPF_EXIT_INSN(),
2837 };
2938 size_t insns_cnt = sizeof(prog) / sizeof(struct bpf_insn);
3039 int error = EXIT_FAILURE;
31
- int map_fd, prog_fd, cgroup_fd;
40
+ int map_fd, percpu_map_fd, prog_fd, cgroup_fd;
3241 struct bpf_cgroup_storage_key key;
3342 unsigned long long value;
43
+ unsigned long long *percpu_value;
44
+ int cpu, nproc;
45
+
46
+ nproc = get_nprocs_conf();
47
+ percpu_value = malloc(sizeof(*percpu_value) * nproc);
48
+ if (!percpu_value) {
49
+ printf("Not enough memory for per-cpu area (%d cpus)\n", nproc);
50
+ goto err;
51
+ }
3452
3553 map_fd = bpf_create_map(BPF_MAP_TYPE_CGROUP_STORAGE, sizeof(key),
3654 sizeof(value), 0, 0);
....@@ -39,7 +57,15 @@
3957 goto out;
4058 }
4159
42
- prog[0].imm = map_fd;
60
+ percpu_map_fd = bpf_create_map(BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE,
61
+ sizeof(key), sizeof(value), 0, 0);
62
+ if (percpu_map_fd < 0) {
63
+ printf("Failed to create map: %s\n", strerror(errno));
64
+ goto out;
65
+ }
66
+
67
+ prog[0].imm = percpu_map_fd;
68
+ prog[7].imm = map_fd;
4369 prog_fd = bpf_load_program(BPF_PROG_TYPE_CGROUP_SKB,
4470 prog, insns_cnt, "GPL", 0,
4571 bpf_log_buf, BPF_LOG_BUF_SIZE);
....@@ -48,22 +74,7 @@
4874 goto out;
4975 }
5076
51
- if (setup_cgroup_environment()) {
52
- printf("Failed to setup cgroup environment\n");
53
- goto err;
54
- }
55
-
56
- /* Create a cgroup, get fd, and join it */
57
- cgroup_fd = create_and_get_cgroup(TEST_CGROUP);
58
- if (!cgroup_fd) {
59
- printf("Failed to create test cgroup\n");
60
- goto err;
61
- }
62
-
63
- if (join_cgroup(TEST_CGROUP)) {
64
- printf("Failed to join cgroup\n");
65
- goto err;
66
- }
77
+ cgroup_fd = cgroup_setup_and_join(TEST_CGROUP);
6778
6879 /* Attach the bpf program */
6980 if (bpf_prog_attach(prog_fd, cgroup_fd, BPF_CGROUP_INET_EGRESS, 0)) {
....@@ -77,7 +88,15 @@
7788 }
7889
7990 if (bpf_map_lookup_elem(map_fd, &key, &value)) {
80
- printf("Failed to lookup cgroup storage\n");
91
+ printf("Failed to lookup cgroup storage 0\n");
92
+ goto err;
93
+ }
94
+
95
+ for (cpu = 0; cpu < nproc; cpu++)
96
+ percpu_value[cpu] = 1000;
97
+
98
+ if (bpf_map_update_elem(percpu_map_fd, &key, percpu_value, 0)) {
99
+ printf("Failed to update the data in the cgroup storage\n");
81100 goto err;
82101 }
83102
....@@ -120,11 +139,31 @@
120139 goto err;
121140 }
122141
142
+ /* Check the final value of the counter in the percpu local storage */
143
+
144
+ for (cpu = 0; cpu < nproc; cpu++)
145
+ percpu_value[cpu] = 0;
146
+
147
+ if (bpf_map_lookup_elem(percpu_map_fd, &key, percpu_value)) {
148
+ printf("Failed to lookup the per-cpu cgroup storage\n");
149
+ goto err;
150
+ }
151
+
152
+ value = 0;
153
+ for (cpu = 0; cpu < nproc; cpu++)
154
+ value += percpu_value[cpu];
155
+
156
+ if (value != nproc * 1000 + 6) {
157
+ printf("Unexpected data in the per-cpu cgroup storage\n");
158
+ goto err;
159
+ }
160
+
123161 error = 0;
124162 printf("test_cgroup_storage:PASS\n");
125163
126164 err:
127165 cleanup_cgroup_environment();
166
+ free(percpu_value);
128167
129168 out:
130169 return error;