1 | // SPDX-License-Identifier: GPL-2.0 |
2 | // Copyright (c) 2019 Facebook |
3 | #include <linux/bpf.h> |
4 | #include <linux/version.h> |
5 | #include <bpf/bpf_helpers.h> |
6 | |
7 | #define VAR_NUM 16 |
8 | |
9 | struct hmap_elem { |
10 | struct bpf_spin_lock lock; |
11 | int var[VAR_NUM]; |
12 | }; |
13 | |
14 | struct { |
15 | __uint(type, BPF_MAP_TYPE_HASH); |
16 | __uint(max_entries, 1); |
17 | __type(key, __u32); |
18 | __type(value, struct hmap_elem); |
19 | } hash_map SEC(".maps" ); |
20 | |
21 | struct array_elem { |
22 | struct bpf_spin_lock lock; |
23 | int var[VAR_NUM]; |
24 | }; |
25 | |
26 | struct { |
27 | __uint(type, BPF_MAP_TYPE_ARRAY); |
28 | __uint(max_entries, 1); |
29 | __type(key, int); |
30 | __type(value, struct array_elem); |
31 | } array_map SEC(".maps" ); |
32 | |
33 | SEC("cgroup/skb" ) |
34 | int bpf_map_lock_test(struct __sk_buff *skb) |
35 | { |
36 | struct hmap_elem *val; |
37 | int rnd = bpf_get_prandom_u32(); |
38 | int key = 0, err = 1, i; |
39 | struct array_elem *q; |
40 | |
41 | val = bpf_map_lookup_elem(&hash_map, &key); |
42 | if (!val) |
43 | goto err; |
44 | /* spin_lock in hash map */ |
45 | bpf_spin_lock(&val->lock); |
46 | for (i = 0; i < VAR_NUM; i++) |
47 | val->var[i] = rnd; |
48 | bpf_spin_unlock(&val->lock); |
49 | |
50 | /* spin_lock in array */ |
51 | q = bpf_map_lookup_elem(&array_map, &key); |
52 | if (!q) |
53 | goto err; |
54 | bpf_spin_lock(&q->lock); |
55 | for (i = 0; i < VAR_NUM; i++) |
56 | q->var[i] = rnd; |
57 | bpf_spin_unlock(&q->lock); |
58 | err = 0; |
59 | err: |
60 | return err; |
61 | } |
62 | char _license[] SEC("license" ) = "GPL" ; |
63 | |