1、迈向eBPF并发领域的内存模型第三届 eBPF开发者大会w w w.e b p f t r a v e l.c o m中 国 西 安范佳明 南京大学第 三 届 e B P F 开 发 者 大 会 问题背景 什么是 BPF 内存模型 BPF 指令的内存语义 与 LLVM 的集成 未来方向目录在很多开发者心中,eBPF 是不是一种简单的、单线程的沙箱系统?但你有没有想过:多个 BPF 程序是否可能同时访问共享内存?第 三 届 e B P F 开 发 者 大 会0.问题背景在很多开发者心中,eBPF 是不是一种简单的、单线程的沙箱系统?但你有没有想过:多个 eBPF 程序是否可能同时访问共享内存?答
2、案是:当然可以,甚至已经发生了。第 三 届 e B P F 开 发 者 大 会0.问题背景第 三 届 e B P F 开 发 者 大 会0.问题背景一个 race condition 的例子,如果下面的代码在多个 CPU 上同时运行bpf_printk 的结果应该是什么:?第 三 届 e B P F 开 发 者 大 会0.问题背景一个 race condition 的例子,如果下面的代码在多个 CPU 上同时运行bpf_printk 的结果应该是什么:取决于内存模型第 三 届 e B P F 开 发 者 大 会0.问题背景什么是内存模型?A memory model defines outco
3、mes of concurrent accesses-Paul E.McKenney第 三 届 e B P F 开 发 者 大 会0.问题背景举例来说,对于同一内存(a=0),一读(read(a))一写(a=1)的情况,不同的内存模型如何定义结果?C/C+内存模型:未定义行为(UB)“Any data race results in undefined behavior.”C+11 standard 1.10在理论模型中,你甚至可能观察到 a=42,即 OOTA(Out-of-Thin-Air)行为 第 三 届 e B P F 开 发 者 大 会0.问题背景举例来说,对于同一内存(a=0),一
4、读(read(a))一写(a=1)的情况,不同的内存模型如何定义结果?C/C+内存模型:未定义行为(UB)“Any data race results in undefined behavior.”C+11 standard 1.10在理论模型中,你甚至可能观察到 a=42,即 OOTA(Out-of-Thin-Air)行为 Linux Kernel Model:要么是新值 1,要么是旧值 0,但不会是凭空出现的值(OOTA)内核文档 memory-barriers.txt section:All memory-reference instructions 第 三 届 e B P F 开 发
5、者 大 会0.问题背景那么,eBPF 程序的内存模型是什么呢?实际上,eBPF 的内存模型一直没有被提出,BPF 只是 instruction set,却没有定义自己的 memory model 直到 2023 年,Paul E.McKenney 提出了Instruction-Level BPF Memory Model11 https:/ 三 届 e B P F 开 发 者 大 会1.什么是 BPF 内存模型三层并存的内存模型结构高级语言内存模型 C/C+/RustBPF 指令级模型(Today)硬件内存模型X86/ARMv8 编译器(LLVM)JIT(x86/ARM)第 三 届 e B P
6、 F 开 发 者 大 会1.什么是 BPF 内存模型三层并存的内存模型结构高级语言内存模型 C/C+/RustBPF 指令级模型(Today)硬件内存模型X86/ARMv8 编译器(LLVM)JIT(x86/ARM)BPF 内存模型就处于将高级语言转接到硬件指令的转接层举例:BPF 程序中 store_release()LLVM BPF JIT ARMv8如果 BPF 无法表达 store 是 release 的,那么下层 jit 可能不会插入合适的 memory-barrier,导致程序出现诡异的错误!第 三 届 e B P F 开 发 者 大 会1.什么是 BPF 内存模型为了理解 BPF