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, node); 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, node); 54 private(B) struct bpf_spin_lock glock2; 55 56 #endif 57