Deferrable Memory Write(DMWr)
背景简介:
DMWr是PCIe gen6中正式引入的一种TLP类型,PCIe设备可以通过DMWr机制,让多个software/virtual machines的请求共享一个work queue,并且因为不需要保序完成,不会对后续命令形成阻塞,可以从整体上提高性能和效率。
简单理解就是,系统上可以将对timing/latency和操作顺序不敏感的写操作与其他写操作区分开,在bus繁忙时优先服务哪些对时延和顺序敏感的写操作,从而可以更高效的利用系统的写带宽,此外,共享work queue的机制也可以在多个VM场景下减少对硬件资源的占用(主要应该是内存,如果有对这个应用背景更清楚的朋友,欢迎评论区补充)。
实现细节:
DMWr的TLP header的format和type编码如下图所示:

DMWr是non-posted mem write request,也就是一种memory写操作,但是需要对端返回completion;
与原子操作类似,DMWr要求操作过程保证原子性。在发送端,不能将一个DMWr操作进行拆分,接收侧需要按照原子操作进行地址写入,同时只能返回一个completion。


DMWr completers需要遵从以下规则:
1) functions需要正确配置Device Capabilities 2 Register中的DMWr Completer Supported和DMWr Lengths Supported;
2) 格式正确的DMWr请求,如果长度超出completer支持范围,或者操作地址越界,completer需要按照Completer Abort (CA)处理,并且不操作目标地址;
3) 支持DMWr Routing,但不支持DMWr completer的switch,如果收到DMWr请求,也按照Completer Abort (CA)处理,并且不操作目标地址;
4) 如果completer因为一些暂时性的原因无法完成操作,可以返回Request Retry Status (RRS)状态的Completion。Completer可以基于自己的具体实现决定什么场景下返回RRS completion;
5) Completer如果返回了Successful Completion (SC),则必须保证更新的memory粒度不小于64B或者request的size(取两者中较小的);
6) 多function的device,允许只有部分function支持DMWr操作;
7) 如果completer在操作memory过程中出现uncorrectable error,需要按照CA处理。
支持DMWr routing的RC或switch需要遵从以下规则:
1) RC或这switch ports需要正确设置DMWr Request Routing Supported(Device Capabilities 3 Register中)和DMWr Lengths Supported;
2) 如果一个switch的某个port支持DMWr routing,则所有的port都必须支持;
3) 如果DMWr的地址越界(比如分布在两个不同的destinations),RC或者switch需要直接返回UR completion;
4) RC对DMWr的P2P操作是否支持是optional的,协议不做具体要求;
5) 如果一个RC或者RP支持routing,但是路由的目标port不支持DMWr,也需要将DMWr当作UR处理。
DMWr Requesters需要遵从以下规则:
1) 需要正确设置Device Control 3 register中的DMWr Requester Enable bit;
2) 如果收到RRS completion,requester可以选择重发DMWr request,也可以不重发。
DMWr是带data的NP请求,按照PCIe序的规则,Posed请求可以越过NP请求,而且NP请求间也没有保序要求。基于此规则,completer可以延迟处理DMWr请求(所以叫deferrable memory write)。由于DMWr要求原子性,所以不推荐操作太长的数据(会导致性能问题)。
这里需要关注一下DMWr和atomicop的区别:
DMWr 的原子性 = 单条 DMWr TLP 载荷要么完整全部写入目标地址,要么完全不写入;外部任何其他事务永远看不到 "只写了一半" 的中间残缺状态 。 它只保证单次写包内部完整性 ,不锁定地址、不阻塞同地址其他读写、没有读 - 改 - 写复合逻辑。
DMWr 原子性(包完整性原子)
- 作用范围:单条 64B 写包内部;
- 地址锁:无地址排他锁;同一地址可同时穿插其他 MRd/MWr/DMWr;
- 操作语义:只有纯写入,没有读、运算、比较逻辑;
- 解决问题:保证加速器队列描述符不会残缺、不会出现半截非法任务;
- 并发缺陷:多设备同时写同一个队列入口,会发生覆盖丢失,无同步保护。
AtomicOp 原子性(地址排他 RMW 原子)
- 作用范围:目标内存地址全局总线锁;
- 地址锁:操作期间锁定目标地址,所有其他访问排队等待;
- 操作语义:单 TLP 完成「读原值→运算→写回→返回旧值」完整 RMW;
- 解决问题:多设备共享变量并发同步(计数器、自旋锁);
- 并发优势:硬件隔离竞争,不会丢失更新。