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