进程间共享的mmap'ed eBPF映射如何同步操作?

问题描述 投票:0回答:1

可以

mmap
类型为
BPF_MAP_TYPE_ARRAY
的 eBPF 映射。我有一个配置,其中多个进程访问这个
mmap
ed 映射,其中包含内核空间和用户空间中“某些缓存行大小的结构”类型的条目:

  • 内核空间使用 libbpf 的
    bpf_map_update_elem
  • 修改此映射
  • 用户空间通过读取先前存储在
    mmap
    ed指针
  • 中的值来处理访问映射的值

这个访问如何是线程安全的?是否涉及某种每映射互斥锁或细粒度锁定?是否涉及任何隐藏成本(例如 TLB 缓存未命中??)?由于同步,这两个操作(内核更新和用户读取)会产生哪些额外成本?

shared-memory mmap ebpf bpf libbpf
1个回答
0
投票

据我所知,这种访问不可能是线程安全的。当两个 BPF 程序访问相同的映射值时,我们有用于锁定的原语。帮助程序和系统调用接口都在映射级别上存在锁定。但是,当您将 arraymap 的内存映射到用户空间时,对该内存的访问会绕过通常用于帮助程序和系统调用接口的锁。

您也许可以使用 CMPXCHG 指令自行实现某种形式的锁定,以实现粗略的互斥锁。

最后,mmap 功能旨在将全局变量映射到用户空间以供临时使用(测试结果、不经常访问的设置)。对于任何需要原子更新的事情,最好使用系统调用接口和锁定原语

© www.soinside.com 2019 - 2024. All rights reserved.