| // SPDX-License-Identifier: GPL-2.0 |
| #ifndef LINKED_LIST_H |
| #define LINKED_LIST_H |
| |
| #include <vmlinux.h> |
| #include <bpf/bpf_helpers.h> |
| #include "bpf_experimental.h" |
| |
| struct bar { |
| struct bpf_list_node node; |
| int data; |
| }; |
| |
| struct foo { |
| struct bpf_list_node node; |
| struct bpf_list_head head __contains(bar, node); |
| struct bpf_spin_lock lock; |
| int data; |
| struct bpf_list_node node2; |
| }; |
| |
| struct map_value { |
| struct bpf_spin_lock lock; |
| int data; |
| struct bpf_list_head head __contains(foo, node2); |
| }; |
| |
| struct array_map { |
| __uint(type, BPF_MAP_TYPE_ARRAY); |
| __type(key, int); |
| __type(value, struct map_value); |
| __uint(max_entries, 1); |
| }; |
| |
| struct array_map array_map SEC(".maps"); |
| struct array_map inner_map SEC(".maps"); |
| |
| struct { |
| __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); |
| __uint(max_entries, 1); |
| __type(key, int); |
| __type(value, int); |
| __array(values, struct array_map); |
| } map_of_maps SEC(".maps") = { |
| .values = { |
| [0] = &inner_map, |
| }, |
| }; |
| |
| #define private(name) SEC(".bss." #name) __hidden __attribute__((aligned(8))) |
| |
| private(A) struct bpf_spin_lock glock; |
| private(A) struct bpf_list_head ghead __contains(foo, node2); |
| private(B) struct bpf_spin_lock glock2; |
| |
| #endif |