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 /* modifiers and typedefs are ignored when comparing key/value types */ 9 typedef struct my_key { long x; } key_type; 10 typedef struct my_value { long x; } value_type; 11 12 extern struct { 13 __uint(max_entries, 16); 14 __type(key, key_type); 15 __type(value, value_type); 16 __uint(type, BPF_MAP_TYPE_HASH); 17 } map1 SEC(".maps"); 18 19 struct { 20 __uint(type, BPF_MAP_TYPE_ARRAY); 21 __type(key, int); 22 __type(value, int); 23 __uint(max_entries, 8); 24 } map2 SEC(".maps"); 25 26 /* this definition will lose, but it has to exactly match the winner */ 27 struct { 28 __uint(type, BPF_MAP_TYPE_ARRAY); 29 __type(key, int); 30 __type(value, int); 31 __uint(max_entries, 16); 32 } map_weak __weak SEC(".maps"); 33 34 int output_first2; 35 int output_second2; 36 int output_weak2; 37 38 SEC("raw_tp/sys_enter") 39 int BPF_PROG(handler_enter2) 40 { 41 /* update values with key = 2 */ 42 int key = 2, val = 2; 43 key_type key_struct = { .x = 2 }; 44 value_type val_struct = { .x = 2000 }; 45 46 bpf_map_update_elem(&map1, &key_struct, &val_struct, 0); 47 bpf_map_update_elem(&map2, &key, &val, 0); 48 bpf_map_update_elem(&map_weak, &key, &val, 0); 49 50 return 0; 51 } 52 53 SEC("raw_tp/sys_exit") 54 int BPF_PROG(handler_exit2) 55 { 56 /* lookup values with key = 1, set in another file */ 57 int key = 1, *val; 58 key_type key_struct = { .x = 1 }; 59 value_type *value_struct; 60 61 value_struct = bpf_map_lookup_elem(&map1, &key_struct); 62 if (value_struct) 63 output_first2 = value_struct->x; 64 65 val = bpf_map_lookup_elem(&map2, &key); 66 if (val) 67 output_second2 = *val; 68 69 val = bpf_map_lookup_elem(&map_weak, &key); 70 if (val) 71 output_weak2 = *val; 72 73 return 0; 74 } 75 76 char LICENSE[] SEC("license") = "GPL"; 77