[RDMA]QP相关介绍(一)——QP Verbs

1 相关概念

QP由发送工作队列与接收工作队列组成,这两个工作队列总作为一对创建,并在其整个生命周期中保持这种状态。

QPN为QP的标识编号。

QPC是特定QP的信息,包括当前的WQE、PSN、传输参数等。

QP句柄由创建QP的操作返回,并作为其他QP操作的标识参数提供。

2 QP verbs概述

与QP创建、管理和销毁相关的verbs有:

  • Allocate RDD
  • Create QP
  • Modify QP
  • Query QP
  • Destroy QP
  • Deallocate RDD

2.1 Allocate and Deallocate RDD Verbs

执行Allocate RDD verb只对RD QP有必要。

2.2 Create QP Verb

执行Create QP verb以创建支持四种IBA传输服务类型之一的QP。输入参数是:

  • 标识在哪个HCA上创建QP的HCA句柄。执行Open HCA verb时返回该句柄。
  • 与QP的SQ和RQ相关联的CQ句柄。在执行Create CQ verb时返回句柄。
  • software预期发布到SQ或RQ上的最大数量的未完成WR(Work Request)。
  • software将在发布到SQ或RQ上的任何WR中指明Scatter Buffer或Gather Buffer的最大数量。
  • 与此QP相关的RDD(只适用RD QP)。
  • 为QP的SQ指定信号类型。有效的类型有:

       ——所有发布到SQ的工作请求总在完成时生成CQE。

       ——software为发布到SQ的每个WR中指定是否为成功完成生成CQE。

  • QP所属的PD(注意,该PD在之前执行Allocate RDD verb创建)。
  • 为此QP请求的IBA传输服务类型。有效的服务类型有RC、RD、UC和UD。

verb返回的输出参数:

  • 新创建的QP句柄。句柄用作随后执行Modify QPQuery QPDestroy QP verb的输入参数。
  • QPN。这是由verb分配的24bit的QPN,其用途如下:

       ——在RC和UC传输服务类型的连接建立过程中,HCA QP的QPN在建链的REQ message中提供给远端CA的CM。

       ——在向RD或UD的SQ发布WR时,目的QP的QPN会在WR内提供。

  • 支持的未完成SQE的实际数量。如果没有返回错误,则保证大于或等于请求的数量(这可能要求software增加SQ相关的CQ的大小)。
  • 支持的未完成RQE的实际数量。如果没有返回错误,则保证大于或等于请求的数量(这可能要求software增加RQ相关的CQ的大小)。
  • 在提交给SQ或RQ的WR中指明Scatter Buffer或Gather Buffer的实际最大数量。如果没有返回错误,则保证大于或等于请求的数量。

2.3 Modify QP Verb

执行Modify QP Verb的原因如下:

  • 为新创建的QP提供操作参数。
  • 更新已运行QP的操作特征,但保持QP的当前状态不改变。
  • 以编程方式改变QP的运行状态。同时,software可以选择性的改变QP当前的一个或多个操作特性。

当software执行Modify QP verb时,verb调用中指定的当前QP状态与下一个状态定义了一些必需的输入参数,而其他的是可选地。如下:

  • Reset-to-Init状态改变。部分参数为必需参数,不允许设置可选参数。
  • Init-to-RTR状态改变。必需参数与可选参数都有。
  • RTR-to-RTS状态改变。必需参数与可选参数都有。
  • Stay in RTS状态(不改变)。无必需的输入参数,有一些可选参数。
  • SQE-to-RTS状态改变。无必需的输入参数,有一些可选参数。
  • RTS-to-SQD状态改变。无必需或可选输入参数。
  • SQD-to-RTS状态改变。无必需的输入参数,有一些可选参数。
  • Any state-to-Error状态改变被允许。无必需或可选输入参数。
  • Any state-to-Reset状态改变被允许。无必需或可选输入参数。
  • Error-to-Reset状态改变。在QP进入Error状态后允许software执行的唯一状态,无必需或可选输入参数。

Modify QP Verb的输入参数如下表。

ParameterApplicable Service TypeCommentsRequired、Optional、or Not Allowed?
HCA handleAll标识QP所在的HCA,由先前执行的Open HCA verb返回。Required
QP handleAll标识需要更新其特性的QP,由执行的Create QP verb返回。Required
Next QP stateAll

● 如果指定的状态与QP的当前状态相同,则QP的状态保持不变。指定的QP属性被修改。

● 如果下一个状态是SQD状态,那么调用方可以指定一旦SQ已完成用尽是否调用关联异步事件的句柄。

Required,但可以与QP当前状态相同

Primary P_Key

 index

RC、UC、UD

相应端口的P_KeyTable中的索引为P_Key索引。

QP将QP的P_Key索引选择的端口P_Key插入它生成的包的BTH:P_Key字段中。

收到包后,QP的RQ Logic根据QP的P_Key索引值选择的端口P_Key检查包的该字段。

