【CXL 3.0】CXL.mem协议中的反向无效消息与响应
文章目录
-
- [1. Back-Invalidation Snoop](#1. Back-Invalidation Snoop)
- [2. BISnp消息格式特点](#2. BISnp消息格式特点)
- [3. BIRsp消息格式特点](#3. BIRsp消息格式特点)
- [4. 消息处理示例](#4. 消息处理示例)
CXL.mem协议在3.0版本中增加了反向无效消息,由设备主动发起,然后主机进行响应。(这里面这个主动发起,可以理解在需要缓存处理的时候设备主动发起,但是需要触发情况,主动发起,不是想发就发的意思)
1. Back-Invalidation Snoop
为什么叫反向无效,为什么在CXL 3.0中CXL.mem协议引入两个通道,来支持反向无效消息?
对于反向无效监听,在CXL 3.0中规范中有解释

为了使设备 能够实现一个用于跟踪主机缓存的包容性监听过滤器,设备会发起 一个回写失效监听(BISnp)来更改主机的缓存状态,也就是在设备中有一个Snoop filter,记录主机中缓存了设备中的内存。
- inclusive snoop filter:包容性监听过滤器,监听主机缓存,缓存行粒度,容量有限
- 不支持68B flit模式
2. BISnp消息格式特点
注意S2M BISnp消息格式,根据256B Flit模式和PER FLit模式,消息可能不同,差别在于采用PBR FLit模式,消息中有12bit SPID和12bit的DPID。
地址是主机物理地址,Host Physical address,其中的BI-ID是对应的设备的唯一ID,所以在有SPID和DPID的情况下,不需要使用BI-ID,BITag是消息的编号,和CXL.mem协议读写消息类似。

Opcode 4bit,定义了6种不同的类型

通俗解释
设备发送BISnp请求,主机回复BIRsp响应,这个消息就是为了控制主机缓存行状态,所以主机回复Opcode就是对应的主机的缓存行的状态,
3. BIRsp消息格式特点
同样是根据256B FLit模式和PBR模式消息格式有所不同,
PBR FLit模式下,在BIRsp消息中,没有address和SPID,

从BIRsp消息的Opcode中可以看出,是为了指示缓存行状态,每个Opcode对应一个缓存行状态。

4. 消息处理示例
利用3.0规范中的BISnp Blocking Example,来描述解析BISnp消息的处理过程,具体流程如下图所示:

下面说明这个图的过程,还有block出现的原因
首先Snoop filter大小是有限的,设备监听过滤器SF满了,新的读请求没法处理,必须先淘汰旧条目、做反向失效保证一致性。
图中的消息传递内容可以分为6个阶段
1阶段:主机发送读请求,SF Miss,SF满
-
主机想要读取设备内存X地址的数据,设备DCOH收到一个MemRd X(对设备内存地址X的读请求),请求携带MV=A,表示需要为地址X分配SF条目
-
DCOH查询本地SF,结果是SF Miss X:地址X在SF中没有对应条目,必须分配新条目才能处理后续一致性逻辑。
-
此时SF已经完全占满,没有空闲条目。因此必须执行SF Victim Y:从SF中选择一个旧条目(地址Y)删除,为X来创造空间。
-
要安全淘汰地址Y的SF条目,必须先保证:主机侧所有缓存都不再缓存地址Y的副本,否则出现数据一致性错误。因此设备发起反向失效流程,也就是BISnpInv。
2阶段:DCOH发起内存读,同时发起反向无效消息
-
设备DCOH向主机发送BISnpInv Y,要求主机完成地址Y的全局无效化、数据回写。
-
Blocking:设备同时向设备内存Dev Mem 发起MemRd X,去读取地址X的原始数据。
-
但设备内存返回的读数据(Data),被设备直接hold off(阻塞、挂起)了,图中标注了Read Response held off waiting for BISnp to complete。阻塞的根本原因:SF还中的Y还有删除,地址X的SF条目还没分配成功,设备无法完成这个读请求的一致性闭环,必须等BISnpInv全流程走完,才能继续处理。
3阶段:主机处理 BISnpInv,完成 Peer Cache 的无效化
-
主机收到BISnpInv Y,向持有地址Y副本的Peer Cache发送SnpInv Y,要求其无效化地址Y的缓存行。
-
Peer Cache中,地址Y的缓存行是M(Modified),也就是缓存里的数据是最新的,和设备内存里的不一致,必须回写。
-
Peer Cache收到无效化请求后,把地址Y的缓存行从M状态改为I状态(无效),也就是Y从M状态变为I状态,然后向主机回传RspIFwdM响应,同时把地址Y的数据一并发回给主机。
4阶段:主机完成脏数据回写,保证数据一致性
- 主机拿到Peer Cache回传的地址Y的脏数据,必须把这个最新数据写回设备内存的地址Y,否则设备内存里的Y是旧数据,引发错误。图中标注了Write of data required before BISnp can complete:这个写操作不完成,BISnp流程不能结束。
- 主机向设备DCOH发起MemWr Y写请求,把脏数据写入地址Y。
- 设备DCOH把写请求转发到Dev Mem,Dev Mem完成写入后,返回Cmp(完成响应),设备再把完成响应回传给主机,确认地址Y的数据已经成功写入。
5阶段:阶段 5:BISnp 流程完成,SF 腾出空间
- 主机确认:Peer Cache的地址Y已经无效化,脏数据也已经成功写回设备内存,地址Y的反向失效全流程完成。
- 主机向设备DCOH发送BIRspI,正式通知设备,地址Y的反向失效已经全部完成,可以安全淘汰SF里的Y条目了。
- 设备收到响应后,立刻删除SF中地址Y的条目,SF出现一个空闲条目。
6阶段:阻塞解除,完成最初的读请求
- SF有了空闲条目,设备立刻为地址X分配SF条目,也就是图中的SF Alloc X。
- 之前被挂起的地址X的读数据,现在可以正常处理了。主机向设备返回Cmp-E(读请求完成响应),同时把MemData(地址X的读数据)发送给请求的发起方。
- 流程结束,最开始的MemRd X读请求完成。