0001
0002
0003 #include <linux/bpf.h>
0004 #include <linux/version.h>
0005 #include <bpf/bpf_helpers.h>
0006
0007 #define VAR_NUM 16
0008
0009 struct hmap_elem {
0010 struct bpf_spin_lock lock;
0011 int var[VAR_NUM];
0012 };
0013
0014 struct {
0015 __uint(type, BPF_MAP_TYPE_HASH);
0016 __uint(max_entries, 1);
0017 __type(key, __u32);
0018 __type(value, struct hmap_elem);
0019 } hash_map SEC(".maps");
0020
0021 struct array_elem {
0022 struct bpf_spin_lock lock;
0023 int var[VAR_NUM];
0024 };
0025
0026 struct {
0027 __uint(type, BPF_MAP_TYPE_ARRAY);
0028 __uint(max_entries, 1);
0029 __type(key, int);
0030 __type(value, struct array_elem);
0031 } array_map SEC(".maps");
0032
0033 SEC("cgroup/skb")
0034 int bpf_map_lock_test(struct __sk_buff *skb)
0035 {
0036 struct hmap_elem zero = {}, *val;
0037 int rnd = bpf_get_prandom_u32();
0038 int key = 0, err = 1, i;
0039 struct array_elem *q;
0040
0041 val = bpf_map_lookup_elem(&hash_map, &key);
0042 if (!val)
0043 goto err;
0044
0045 bpf_spin_lock(&val->lock);
0046 for (i = 0; i < VAR_NUM; i++)
0047 val->var[i] = rnd;
0048 bpf_spin_unlock(&val->lock);
0049
0050
0051 q = bpf_map_lookup_elem(&array_map, &key);
0052 if (!q)
0053 goto err;
0054 bpf_spin_lock(&q->lock);
0055 for (i = 0; i < VAR_NUM; i++)
0056 q->var[i] = rnd;
0057 bpf_spin_unlock(&q->lock);
0058 err = 0;
0059 err:
0060 return err;
0061 }
0062 char _license[] SEC("license") = "GPL";