RD服务时,不是QP而是EEC。

● Reset to Init状态更改时需要。

● Init to RTR状态更改时可选择。

● SQD to RTS状态更改时可选择。

Q_Key

RD、UD

创建本地RD或UD QP后,software为其分配一个32bit的Q_Key,并使用Create QPModify QP verb为新创建的QP提供Q_Key,储存在QPC中。

● Reset to Init状态更改时需要。

● Init to RTR状态更改时可选择。

● RTR to RTS状态更改时可选择。

● 如果当前状态是RTS且没有被改变,这是可选择的。

● SQE to RTS状态更改时可选择。

● SQD to RTS状态可选择是否改变。

Start PSN

RC、UC、UD将Start PSN分配给QP的SQ Logic。RTR to RTS状态更改时可选择。
Maximum number of outstanding WRs posted to SQ and RQAll

当HCA支持动态调整SQ和RQ大小时才能配置这些参数,可通过执行Query HCA verb发现。

● RTR状态更改时可选择。

● RTR to RTS状态更改时可选择。

● 如果当前状态是RTS且没有被改变,这是可选择的。

● SQE to RTS状态更改时可选择。

● SQD to RTS状态可选择是否改变。

如果指定的QP是QP0、QP1、Raw IPv6或Raw Ethertype,则该表其余输入参数不适用。
Primary HCA port associated with this QPRC、UC、UD

指定本地HCA端口,QP通过该端口发送和接收报文。

在RC QP上如HCA支持,可在QP从SQD状态转换到RTS状态时指定新的QP/端口关联,通过执行Query HCA verb发现。

● Reset to Init状态更改时需要。

● SQD to RTS状态可选择是否改变。

RQ ePSNRC、UC指定RQ Logic的ePSN,用于确定传入的请求包是下一个预期请求包、重复请求包还是“stale”请求包。此值在通信建立的过程中由远端CA的CM返回,此值与远端QP的SQ Logic分配的Start PSN相同。Init to RTR状态更改时需要。
Enable or disable the ability of the RQ Logic to handle incoming RDMA ReadsRC、RD--

● Reset to Init状态更改时需要。

● Init to RTR状态更改时可选择。

● RTR to RTS状态更改时可选择。

● 如果当前状态是RTS且没有被改变,这是可选择的。

● SQE to RTS状态更改时可选择。(仅RD)

Enable or disable the ability of the RQ Logic to handle incoming RDMA WritesRC、RD、UD--

● Reset to Init状态更改时需要。

● Init to RTR状态更改时可选择。

● RTR to RTS状态更改时可选择。

● 如果当前状态是RTS且没有被改变,这是可选择的。

● SQE to RTS状态更改时可选择。

Enable or disable the ability of the RQ Logic to handle incoming Atomic requests

RC、RD--

● Reset to Init状态更改时需要。

● Init to RTR状态更改时可选择。

● RTR to RTS状态更改时可选择。

● SQE to RTS状态更改时可选择。(仅RD)

Destination QP number

RC、UC

这是远端QP的QPN。建链期间,远端CA的CM提供。● Reset to Init状态更改时需要。

Number of RDMA Reads and Atomic operations the SQ Logic can have outstanding at any time

RC该值由远端QP的RQ Logic用于处理入站的RDMA Read和Atomic 请求的特殊队列深度指定。建链期间,该值在REP message中返回。

● RTR to RTS状态更改时需要。

● SQD to RTS状态更改时可选择。

Size of the special queue in the QP‘s RQ Logic for handling inbound RDMA Reads and Atomic requestsRC

此值可以四舍五入到一个被支持的值,不能超过这个HCA的QP允许的最大值。(通过执行Query HCA verb可知)。

● RTR to RTS状态更改时可选择。

● SQD to RTS状态更改时可选择。

Minimum RNR Nak Timer Field ValueRC、RDRNR Nak报文的Syndrome字段的后五位包含一个Timer值,这是请求方QP的SQ Logic在重传当前请求包之前必须等待的最小时间。

● Init to RTR状态更改时可选择。

● RTR to RTS状态更改时可选择。

● 如果当前状态是RTS且没有被改变,这是可选择的。

● SQE to RTS状态更改时可选择。

● SQD to RTS状态可选择是否改变。

Path migration state

RC、UC

仅在HCA支持APM(自动路径迁移)时有效。可通过执行Query HCA verb得知。有效状态是:

—Migrated,或

—Rearm。

● RTR to RTS状态更改时可选择。

● 如果当前状态是RTS且没有被改变,这是可选择的。

● SQD to RTS状态可选择是否改变。

仅对于RC和UC,地址向量包含以下元素:
Service LevelRC、UC这是插到QP的SQ Logic生成的所有请求包的LRH:SL字段的SL值。

● Init to RTR状态更改时需要。

● SQD to RTS状态可选择是否改变。

Send Global Routing Header FlagRC、UC

如果远端CA位于不同子网中,则必须将此位置为1,须提供以下参数:

