xref: /linux/tools/testing/selftests/bpf/progs/test_map_lock.c (revision f6d08d9d8543c8ee494b307804b28e2750ffedb9)
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_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 	__u32 type;
16 	__u32 max_entries;
17 	__u32 *key;
18 	struct hmap_elem *value;
19 } hash_map SEC(".maps") = {
20 	.type = BPF_MAP_TYPE_HASH,
21 	.max_entries = 1,
22 };
23 
24 struct array_elem {
25 	struct bpf_spin_lock lock;
26 	int var[VAR_NUM];
27 };
28 
29 struct {
30 	__u32 type;
31 	__u32 max_entries;
32 	int *key;
33 	struct array_elem *value;
34 } array_map SEC(".maps") = {
35 	.type = BPF_MAP_TYPE_ARRAY,
36 	.max_entries = 1,
37 };
38 
39 SEC("map_lock_demo")
40 int bpf_map_lock_test(struct __sk_buff *skb)
41 {
42 	struct hmap_elem zero = {}, *val;
43 	int rnd = bpf_get_prandom_u32();
44 	int key = 0, err = 1, i;
45 	struct array_elem *q;
46 
47 	val = bpf_map_lookup_elem(&hash_map, &key);
48 	if (!val)
49 		goto err;
50 	/* spin_lock in hash map */
51 	bpf_spin_lock(&val->lock);
52 	for (i = 0; i < VAR_NUM; i++)
53 		val->var[i] = rnd;
54 	bpf_spin_unlock(&val->lock);
55 
56 	/* spin_lock in array */
57 	q = bpf_map_lookup_elem(&array_map, &key);
58 	if (!q)
59 		goto err;
60 	bpf_spin_lock(&q->lock);
61 	for (i = 0; i < VAR_NUM; i++)
62 		q->var[i] = rnd;
63 	bpf_spin_unlock(&q->lock);
64 	err = 0;
65 err:
66 	return err;
67 }
68 char _license[] SEC("license") = "GPL";
69