Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 // Copyright (c) 2019 Facebook
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     /* spin_lock in hash map */
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     /* spin_lock in array */
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";