On Thu, Jan 17, 2019 at 10:14 PM Alexei Starovoitov <a...@kernel.org> wrote: > > Many algorithms need to read and modify several variables atomically. > Until now it was hard to impossible to implement such algorithms in BPF. > Hence introduce support for bpf_spin_lock. > > The api consists of 'struct bpf_spin_lock' that should be placed > inside hash/array/cgroup_local_storage element > and bpf_spin_lock/unlock() helper function. > > Example: > struct hash_elem { > int cnt; > struct bpf_spin_lock lock; > }; > struct hash_elem * val = bpf_map_lookup_elem(&hash_map, &key); > if (val) { > bpf_spin_lock(&val->lock); > val->cnt++; > bpf_spin_unlock(&val->lock); > } > > and BPF_F_LOCK flag for lookup/update bpf syscall commands that > allows user space to read/write map elements under lock. > > Together these primitives allow race free access to map elements > from bpf programs and from user space. > > Key restriction: root only. > Key requirement: maps must be annotated with BTF. > > This concept was discussed at Linux Plumbers Conference 2018. > Thank you everyone who participated and helped to iron out details > of api and implementation. > > Patch 1: bpf_spin_lock support in the verifier, BTF, hash, array. > Patch 2: bpf_spin_lock in cgroup local storage. > Patches 3,4,5: tests > Patch 6: BPF_F_LOCK flag to lookup/update > Patches 7,8,9: tests > > v1->v2: > - addressed several issues spotted by Daniel and Martin in patch 1 > - added test11 to patch 4 as suggested by Daniel
Found a build error on ia64 when SMP is on, but qspinlock is not used. Will be respining the set.