1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* Copyright (c) 2021 Facebook */ |
3 | |
4 | #include "vmlinux.h" |
5 | #include <bpf/bpf_helpers.h> |
6 | #include <bpf/bpf_tracing.h> |
7 | |
8 | struct my_key { long x; }; |
9 | struct my_value { long x; }; |
10 | |
11 | struct { |
12 | __uint(type, BPF_MAP_TYPE_HASH); |
13 | __type(key, struct my_key); |
14 | __type(value, struct my_value); |
15 | __uint(max_entries, 16); |
16 | } map1 SEC(".maps" ); |
17 | |
18 | /* Matches map2 definition in linked_maps2.c. Order of the attributes doesn't |
19 | * matter. |
20 | */ |
21 | typedef struct { |
22 | __uint(max_entries, 8); |
23 | __type(key, int); |
24 | __type(value, int); |
25 | __uint(type, BPF_MAP_TYPE_ARRAY); |
26 | } map2_t; |
27 | |
28 | extern map2_t map2 SEC(".maps" ); |
29 | |
30 | /* This should be the winning map definition, but we have no way of verifying, |
31 | * so we just make sure that it links and works without errors |
32 | */ |
33 | struct { |
34 | __uint(type, BPF_MAP_TYPE_ARRAY); |
35 | __type(key, int); |
36 | __type(value, int); |
37 | __uint(max_entries, 16); |
38 | } map_weak __weak SEC(".maps" ); |
39 | |
40 | int output_first1; |
41 | int output_second1; |
42 | int output_weak1; |
43 | |
44 | SEC("raw_tp/sys_enter" ) |
45 | int BPF_PROG(handler_enter1) |
46 | { |
47 | /* update values with key = 1 */ |
48 | int key = 1, val = 1; |
49 | struct my_key key_struct = { .x = 1 }; |
50 | struct my_value val_struct = { .x = 1000 }; |
51 | |
52 | bpf_map_update_elem(&map1, &key_struct, &val_struct, 0); |
53 | bpf_map_update_elem(&map2, &key, &val, 0); |
54 | bpf_map_update_elem(&map_weak, &key, &val, 0); |
55 | |
56 | return 0; |
57 | } |
58 | |
59 | SEC("raw_tp/sys_exit" ) |
60 | int BPF_PROG(handler_exit1) |
61 | { |
62 | /* lookup values with key = 2, set in another file */ |
63 | int key = 2, *val; |
64 | struct my_key key_struct = { .x = 2 }; |
65 | struct my_value *value_struct; |
66 | |
67 | value_struct = bpf_map_lookup_elem(&map1, &key_struct); |
68 | if (value_struct) |
69 | output_first1 = value_struct->x; |
70 | |
71 | val = bpf_map_lookup_elem(&map2, &key); |
72 | if (val) |
73 | output_second1 = *val; |
74 | |
75 | val = bpf_map_lookup_elem(&map_weak, &key); |
76 | if (val) |
77 | output_weak1 = *val; |
78 | |
79 | return 0; |
80 | } |
81 | |
82 | char LICENSE[] SEC("license" ) = "GPL" ; |
83 | |