| // SPDX-License-Identifier: GPL-2.0 |
| /* Copyright (c) 2021 Facebook */ |
| |
| #include "vmlinux.h" |
| #include <bpf/bpf_helpers.h> |
| #include <bpf/bpf_tracing.h> |
| |
| /* modifiers and typedefs are ignored when comparing key/value types */ |
| typedef struct my_key { long x; } key_type; |
| typedef struct my_value { long x; } value_type; |
| |
| extern struct { |
| __uint(max_entries, 16); |
| __type(key, key_type); |
| __type(value, value_type); |
| __uint(type, BPF_MAP_TYPE_HASH); |
| } map1 SEC(".maps"); |
| |
| struct { |
| __uint(type, BPF_MAP_TYPE_ARRAY); |
| __type(key, int); |
| __type(value, int); |
| __uint(max_entries, 8); |
| } map2 SEC(".maps"); |
| |
| /* this definition will lose, but it has to exactly match the winner */ |
| struct { |
| __uint(type, BPF_MAP_TYPE_ARRAY); |
| __type(key, int); |
| __type(value, int); |
| __uint(max_entries, 16); |
| } map_weak __weak SEC(".maps"); |
| |
| int output_first2; |
| int output_second2; |
| int output_weak2; |
| |
| SEC("raw_tp/sys_enter") |
| int BPF_PROG(handler_enter2) |
| { |
| /* update values with key = 2 */ |
| int key = 2, val = 2; |
| key_type key_struct = { .x = 2 }; |
| value_type val_struct = { .x = 2000 }; |
| |
| bpf_map_update_elem(&map1, &key_struct, &val_struct, 0); |
| bpf_map_update_elem(&map2, &key, &val, 0); |
| bpf_map_update_elem(&map_weak, &key, &val, 0); |
| |
| return 0; |
| } |
| |
| SEC("raw_tp/sys_exit") |
| int BPF_PROG(handler_exit2) |
| { |
| /* lookup values with key = 1, set in another file */ |
| int key = 1, *val; |
| key_type key_struct = { .x = 1 }; |
| value_type *value_struct; |
| |
| value_struct = bpf_map_lookup_elem(&map1, &key_struct); |
| if (value_struct) |
| output_first2 = value_struct->x; |
| |
| val = bpf_map_lookup_elem(&map2, &key); |
| if (val) |
| output_second2 = *val; |
| |
| val = bpf_map_lookup_elem(&map_weak, &key); |
| if (val) |
| output_weak2 = *val; |
| |
| return 0; |
| } |
| |
| char LICENSE[] SEC("license") = "GPL"; |