作用
在 RDMA 通信中,使用 Doorbell 表明某个 QP 有待处理的 WR,用户态进程使用 post_send_db 来 ring doorbell
原理
用户态协议栈通过 doorbell 机制写入网卡的寄存器,实际上写入的是一个 64 位 (位宽大小) 的值,其中还包括一些标志 (WQE 类型等)。进而使网卡得知 WQE 和 Data 的内存位置 (只有 64 位大小,所以不可能是内存地址,而是一个偏移位置),然后通过 DMA 去取(全部都是走 PCIe)
和 MMIO 的关系
Doorbell 机制的底层原理是 MMIO(内存映射 I/O,Memory-Mapped I/O),MMIO 是一种通过将设备的寄存器或内存与系统的地址空间直接映射的技术,使得处理器能够像访问普通内存那样访问 I/O 设备。内存映射 I/O 的关键思想是通过将 I/O 设备的地址空间与系统内存地址空间合并,省去专门的 I/O 指令,简化了硬件设计和操作系统的复杂性
在系统上,mmap() 函数提供一种能力,使程序可以把硬件寄存器、文件等当作内存去读写。实际上 mmap 函数提供的是一个虚拟内存地址(Virtual Address, VA),用户态程序可以通过 mmap 直接访问特定内存区域,比如设备的 MMIO 空间,方便对硬件进行操作
在用户态程序中,Doorbell 机制就是通过 mmap() 实现对网卡寄存器的写入
和 BAR 空间的关系
待补充
优化
设备可以根据情况响应 doorbell,可以不响应,也可以攒够一定的 doorbell 后一次性处理多个 WQE
业内优化方案:
- SSQ (Share Send Queue),减少 doorbell,提高性能
- WQE 和 Data 一起取?