RosenBridge: A Framework for Enabling Express I/O Paths Across the Virtualization Boundary (FAST 2026)
一句话总结:通过新的 paravirtualized 设备 virtio-ndp + uBPF 在 QEMU userspace 跨虚拟化边界执行 NDP 程序,让 XRP、GPU-Direct-Storage 等 bare-metal express I/O path 可在 VM 中复用,相对 virtio/vhost 大幅提速,相对 bare-metal 仅有「轻微」性能损失。
问题
NVMe SSD 软件栈占 4KB 随机读延迟 87%,bare-metal 上 NDP 优化(XRP resubmit、GPU Direct Storage 等)可以把 BPF 程序挂在 NVMe 驱动 IRQ handler 上短路 kernel 路径。但虚拟化打破了这条路:guest 看不见 host 物理设备,virtio-blk 走 VM-exit → KVM → QEMU emulate → host syscall → 设备的长路径,VM 比物理机做同样吞吐多花 498-630% CPU。把 BPF 直接放进 host kernel NVMe 驱动会破坏隔离,放进 guest 又跨不过语义鸿沟。
核心方法
- virtio-ndp 设备:扩展 virtio-blk header 增加 BPF semantics(VIRTIO_BLK_T_LOAD/READ_ND/WRITE_ND/UNLOAD),guest ioctl
BPF_HOST_ATTACH把 BPF 程序加载到 QEMU 中由 uBPF(用户态 BPF 实现)执行,比 eBPF 内核加载更适合云端隔离要求。 - io_uring 双 hook 调度:为支持 on-path(如 GDS、压缩)和 content-based resubmit(如 XRP)两种 NDP 模式,在 io_uring
prep_read和cqe_seen加 uBPF hook,提供BPF_uring_get_sqe/get_new_sqe/set_sqehelper 让 BPF 修改/重提交 SQE;用 io_uring NVMe passthrough 绕过 kernel I/O 栈。 - Guest-Host 语义桥接:通过 PCIe BAR 映射的共享内存区传 guest metadata;提供
BPF_disk_trans(GPA→host 文件 offset)、BPF_mem_trans(GPA→HVA)helper;rosenbridge_mdctx 限制 BPF 仅可读 meta、读写 data。 - 安全与公平:用 PREVAIL verifier 编译期静态分析约束 uBPF 内存访问;继承 QEMU leaky bucket 做 multi-path I/O throttling,防止 NDP 路径绕过 SLA。
两个 case study:RosenXRP(接 XRP 的 BPF-KV B-tree 查询)、RosenGDS(GPU 直传,VFIO passthrough GPU + virtio-blk 虚拟盘)。
关键结果
- 4KB 随机读 BPF-KV 在 VM 中性能显著超越 virtio-blk、vhost-kernel-blk、vhost-user-blk
- 相比 bare-metal XRP/GDS 仅有少量虚拟化固有开销
- CPU 用量比 paravirtualization 基线明显降低