1 | // SPDX-License-Identifier: GPL-2.0 |
2 | #ifndef LINKED_LIST_H |
3 | #define LINKED_LIST_H |
4 | |
5 | #include <vmlinux.h> |
6 | #include <bpf/bpf_helpers.h> |
7 | #include "bpf_experimental.h" |
8 | |
9 | struct bar { |
10 | struct bpf_list_node node; |
11 | int data; |
12 | }; |
13 | |
14 | struct foo { |
15 | struct bpf_list_node node; |
16 | struct bpf_list_head head __contains(bar, node); |
17 | struct bpf_spin_lock lock; |
18 | int data; |
19 | struct bpf_list_node node2; |
20 | }; |
21 | |
22 | struct map_value { |
23 | struct bpf_spin_lock lock; |
24 | int data; |
25 | struct bpf_list_head head __contains(foo, node2); |
26 | }; |
27 | |
28 | struct array_map { |
29 | __uint(type, BPF_MAP_TYPE_ARRAY); |
30 | __type(key, int); |
31 | __type(value, struct map_value); |
32 | __uint(max_entries, 1); |
33 | }; |
34 | |
35 | struct array_map array_map SEC(".maps" ); |
36 | struct array_map inner_map SEC(".maps" ); |
37 | |
38 | struct { |
39 | __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); |
40 | __uint(max_entries, 1); |
41 | __type(key, int); |
42 | __type(value, int); |
43 | __array(values, struct array_map); |
44 | } map_of_maps SEC(".maps" ) = { |
45 | .values = { |
46 | [0] = &inner_map, |
47 | }, |
48 | }; |
49 | |
50 | #define private(name) SEC(".bss." #name) __hidden __attribute__((aligned(8))) |
51 | |
52 | private(A) struct bpf_spin_lock glock; |
53 | private(A) struct bpf_list_head ghead __contains(foo, node2); |
54 | private(B) struct bpf_spin_lock glock2; |
55 | |
56 | #endif |
57 | |