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 9struct bar { 10 struct bpf_list_node node; 11 int data; 12}; 13 14struct 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 22struct map_value { 23 struct bpf_spin_lock lock; 24 int data; 25 struct bpf_list_head head __contains(foo, node2); 26}; 27 28struct 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 35struct array_map array_map SEC(".maps"); 36struct array_map inner_map SEC(".maps"); 37 38struct { 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 52private(A) struct bpf_spin_lock glock; 53private(A) struct bpf_list_head ghead __contains(foo, node2); 54private(B) struct bpf_spin_lock glock2; 55 56#endif 57