单边RDMA场景下能否安全移除mlx4_post_send等函数内的自旋锁
RDMA移植锁改造相关问题解答
单工作线程场景下移除自旋锁的安全性
你描述的场景中移除mlx4_post_send()、mlx4_post_recv()、mlx4_poll_cq()内部的自旋锁是安全的。
mlx4用户态驱动中这三个接口的自旋锁,设计初衷是避免多线程并发操作同一个QP、CQ时产生资源竞争,导致硬件描述符写入混乱或者状态异常。你所有RDMA接口的调用都由单个工作线程串行执行,不存在并发访问RDMA资源的场景,锁本身不会触发竞争,移除后不会出现状态不一致的问题。
需要满足两个前提确保安全:
- 所有RDMA硬件资源(QP、CQ、MR、PD等)的初始化、销毁操作要么也由该工作线程完成,要么你自行保证这类操作和正常接口调用的时序互斥
- 应用线程和工作线程之间的共享队列同步逻辑已经自行实现,不会出现队列生产消费的竞争问题
多线程专属QP场景的无锁最优方案
这种场景下不需要依赖pthread自旋锁,最优改造方案如下:
- 首先确保每个线程的专属QP、配套CQ、PD等资源和其他线程完全隔离,没有跨线程共享的RDMA资源上下文
- 改造驱动锁逻辑:如果原有自旋锁是和QP/CQ资源绑定的细粒度锁,只需要在创建QP/CQ时新增单线程独占标记,调用
post_send/poll_cq等接口时检查标记,命中则直接跳过锁的获取和释放步骤即可;如果原有锁是设备级的粗粒度锁,直接将锁替换为QP/CQ级的锁或者直接移除即可,因为你的业务逻辑已经保证了不会有并发访问 - 要是不想大幅修改驱动代码,也可以直接复用Verbs接口的无锁扩展能力,创建QP时传入单线程独占的标识,驱动原生就会跳过对应接口的锁操作
内容的提问来源于stack exchange,提问作者Demy
相关产品推荐
相关产品推荐

