可以
mmap
类型为 BPF_MAP_TYPE_ARRAY
的 eBPF 映射。我有一个配置,其中多个进程访问这个 mmap
ed 映射,其中包含内核空间和用户空间中“某些缓存行大小的结构”类型的条目:
bpf_map_update_elem
mmap
ed指针这个访问如何是线程安全的?是否涉及某种每映射互斥锁或细粒度锁定?是否涉及任何隐藏成本(例如 TLB 缓存未命中??)?由于同步,这两个操作(内核更新和用户读取)会产生哪些额外成本?
据我所知,这种访问不可能是线程安全的。当两个 BPF 程序访问相同的映射值时,我们有用于锁定的原语。帮助程序和系统调用接口都在映射级别上存在锁定。但是,当您将 arraymap 的内存映射到用户空间时,对该内存的访问会绕过通常用于帮助程序和系统调用接口的锁。
您也许可以使用 CMPXCHG 指令自行实现某种形式的锁定,以实现粗略的互斥锁。
最后,mmap 功能旨在将全局变量映射到用户空间以供临时使用(测试结果、不经常访问的设置)。对于任何需要原子更新的事情,最好使用系统调用接口和锁定原语