—Traffic Class。

—Flow Label。

—Hop Limit。

—SGID Index。

—DGID address。

● Init to RTR状态更改时需要。

● SQD to RTS状态可选择是否改变。

DLID addressRC、UC

—如果远端CA在同一子网中,DLID=远端CA的目的端口LID。

—如果远端CA不在同一子网中,DLID=路由器入端口的LID地址。

● Init to RTR状态更改时需要。

● SQD to RTS状态可选择是否改变。

PMTURC、UC此值为路径最大传输单元,表示数据包中使用的最大允许数据有效载荷大小。

● Init to RTR状态更改时需要。

● SQD to RTS状态可选择是否改变。

Maximum Static RateRC、UC此值为包间延迟,定义了向目的QP发送数据包之间必须观察的间隔。

● Init to RTR状态更改时需要。

● SQD to RTS状态可选择是否改变。

Local ACK TimeoutRC指定QP的SQ Logic在重新尝试传输相应请求包之前等待Ack包的时间。

● RTR to RTS状态更改时需要。

● SQD to RTS状态可选择是否改变。

Retry CountRC定义了由超时、PSN错误或丢失报文导致的QP的SQ Logic重新传输请求包的次数。

● RTR to RTS状态更改时需要。

● SQD to RTS状态可选择是否改变。

RNR retry countRC此值由远端QP的RQ Logic提供,定义了远端QP的RQ Logic接收RNR Nak请求包的重试次数。

● RTR to RTS状态更改时需要。

● SQD to RTS状态可选择是否改变。

Source Path BitsRC、UC当QP的SQ Logic发送一个请求包到它指定的端口进行传输时,请求包的Source LID (SLID)字段中必须显示哪个端口指定的LID地址。此项以源端口的基本LID地址的偏移量的形式提供。当QP建立时,储存到RC、UC或UD QP的QPC中。

● Init to RTR状态更改时需要。

● SQD to RTS状态可选择是否改变。

以下备用路径地址信息仅适用于该CI支持APM的RC与UC QP(注,备用路径的PMTU需与主路径相同)。

● Init to RTR状态更改时可选。

● RTR to RTS状态更改时需要。

● 如果当前状态是RTS且没有被改变,这是可选择的。

● SQD to RTS状态可选择是否改变。

Alternate path P_Key Index

RC、UC

----
Alternate path Physical portRC、UC----
Alternate path address vector

RC、UC

(除非另有说明)

包括:

—Service Level。

—Send Global Routing Header Flag bit。

—DLID of the destination CA port or route ingress port。

—Maximum Static Rate。

—Local ACK Timeout(RC only)。

—Retry Count(RC only)。

—RNR Retry Counter(RC only)。

—Source Path Bits。

对于全局目的地:

—Traffic Class。

—Flow Label。

—Hop Limit。

—SGID Index。

—DGID address。

注,Retry Count与RNR Retry Count在协议1.0a中都显示备用路径地址信息,但它们已被批准从此列表中删除,以备下一次修订。

--

2.4 Query QP Verb

software可以执行Query QP verb以获得QP的当前状态和操作特征。执行verb时,将提供HCA句柄与QP句柄作为输入参数。向调用方返回QP当前操作特征的列表。如果QP处于Reset状态,则它的许多操作特征是未定义的,不会返回。

2.5 Destory QP Verb

software可以执行Destory QP verb以销毁QP,提供HCA句柄与QP句柄作为输入参数。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32 HAL QPC 是一种针对STM32系列微控制器的硬件抽象层(Hardware Abstraction Layer),它最初是由Quantum Leaps公司开发的。它的目的是提供一种方便使用的编程接口,使开发者能够更容易地配置和控制STM32微控制器的各种功能。 HAL是STM32全新的软件平台,整合了STM32CubMX和STM32CubeF4,为开发人员提供了一种基于HAL库的新的软件开发方式。它提供了一组高级API函数,用于配置和控制STM32的内部模块,如GPIO、USART、SPI、I2C等。这使得开发者可以更加方便地编写和维护代码。 而QPC(Qt Positioning Control)是一个由Quantum Leaps开发的嵌入式实时操作系统(RTOS)和事件驱动的框架。它为开发者提供了一种易于使用的方法,用于编写高效、可靠的嵌入式软件。QPC提供了一种事件驱动的编程模型,开发者可以通过定义事件和事件处理函数的方式来编写应用程序。在QPC中,每个事件都有一个优先级,这样可以确保高优先级事件在低优先级事件之前得到处理。 STM32 HAL QPC的结合使用使得开发者能够更轻松地开发出高性能、可靠的嵌入式应用程序。HAL提供了方便的编程接口,使得配置和控制STM32的各种外设变得更加容易。而QPC提供了一种高效的开发框架,通过事件驱动的方式,使得程序的执行更加可控和可靠。这种结合使用的方式,可以大大提高开发效率和软件质量,使得开发者能够更快地将产品推向市场。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值