]> Git Repo - linux.git/blob - tools/testing/selftests/bpf/progs/for_each_array_map_elem.c
Linux 6.14-rc3
[linux.git] / tools / testing / selftests / bpf / progs / for_each_array_map_elem.c
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2021 Facebook */
3 #include "vmlinux.h"
4 #include <bpf/bpf_helpers.h>
5
6 char _license[] SEC("license") = "GPL";
7
8 struct {
9         __uint(type, BPF_MAP_TYPE_ARRAY);
10         __uint(max_entries, 3);
11         __type(key, __u32);
12         __type(value, __u64);
13 } arraymap SEC(".maps");
14
15 struct {
16         __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
17         __uint(max_entries, 1);
18         __type(key, __u32);
19         __type(value, __u64);
20 } percpu_map SEC(".maps");
21
22 struct callback_ctx {
23         int output;
24 };
25
26 const volatile int bypass_unused = 1;
27
28 static __u64
29 unused_subprog(struct bpf_map *map, __u32 *key, __u64 *val,
30                struct callback_ctx *data)
31 {
32         data->output = 0;
33         return 1;
34 }
35
36 static __u64
37 check_array_elem(struct bpf_map *map, __u32 *key, __u64 *val,
38                  struct callback_ctx *data)
39 {
40         data->output += *val;
41         if (*key == 1)
42                 return 1; /* stop the iteration */
43         return 0;
44 }
45
46 __u32 cpu = 0;
47 __u64 percpu_val = 0;
48
49 static __u64
50 check_percpu_elem(struct bpf_map *map, __u32 *key, __u64 *val,
51                   struct callback_ctx *data)
52 {
53         cpu = bpf_get_smp_processor_id();
54         percpu_val = *val;
55         return 0;
56 }
57
58 u32 arraymap_output = 0;
59
60 SEC("tc")
61 int test_pkt_access(struct __sk_buff *skb)
62 {
63         struct callback_ctx data;
64
65         data.output = 0;
66         bpf_for_each_map_elem(&arraymap, check_array_elem, &data, 0);
67         if (!bypass_unused)
68                 bpf_for_each_map_elem(&arraymap, unused_subprog, &data, 0);
69         arraymap_output = data.output;
70
71         bpf_for_each_map_elem(&percpu_map, check_percpu_elem, (void *)0, 0);
72         return 0;
73 }
This page took 0.035344 seconds and 4 git commands to generate.