test_global_func_args.c (1213B)
1// SPDX-License-Identifier: GPL-2.0 2 3#include <linux/bpf.h> 4 5#include <bpf/bpf_helpers.h> 6 7struct S { 8 int v; 9}; 10 11struct S global_variable = {}; 12 13struct { 14 __uint(type, BPF_MAP_TYPE_ARRAY); 15 __uint(max_entries, 7); 16 __type(key, __u32); 17 __type(value, int); 18} values SEC(".maps"); 19 20static void save_value(__u32 index, int value) 21{ 22 bpf_map_update_elem(&values, &index, &value, 0); 23} 24 25__noinline int foo(__u32 index, struct S *s) 26{ 27 if (s) { 28 save_value(index, s->v); 29 return ++s->v; 30 } 31 32 save_value(index, 0); 33 34 return 1; 35} 36 37__noinline int bar(__u32 index, volatile struct S *s) 38{ 39 if (s) { 40 save_value(index, s->v); 41 return ++s->v; 42 } 43 44 save_value(index, 0); 45 46 return 1; 47} 48 49__noinline int baz(struct S **s) 50{ 51 if (s) 52 *s = 0; 53 54 return 0; 55} 56 57SEC("cgroup_skb/ingress") 58int test_cls(struct __sk_buff *skb) 59{ 60 __u32 index = 0; 61 62 { 63 const int v = foo(index++, 0); 64 65 save_value(index++, v); 66 } 67 68 { 69 struct S s = { .v = 100 }; 70 71 foo(index++, &s); 72 save_value(index++, s.v); 73 } 74 75 { 76 global_variable.v = 42; 77 bar(index++, &global_variable); 78 save_value(index++, global_variable.v); 79 } 80 81 { 82 struct S v, *p = &v; 83 84 baz(&p); 85 save_value(index++, !p); 86 } 87 88 return 0; 89} 90 91char _license[] SEC("license") = "GPL";