1300f19dcSKumar Kartikeya Dwivedi // SPDX-License-Identifier: GPL-2.0 2300f19dcSKumar Kartikeya Dwivedi #ifndef LINKED_LIST_H 3300f19dcSKumar Kartikeya Dwivedi #define LINKED_LIST_H 4300f19dcSKumar Kartikeya Dwivedi 5300f19dcSKumar Kartikeya Dwivedi #include <vmlinux.h> 6300f19dcSKumar Kartikeya Dwivedi #include <bpf/bpf_helpers.h> 7300f19dcSKumar Kartikeya Dwivedi #include "bpf_experimental.h" 8300f19dcSKumar Kartikeya Dwivedi 9300f19dcSKumar Kartikeya Dwivedi struct bar { 10300f19dcSKumar Kartikeya Dwivedi struct bpf_list_node node; 11300f19dcSKumar Kartikeya Dwivedi int data; 12300f19dcSKumar Kartikeya Dwivedi }; 13300f19dcSKumar Kartikeya Dwivedi 14300f19dcSKumar Kartikeya Dwivedi struct foo { 15300f19dcSKumar Kartikeya Dwivedi struct bpf_list_node node; 16300f19dcSKumar Kartikeya Dwivedi struct bpf_list_head head __contains(bar, node); 17300f19dcSKumar Kartikeya Dwivedi struct bpf_spin_lock lock; 18300f19dcSKumar Kartikeya Dwivedi int data; 19300f19dcSKumar Kartikeya Dwivedi struct bpf_list_node node2; 20300f19dcSKumar Kartikeya Dwivedi }; 21300f19dcSKumar Kartikeya Dwivedi 22300f19dcSKumar Kartikeya Dwivedi struct map_value { 23300f19dcSKumar Kartikeya Dwivedi struct bpf_spin_lock lock; 24300f19dcSKumar Kartikeya Dwivedi int data; 25*de67ba39SDave Marchevsky struct bpf_list_head head __contains(foo, node2); 26300f19dcSKumar Kartikeya Dwivedi }; 27300f19dcSKumar Kartikeya Dwivedi 28300f19dcSKumar Kartikeya Dwivedi struct array_map { 29300f19dcSKumar Kartikeya Dwivedi __uint(type, BPF_MAP_TYPE_ARRAY); 30300f19dcSKumar Kartikeya Dwivedi __type(key, int); 31300f19dcSKumar Kartikeya Dwivedi __type(value, struct map_value); 32300f19dcSKumar Kartikeya Dwivedi __uint(max_entries, 1); 33300f19dcSKumar Kartikeya Dwivedi }; 34300f19dcSKumar Kartikeya Dwivedi 35300f19dcSKumar Kartikeya Dwivedi struct array_map array_map SEC(".maps"); 36300f19dcSKumar Kartikeya Dwivedi struct array_map inner_map SEC(".maps"); 37300f19dcSKumar Kartikeya Dwivedi 38300f19dcSKumar Kartikeya Dwivedi struct { 39300f19dcSKumar Kartikeya Dwivedi __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); 40300f19dcSKumar Kartikeya Dwivedi __uint(max_entries, 1); 41300f19dcSKumar Kartikeya Dwivedi __type(key, int); 42300f19dcSKumar Kartikeya Dwivedi __type(value, int); 43300f19dcSKumar Kartikeya Dwivedi __array(values, struct array_map); 44300f19dcSKumar Kartikeya Dwivedi } map_of_maps SEC(".maps") = { 45300f19dcSKumar Kartikeya Dwivedi .values = { 46300f19dcSKumar Kartikeya Dwivedi [0] = &inner_map, 47300f19dcSKumar Kartikeya Dwivedi }, 48300f19dcSKumar Kartikeya Dwivedi }; 49300f19dcSKumar Kartikeya Dwivedi 50dc79f035SAlexei Starovoitov #define private(name) SEC(".bss." #name) __hidden __attribute__((aligned(8))) 51300f19dcSKumar Kartikeya Dwivedi 52300f19dcSKumar Kartikeya Dwivedi private(A) struct bpf_spin_lock glock; 53*de67ba39SDave Marchevsky private(A) struct bpf_list_head ghead __contains(foo, node2); 54300f19dcSKumar Kartikeya Dwivedi private(B) struct bpf_spin_lock glock2; 55300f19dcSKumar Kartikeya Dwivedi 56300f19dcSKumar Kartikeya Dwivedi #endif 57