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