test_map_lock.c (1264B)
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/bpf_helpers.h> 6 7#define VAR_NUM 16 8 9struct hmap_elem { 10 struct bpf_spin_lock lock; 11 int var[VAR_NUM]; 12}; 13 14struct { 15 __uint(type, BPF_MAP_TYPE_HASH); 16 __uint(max_entries, 1); 17 __type(key, __u32); 18 __type(value, struct hmap_elem); 19} hash_map SEC(".maps"); 20 21struct array_elem { 22 struct bpf_spin_lock lock; 23 int var[VAR_NUM]; 24}; 25 26struct { 27 __uint(type, BPF_MAP_TYPE_ARRAY); 28 __uint(max_entries, 1); 29 __type(key, int); 30 __type(value, struct array_elem); 31} array_map SEC(".maps"); 32 33SEC("cgroup/skb") 34int bpf_map_lock_test(struct __sk_buff *skb) 35{ 36 struct hmap_elem zero = {}, *val; 37 int rnd = bpf_get_prandom_u32(); 38 int key = 0, err = 1, i; 39 struct array_elem *q; 40 41 val = bpf_map_lookup_elem(&hash_map, &key); 42 if (!val) 43 goto err; 44 /* spin_lock in hash map */ 45 bpf_spin_lock(&val->lock); 46 for (i = 0; i < VAR_NUM; i++) 47 val->var[i] = rnd; 48 bpf_spin_unlock(&val->lock); 49 50 /* spin_lock in array */ 51 q = bpf_map_lookup_elem(&array_map, &key); 52 if (!q) 53 goto err; 54 bpf_spin_lock(&q->lock); 55 for (i = 0; i < VAR_NUM; i++) 56 q->var[i] = rnd; 57 bpf_spin_unlock(&q->lock); 58 err = 0; 59err: 60 return err; 61} 62char _license[] SEC("license") = "GPL";