一旦WR发布到QP的SQ或RQ,通常被解释为Work Queue Entry(WQE)。SQ与RQ有时会被称为工作队列(WR)。本文主要介绍RDMA中有关WR、WQE以及CQE的相关内容。
1 WRs
1.1 WRs Posted to SQ
software将WR发布至QP的SQ,以便与远端CA中相同类型的QP发起消息传输。通过执行verb调用的Post Send Request ,将WR发布到SQ。
可以发布给QP的SQ的WR类型,取决于QP的类型:
- Message Send operation。支持RC、RD、UC、UD、以及Raw QP。
- RDMA Write operation。支持UC、RC、以及RD QP。
- RDMA Read operation。支持RD、RC QP。
- Atomic operations。支持RD、RC QP。
- Memory Window Bind operation。支持RC、UC、以及RD QP。
- Resync operation is atypical。支持RD QP。Resync operation不是由software向QP的SQ发布WR发起的,而是发生错误时,由EEC硬件自动启动。需要Resync时,EEC的Send Logic自动启动。
注意,Raw QP只支持Send操作。
1.2 WRs Posted to RQ
software将WR发送到QP的RQ,以便处理由远端QP的SQ Logic发布的两种入站消息传输请求。通过执行Post Receive Request verb,将WR发布到RQ。发布到RQ的WQE只能指定一种操作类型,即Receive操作。
software将WR发布到QP的RQ(一旦被发布,即被称为WQE),以处理接收远端QP的SQ Logic发送的两种message类型之一:
- Inbound Message Send Operation。顶部RQ WQE含有Scatter Buffer List,该列表定义了CA本地内存中的一个或多个buffer,消息将被写入这些buffer中。当message的最后一个请求包的Payload被写入CA的本地内存时,RQ上的顶部WQE将退役,并在RCQ上创建CQE。如果最终数据包包含32bit即时数据,则将即时数据存入CQE中。此数据可用于通知目标QP关联的software,刚刚发送的message的性质。
- Inbound RDMA Write With Immediate message transfer operation。RDMA Write的最后请求包会包含32位即时数据在ImmDtETH字段,当最后一个请求包的Payload写入CA的本地内存,RQ上的顶部WQE将被取消,并在RCQ上创建CQE,32位的即时数据直接存储在CQE中。此数据可用于通知目标QP关联的software,刚刚发送的message的性质。
RQ WQE不会处理以下操作类型的请求包:
- RDMA Write Without Immediate message transfer operation。尽管此操作由目标QP的RQ Logic处理,但RQ WQE不用于定义入站message在CA的本地内存中的写入位置。起始的内存地址、传输长度和R_Key由远端QP的SQ Logic在消息传输的第一个请求包中提供。
- RDMA Read message transfer operation。这种类型的入站操作会被发布在一个特殊的队列中(RQ Logic中),该队列用于保存RDMA Read和Atomic操作。
- Atomic operation:
—Atomic Fetch and Add operation。
—Atomic Compare and Swap If Equal operation。
1.3 WR Content
1.3.1 Content of SQ WRs
Send Operation WR。所有QP类型都支持Send操作,执行Post Send Request verb时提供输入参数见下表。
WR Element | QP Type Applicability | Required | Description |
---|---|---|---|
HCA Handle | All | Yes | 标识目标HCA。执行Open HCA verb返回。 |
QP Handle | All | Yes | 标识目标HCA。执行Create QP verb返回。 |
WR ID | All | Yes | 64-bit,software为该WR分配唯一标识符,储存在操作结束时创建的CQE中。 |
Operation type | All | Yes | Send |
CQE generation indicator | All | Yes,if... | QP设置为仅在WR请求时生成CQE。 |
Gather Buffer List | All | Yes | 包含要发送的message的CA本地内存缓存区列表,包括: ● 列表长度(buffer数量)。 ● 每个buffer的虚拟起始地址。 ● 每个buffer的长度。 ● 与每个buffer关联的L_Key。 |
Number of buffers | All | Yes | 列表中Gather Buffer的数量(0为有效)。 |
Immediate Data Indicator | RC、UC、UD、RD.NA for Raw | Yes | 指示最后一个请求包中是否包含即时数据在ImmDtETH字段中。 |
Immediate Data | RC、UC、UD、RD.NA for Raw | No | 32-bit即时数据。 |
Fence Indicator | RC、RD | No | 如果设置,在此WR之前发布到SQ中的RDMA Read或Atomic Wr必须先完成后,才能处理此WR。 |
Address Handle | UD | Yes | 标识目的端口地址(DLID),SL,Maximum Static Rate,Source Path Bits。如果目的端口不在同一子网中,还包括DGID、FlowLabel、TClass、HopLimit、与SGID index。 |
DLID | Raw | Yes | 16-bit。子网内的目的端口。 |
Source Path Bits | Raw | Yes | 传输时,链路层从传输层接收报文,并使用该值在报文的LRH:SLID字段插入正确的端口LID地址。 |
SL | Raw | Yes | 4-bit。该子网使用的QoS。 |
Destination QPN | RD、UD | Yes | 24-bit。Self-explanatory。 |
Q_Key | RD | Yes | 32-bit。当WR发布到RD/UD QP的SQ时,software提供分配给目标QP的Q_Key。Q_Key插入出站请求包: ● 如果WR的Q_Key msb=0,则在报文的BTH:Q_Key中插入该Q_Key。 ● 否则,报文的BTH:Q_Key中插入该本地QP的Q_Key。 |
EECN of local EEC | RD | Yes | 24-bit。这是本地EEC的EECN,通过它发送消息,是RDC ID。 |
Solicited Event indicator | All | Yes | 告诉QP的SQ Logic是否在消息的最后一个请求包中设置BTH:SE位。 |
Ethertype | Raw Ethertype | Yes | 16-bit。告诉SQ Logic在请求包的RWH:EtherType字段中指示什么协议类型。 |
Maximum Static Rate | Raw | Yes | 此值为包间延迟,定义了向目的QP发送数据包之间必须观察的间隔。 |
RDMA Write Operation WR。UC、RC、RD支持。执行Post Send Request verb时提供以下输入参数。
WR Element | QP Type Applicability | Required | Description |
---|---|---|---|
HCA Handle | UC、RC、RD | Yes | 标识目标HCA。执行Open HCA verb返回。 |
QP Handle | UC、RC、RD | Yes | 标识目标HCA。执行Create QP verb返回。 |
WR ID | UC、RC、RD | Yes | 64-bit,software为该WR分配唯一标识符,储存在操作结束时创建的CQE中。 |
Operation type | UC、RC、RD | Yes | RDMA Write。 |
CQE generation indicator | UC、RC、RD | Yes,if... | QP设置为仅在WR请求时生成CQE。 |
Gather Buffer List | UC、RC、RD | Yes | 包含要发送的message的CA本地内存缓存区列表,包括: ● 列表长度(buffer数量)。 ● 每个buffer的虚拟起始地址。 ● 每个buffer的长度。 ● 与每个buffer关联的L_Key。 |
Number of buffers | UC、RC、RD | Yes | 列表中Gather Buffer的数量(0为有效)。 |
Immediate Data Indicator | UC、RC、RD | Yes | 指示最后一个请求包中是否包含即时数据在ImmDtETH字段中。 |
Immediate Data | UC、RC、RD | No | 32-bit即时数据。仅设置即时数据指示位时需要。 |
Fence Indicator | RC、RD | No | 如果设置,在此WR之前发布到SQ中的RDMA Read或Atomic Wr必须先完成后,才能处理此WR。 |
Destination QPN | RD | Yes | 24-bit。Self-explanatory。 |
Q_Key | RD | Yes | 32-bit。当WR发布到RD QP的SQ时,software提供分配给目标QP的Q_Key。Q_Key插入出站请求包: ● 如果WR的Q_Key msb=0,则在报文的BTH:Q_Key中插入该Q_Key。 ● 否则,报文的BTH:Q_Key中插入该本地QP的Q_Key。 |
EECN of local EEC | RD | Yes | 24-bit。这是本地EEC的EECN,通过它发送消息,是RDC ID。 |
Virtual Address(VA) | UC、RC、RD | Yes | 64-bit虚拟起始内存地址,即数据写入远端CA内存的地址。放在“first”请求包中的RETH中。 |
R_Key | UC、RC、RD | Yes | 32-bit远程访问秘钥,标识发送方在目标内存区域内的访问权限,放在“first”请求包中的RETH中。 |
Transfer length | UC、RC、RD | Yes | 32-bit,最多2GB。放在“first”请求包中的RETH中。 |
Solicited Event indicator | UC、RC、RD | Yes | 只有生成CQE时需要,告诉QP的SQ Logic是否在消息的最后一个请求包中设置BTH:SE。 |
RDMA Read Operation WR。RC、RD支持。执行Post Send Request verb时提供以下输入参数。
WR Element | QP Type Applicability | Required | Description |
---|---|---|---|
HCA Handle | RC、RD | Yes | 标识目标HCA。执行Open HCA verb返回。 |
QP Handle | RC、RD | Yes | 标识目标HCA。执行Create QP verb返回。 |
WR ID | RC、RD | Yes | 64-bit,software为该WR分配唯一标识符,储存在操作结束时创建的CQE中。 |
Operation type | RC、RD | Yes | RDMA Read。 |
CQE generation indicator | RC、RD | Yes,if... | QP设置为仅在WR请求时生成CQE。 |
Scatter Buffer List | RC、RD | Yes | 包含要发送的message的CA本地内存缓存区列表,包括: ● 列表长度(buffer数量)。 ● 每个buffer的虚拟起始地址。 ● 每个buffer的长度。 ● 与每个buffer关联的L_Key。 |
Number of buffers | RC、RD | Yes | 列表中Gather Buffer的数量(0为有效)。 |
Fence Indicator | RC、RD | No | 如果设置,在此WR之前发布到SQ中的RDMA Read或Atomic Wr必须先完成后,才能处理此WR。 |
Destination QPN | RD | Yes | 24-bit。Self-explanatory。 |
Q_Key | RD | Yes | 32-bit。当WR发布到RD QP的SQ时,software提供分配给目标QP的Q_Key。Q_Key插入出站请求包: ● 如果WR的Q_Key msb=0,则在报文的BTH:Q_Key中插入该Q_Key。 ● 否则,报文的BTH:Q_Key中插入该本地QP的Q_Key。 |
EECN of local EEC | RD | Yes | 24-bit。这是本地EEC的EECN,通过它发送消息,是RDC ID。 |
Virtual Address(VA) | RC、RD | Yes | 64-bit虚拟起始内存地址,即数据写入远端CA内存的地址。放在“first”请求包中的RETH中。 |
R_Key | RC、RD | Yes | 32-bit远程访问秘钥,标识发送方在目标内存区域内的访问权限,放在“first”请求包中的RETH中。 |
Transfer length | RC、RD | Yes | 32-bit,最多2GB。放在“first”请求包中的RETH中。 |
Solicited Event indicator | RC、RD | Yes | 只有生成CQE时需要,告诉QP的SQ Logic是否在消息的最后一个请求包中设置BTH:SE。 |
Atomic Fetch and Add WR。RC、RD支持。执行Post Send Request verb时提供以下输入参数。
WR Element | QP Type Applicability | Required | Description |
---|---|---|---|
HCA Handle | RC、RD | Yes | 标识目标HCA。执行Open HCA verb返回。 |
QP Handle | RC、RD | Yes | 标识目标HCA。执行Create QP verb返回。 |
WR ID | RC、RD | Yes | 64-bit,software为该WR分配唯一标识符,储存在操作结束时创建的CQE中。 |
Operation type | RC、RD | Yes | Atomic Fetch and Add。 |
CQE generation indicator | RC、RD | Yes,if... | QP设置为仅在WR请求时生成CQE。 |
Fence Indicator | RC、RD | No | 如果设置,在此WR之前发布到SQ中的RDMA Read或Atomic Wr必须先完成后,才能处理此WR。 |
Destination QPN | RD | Yes | 24-bit。Self-explanatory。 |
Q_Key | RD | Yes | 32-bit。当WR发布到RD QP的SQ时,software提供分配给目标QP的Q_Key。Q_Key插入出站请求包: ● 如果WR的Q_Key msb=0,则在报文的BTH:Q_Key中插入该Q_Key。 ● 否则,报文的BTH:Q_Key中插入该本地QP的Q_Key。 |
EECN of local EEC | RD | Yes | 24-bit。这是本地EEC的EECN,通过它发送消息,是RDC ID。 |
Virtual Address(VA) | RC、RD | Yes | 64-bit虚拟起始内存地址,即数据写入远端CA内存的地址。放在“first”请求包中的RETH中。 |
R_Key | RC、RD | Yes | 32-bit远程访问秘钥,标识发送方在目标内存区域内的访问权限,放在“first”请求包中的RETH中。 |
Add Data | RC、RD | Yes | 64-bit添加数据。目标QP的RQ Logic读取目标位置,添加数据,并将结果返回内存。放置在请求包的AtomicETH中。 |
Scatter Buffer List | RC、RD | Yes | 指定单个8-byte的本地内存缓存区,即返回读数据将写入的位置,该列表由单个条目组成,指定: ● 列表长度=1。 ● buffer的虚拟起始地址。 ● buffer的长度(8-bytes)。 ● buffer关联的L_Key。 |
Number of buffers | RC、RD | Yes | Scatter Buffer List中buffer的数量(必须为1)。 |
Atomic Compare and Swap If Equal WR。RC、RD支持。执行Post Send Request verb时提供以下输入参数。
WR Element | QP Type Applicability | Required | Description |
---|---|---|---|
HCA Handle | RC、RD | Yes | 标识目标HCA。执行Open HCA verb返回。 |
QP Handle | RC、RD | Yes | 标识目标HCA。执行Create QP verb返回。 |
WR ID | RC、RD | Yes | 64-bit,software为该WR分配唯一标识符,储存在操作结束时创建的CQE中。 |
Operation type | RC、RD | Yes | Atomic Compare and Swqp If Equal。 |
CQE generation indicator | RC、RD | Yes,if... | QP设置为仅在WR请求时生成CQE。 |
Fence Indicator | RC、RD | No | 如果设置,在此WR之前发布到SQ中的RDMA Read或Atomic Wr必须先完成后,才能处理此WR。 |
Destination QPN | RD | Yes | 24-bit。Self-explanatory。 |
Q_Key | RD | Yes | 32-bit。当WR发布到RD QP的SQ时,software提供分配给目标QP的Q_Key。Q_Key插入出站请求包: ● 如果WR的Q_Key msb=0,则在报文的BTH:Q_Key中插入该Q_Key。 ● 否则,报文的BTH:Q_Key中插入该本地QP的Q_Key。 |
EECN of local EEC | RD | Yes | 24-bit。这是本地EEC的EECN,通过它发送消息,是RDC ID。 |
Virtual Address(VA) | RC、RD | Yes | 64-bit虚拟起始内存地址,即数据写入远端CA内存的地址。放在“first”请求包中的RETH中。 |
R_Key | RC、RD | Yes | 32-bit远程访问秘钥,标识发送方在目标内存区域内的访问权限,放在“first”请求包中的RETH中。 |
Swap Data | RC、RD | Yes | 64-bit交换数据。放置在请求包的AtomicETH中。目标QP的RQ Logic读取目标位置,将其内容与Compare Data进行比较,如果相等,将Swap Data写回内存,原始数据在响应包中返回。 |
Compare Data | RC、RD | Yes | 64-bit的Compare Data。 |
Scatter Buffer List | RC、RD | Yes | 指定单个8-byte的本地内存缓存区,即返回读数据将写入的位置,该列表由单个条目组成,指定: ● 列表长度=1。 ● buffer的虚拟起始地址。 ● buffer的长度(8-bytes)。 ● buffer关联的L_Key。 |
Number of buffers | RC、RD | Yes | Scatter Buffer List中buffer的数量(必须为1)。 |
Memory Window Bind WR。RC、UC、RD支持。执行Bind Memory Window verb时提供以下输入参数。
WR Element | QP Type Applicability | Required | Description |
---|---|---|---|
HCA Handle | RC、UC、RD | Yes | 标识目标HCA。执行Open HCA verb返回。 |
QP Handle | RC、UC、RD | Yes | 标识目标HCA。执行Create QP verb返回。 |
WR ID | RC、UC、RD | Yes | 64-bit,software为该WR分配唯一标识符,储存在操作结束时创建的CQE中。 |
Memory Window Handle | RC、UC、RD | Yes | 由Allocate Memory Window verb返回 |
R_Key | RC、UC、RD | Yes | 当前与内存窗口关联的R_Key(远程访问秘钥),由Allocate Memory Window verb返回。 |
Memory Region Handle | RC、UC、RD | Yes | 标识窗口将绑定到的区域。由Register Memory Region,Register Physical Memory Region,Reregister Memory Region,Reregister Physical Memory Region,Register Shared Memory Region verb返回。 |
L_Key | RC、UC、RD | Yes | 与窗口相关联的内存区域的本地访问秘钥。由Register Memory Region,Register Physical Memory Region,Reregister Memory Region,Reregister Physical Memory Region,Register Shared Memory Region verb返回。 |
Virtual Address(VA) | RC、UC、RD | Yes | 绑定范围的第一个字节的地址,最大位宽64-bit。 |
Length | RC、UC、RD | Yes | 以字节为单位绑定的范围长度。 |
Access Control | RC、UC、RD | Yes | 除特别注明外,以下可任意组合选择: ● 使能远程写访问(要求区域具有写访问权限)。 ● 使能远程读访问。 ● 使能远程原子操作访问,要求区域具有本地写访问权限。 |
CQE generation indicator | RC、UC、RD | Yes,if... | QP设置为仅在WR请求时生成CQE。 |
Fence Indicator | RC、RD | No | 如果设置,在此WR之前发布到SQ中的RDMA Read或Atomic Wr必须先完成后,才能处理此WR。 |
1.3.2 Content of RQ WRs
使用Post Receive Request verb将WR发布到QP的RQ。唯一可指定的此操作类型是Receive操作,执行Post Receive Request verb时提供的输入参数如下。
WR Element | QP Type Applicability | Required | Description |
---|---|---|---|
HCA Handle | All | Yes | 标识目标HCA。执行Open HCA verb返回。 |
QP Handle | All | Yes | 标识目标HCA。执行Create QP verb返回。 |
WR ID | All | Yes | 64-bit,software为该WR分配唯一标识符,储存在操作结束时创建的CQE中。 |
Operation type | All | Yes | Receive。 |
Scatter Buffer List | All | Yes | 两种可能: 1. 从远端QP接收到Send操作的message data时,将写入CA的本地内存缓冲区的列表,包括: ● 列表长度。 ● 每个buffer的虚拟起始地址。 ● 每个buffer的长度。 ● 与每个buffer关联的L_Key。 2. 空Scatter Buffer List可用于处理入站的RDMA Write With Immediate message。 注,对于UD QP,Scatter Buffer List引用的缓冲区的前40个字节包含传入消息的GRH。如没有GRH,前40字节内容是未定义的。GRH的存在由CQE中的位表示。 |
Number of buffers | All | Yes | Scatter Buffer List的数量(0为有效)。 |
2 WQE Execution and Completion Order
2.1 SQ WQE Execution and Completion Order
无论QP类型如何,QP的SQ上发布的消息传输请求(WQE)总按它们发布的顺序一次执行一个,不乱序执行。完成也按发布的顺序完成。
2.2 RQ WQE Execution and Completion Order
对于所有服务类型,RQ WQE总按software发布顺序开始执行。WR被发布到QP的RQ用于处理两种类型的入站消息传输:
- Send。
- RDMA Write With Immediate。
其他类型不由RQ WQE处理。
每个入站Send或RDMA Write With Immediate到达QP的RQ Logic时,RQ Logic访问RQ顶部的WQE:
- 如果是Send操作,WQE的Scatter Buffer List决定message写入本地内存的位置。接收到请求包时,每个请求包的Payload被写入内存。在接受到消息的最后一个请求包后,将最后一个数据的Payload写入内存,然后将RQ WQE退役,并在RQ的CQ上创建CQE。如果最终数据包包含ImmDtETH,则ImmDtETH中包含32-bit的即时数据。
- 如果是RDMA Write With Immediate,每个请求的Payload将被写入第一个请求包中RETH中指示的地址信息。一旦接收到最后一个请求包,将最后一个Payload写入内存,RQ WQE退役,并在RQ的CQ上创建CQE。在最后一个请求包的ImmDtETH中包含32-bit的即时数据存储在CQE中。
整个Send或RDMA Write With Immediate被接收或处理后,RQ Logic会前进到下一个WQE来处理下一个入站的Send或RDMA Write With Immediate。
QP的RQ Logic不会移动到下一个RQ WQE,直到它完成当前的Send或RDMA Write With Immediate操作,除非RD服务。
RC、UC、UD RQ WQE的完成顺序
对于RC、UC或UD服务类型,QP的RQ Logic将不会移动到下一个RQ WQE,直到它完成当前的Send或RDMA Write With Immediate,RQ WQE总是以发布相同的顺序完成。
RD RQ WQE的完成顺序
RD RQ WQE可以乱序完成。考虑以下场景:
- 使用任意CA中的任何RD QP的目标QP,CA中存在两个独立的RDC(即两个本地EEC)。
- 远端RD QP通过由两个CA的上层EEC组成的RDC,启动Send操作,向RD QP发送100个报文的消息。
- 当发送的第一个请求包被送到目的CA的上层EEC的RQ Logic时,EEC的RQ Logic从目的RD QP的RQ中读取顶部条目并将其保存在EEC中。其中包含Scatter Buffer List,该列表定义了传入消息在CA的本地内存中写入的位置。将WQE复制到EEC将允许RD QP的RQ在另一个入站消息通过另一个RDC出现将RD指针推进下一个WQE。
- 使用RD QP的RQ WQE副本中的信息,EEC的Receive Logic将发送消息的第一个请求包的Payload存储在CA的本地内存中。
- 另一个远端RD QP也启动了一个发送操作,向同一个目标RD QP的RQ Logic发送25报文的消息,但使用由两个CA中的每个底部EEC组成的RDC。
- 当Send的第一个请求包被送到目的CA的下层EEC的Receive Logic时,EEC的Receive Logic从目标RD QP的RQ中读取下一个WQE,并将其保存在下层EEC中。其中包含Scatter Buffer List,该列表定义传入消息在CA的本地内存中的写入位置。
- 使用RD QP的RQ WQE副本中的信息,EEC的Receive Logic将此发送消息的第一个请求包的Payload存储在CA的本地内存中。
- 两个EEC的Receive Logic使用各自RQ WQE的副本来储存从远端EEC到达的入站消息请求包。
- 本例中,第二个RQ WQE将在第一个WQE之前完成,因为它只需处理25个传入的请求包,则第一个需要处理100个。
其中,RDC(Reliable Datagram Channel)是两个RD EEC的关联。一个RDC可以从许多RD QP中复用可靠的数据报。
3 RDMA Read Relaxed Ordering Rules
3.1 Write Can Complete Faster Than Reads
由于以下原因,QP完成对其本地内存的写操作通常比从其本地内存读取数据要快:
- Inbound memory writes(Send或RDMA Write):入站内存写入本地内存经常通过将内存的写数据发布到一个快速发布的写缓存区内存来处理,快速存取缓存区吸收数据以及要写入的地址,因此有责任随后将数据写入内存。从请求写入内存的设备(QP)角度来看,内存写入非常迅速地完成,QP可以继续进行另一个操作。
- Memory read:另一方面内存读取可能需要相当长的一段时间。例如,假设QP的RQ Logic刚刚锁定了一个RDMA Read请求,从其本地内存中读取数据,并将其发送回请求方QP的SQ Logic,以一系列一个或多个RDMA Read响应包。为执行读取,CA Logic必须仲裁内存所在总线的所有权,然后发出一系列一个或多个内存读取事务以从内存中获取数据。总线仲裁的时间量以及内存访问时间可能相当长。
3.2 An Example of Relaxed RDMA Ordering
场景:
向响应方QP的RQ Logic发出三个请求:
- 一个RDMA Read请求,有三个返回的响应包。
- 一个RDMA Read请求,有一个返回的响应包。
- 携带单个写数据包的RDMA Write请求。
规则:
RQ Logic接收两个读请求。放宽RDMA Read排序规则,允许响应方开始执行一个或多个在RDMA Read请求之后(读取被执行之前)到达的Send或RDMA Write请求。但在执行RDMA Read之后的任何请求之前,必须验证RDMA Read请求的报头字段。即RQ Logic必须验证RETH中指定的VA、R_Key以及传输长度是有效的。虽然在读取之前执行,但在RDMA Read之后收到的请求的响应必须在未完成的RDMA Read响应全部返回后才能返回。
事件顺序:
RQ Logic执行以下行为:
- 接收第一个读请求,验证VA、R_Key以及长度是否有效,但还没有从本地内存开始读操作(也许开始仲裁本地内存所在总线的所有权)。
- 接收第二个请求,验证VA、R_Key以及长度是否有效,但还没有从本地内存开始读操作。
- 接收RDMA Write请求,立即执行对本地内存的写操作。实际上写数据很快被吸收到快速发布的内存写缓存区中。
- 虽然已完成写操作,但在它完成之前的两次读操作之前不允许返回Ack。
- 执行第一次读取并返回三个读取数据包。请求包的SQ Logic退役第一次读取的WQE。
- 执行第二次读取并返回一个读取数据包。请求包的SQ Logic退役第二次读取的WQE。
- 返回写操作的Ack 。接收到Ack后,请求包的SQ Logic退役写请求的WQE。
4 Completion Queues(CQs) and CQEs
4.1 Purpose of CQ
消息传输完成后,无论是否有错误,WQE都将从相应队列中退出,并在相应队列的CQ中记录完成通知。CQ中创建的条目称为完成队列条目,或CQE(发音“cookie”)。每个CQE包含64位WR ID,该ID由software分配给发送到SQ或RQ的原始消息传输WR。这允许software将CQE与先前发布的消息传输WR关联起来。
4.2 CQ-Related Verbs
与CQ相关的verb有:
- Create CQ。
- Query CQ。
- Resize CQ。
- Destory CQ。
- Set Completion Event Handle。
- Poll For Completion。
- Request Completion Notification。
(1)Create CQ
输入参数。调用方指定以下输入参数:
- HCA句柄。
- CQ大小的最小值。
采取行为。HCA尝试创建符合请求大小的CQ,如果大于HCA所支持的大小,则返回错误,否则HCA至少创建满足请求大小的CQ。HCA为新创建的CQ分配一个唯一的句柄。
输出参数。成功创建时,verb返回以下参数:
- 新创建的CQ句柄。
- CQ的实际大小。
(2)Query CQ
输入参数。调用方指定以下输入参数:
- HCA句柄。
- CQ句柄。
采取行为。verb返回指定CQ的大小。
输出参数。如果成功完成,verb将返回以下输出参数,即CQ的实际大小。
(3)Resize CQ
输入参数。调用方指定以下输入参数:
- HCA句柄。
- CQ句柄。
- 新的,理想的CQ大小。
采取行为。verb将CQ大小调整为至少是新请求的大小。
输出参数。成功完成时,verb返回以下输出参数。
- 调整后的CQ大小。
HCA可能不支持动态调整CQ大小。software可通过执行Query HCA verb来确定HCA功能。
(4)Destroy CQ
输入参数。调用方指定以下输入参数:
- HCA句柄。
- CQ句柄。
采取行为。verb破坏所指示的CQ。如CQ仍然与一个或多个WQ相关联,则返回错误。
输出参数。成功完成时,verb返回成功或失败。
(5)Set Completion Event Handle
输入参数。调用方指定以下输入参数:
- HCA句柄。
- 当CQE被发布到任何请求完成通知的CQ时,要调用处理器的入口点。
采取行为。verb向HCA的设备驱动程序注册指定的处理程序。然后,每次HCA指示(通过中断)CQE已被发布到CQ,CQE发布通知已被请求时,驱动程序调用处理程序。
输出参数。成功完成时,verb返回成功或失败。
(6)Poll for Completion
输入参数。调用方指定以下输入参数:
- HCA句柄。
- CQ句柄。
采取行为。verb检查指定CQ以查找新发布的CQ。如果存在,将最早未处理的CQE返回调用者,如果没有新的CQE被发布到指定的CQ,返回错误。
输出参数。成功完成时,verb返回最近发布到指定CQ的CQE。
(7)Request Completion Notification
输入参数。调用方指定以下输入参数:
- HCA句柄。
- CQ句柄。
- 请求通知完成的类型(下一个完成或请求完成)。
采取行为。verb检查指定CQ添加到请求完成通知的CQ列表中,当指定类型的CQE(下一个完成或请求完成)被发布到指定CQ时,将调用完成时间处理程序。
输出参数。成功完成时,verb返回成功或失败。
4.3 CQ/WQ Association
verb创建一个CQ,并向调用者返回一个CQ句柄。然后调用Create QP verb时,将指定QP的SQ和RQ与CQ句柄相关联。一个CQ可以同时关联同一或不同QP上的一个或多个WQ (SQ和/或RQ)。特殊的SMI和GSI QP (QPO和QP1)可以共享一个CQ,但它们不能与任何其他类型的QP共享一个CQ。
4.4 Notification of CQE Posting
software可以注册,以便在消息传输完成时自动通知。通过以下方式完成:
- 执行Set Completion Event Handle verb来注册一个处理程序,当CQE被发布到CQ时调用该处理程序。
- 执行Request Completion Notification verb,指定CQ和要完成通知的完成类型。
- 当指定类型的下一个CQE被发布到已请求通知的CQ时,将调用处理程序,将HCA句柄和CQ句柄传递给处理程序,这些句柄标识所期望类型的CQE被提交CQ。
- 在处理程序中,执行CQ的Poll For Completion verb。
- verb从指定的CQ返回最老的未处理的CQE。
4.5 CQE Contents
如果消息传输不成功,则一些CQE内容未定义(如下所述)。CQE的内容:
- 来自WR的64-bit WR ID。无论消息传输的完成状态如何,这始终有效。
- WR中指定的操作类型。有效的类型有:
—Send(对于发送到SQ的WR)。
—RDMA Write(对于发送到SQ的WR)。
—RDMA Read(对于发送到SQ的WR)。
—Compare and Swap If Equal(对于发送到SQ的WR)。
—Atomic Fetch and Add(对于发送到SQ的WR)。
—Memory Window Bind(对于发送到SQ的WR)。
—Send Data Received(对于发送到SQ的WR)。
—RDMA Write with Immediate Data received(对于发送到SQ的WR)。
- 传输的字节数。
- 如果CQE中存在立即数据,则立即数据指示位被设置用于指示。
- 远程节点地址和QP。注意,这只适用于RD或UD QP。返回的信息为:
—发送报文的端口的LID地址。
—报文的SL。
—来自报文DETH:SrcQP域段的Source QPN。
—本地EECN(仅适用于RD,不适用于UD)。
—数据包到达端口的LID地址(仅适用于UD,不适用于RD)。
- GRH 当前指示位(仅当这是一个UD QP时才出现):
—如果该位设置为1,则Scatter Buffer的前40个字节包含传入消息的GRH。
—如果该位被清除为零,则Scatter Buffer的前40个字节是未定义的。实际的消息数据在前40字节之后开始。
- 如果这是一个GSI QP,则在CQE中存在P_Key索引。
- 消息传输的完成状态反映在CQE的Status字段中。
- 释放的资源计数。这只适用于RD RQ。无论消息传输的完成状态如何,它总是有效的。如果count = 0,则表示在生成该CQE时没有RQ WQE被退役(协议是这样说的,但是如果没有RQ WQE被退役,那么该CQE是如何生成的?)。如果count>0,则software可以认为该count表示从RD RQ中退役的WQE数量。这对于software跟踪可用的未完成WR的数量非常有用。
4.6 Solicited and Unsolicited Event
当Post Send Request verb被执行以向SQ发布Send或RDMA Write With Immediate WR时,请求事件指示器在WR中指定:
- 如果= 0,则Send、Send With Immediate或RDMA Write With Immediate消息传输的“Last”或“Only”请求报文中的BTH:SE位= 0。
- 如果= 1,则Send、Send With Immediate或RDMA Write With Immediate消息传输的“Last”或“Only”请求报文中的BTH:SE位= 1。
执行Request Completion Notification verb以请求在将指定类型的下一个CQE(请求或未请求事件)发布到指定的CQ时,调用CQ事件处理程序。
请求事件
当以下任一情况发生时,将发生请求事件:
- BTH:SE位设置为1的入站Send或RDMA Write With Immediate message将导致成功的消息传输,CQE被发布到与RQ相关的CQ。
- 不成功的消息传输CQE被发布到与RQ相关联的CQ。
未经请求事件
当以下任一情况发生时,将发生未经请求事件:
- 任何其他成功的消息传输,RQ CQE被发布到与RQ相关的CQ。
- 任何成功的消息传输,SQ CQE被发布到与RQ相关的CQ。