对I/O完成进行无锁InfiniBand轮询的方法和系统转让专利

申请号 : CN200510119364.2

文献号 : CN1770110B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 戴维·B.·埃米斯唐纳德·W.·施密特

申请人 : 国际商业机器公司

摘要 :

InfiniBand轮询动词所用的方法、系统和存储介质,以便不使用内核服务而支持多线程环境,提供主线轮询逻辑的串行化。轮询是动词,允许客户判定其哪项工作请求已经完成并提供结束状态。除了多个并发线程对单一完成队列使用轮询之外,轮询还对破坏队列对和破坏完成队列进行串行化。完成队列用于为工作请求保留完成状态。队列对用于提交工作请求,并与创建它们时的完成队列有关。

权利要求 :

1.一种对I/O完成进行无锁InfiniBand轮询的方法,包括:向执行轮询逻辑的多个并发线程提供对完成队列资源的共享访问;

判断是否有任何线程正在试图破坏所述完成队列资源,如果有,就返回出错状态;以及使主机通道适配器驱动程序软件与主机通道适配器硬件同步;

其特征在于,不使用内核服务而提供主线轮询逻辑的串行化;

并且,所述轮询逻辑将试图对给定队列进行并发轮询的多个并发线程中的任何线程进行串行化,并且,所述轮询逻辑还将在至少一个其他线程上调用的一个或多个操作系统功能进行串行化,其中所述其他线程使用所述轮询逻辑正在试图对于所述给定队列进行访问的至少一个资源,其中,提供在多线程环境中调用的轮询支持,而不使用需要进入内核的串行化技术,并且所述轮询逻辑利用内核实施的破坏完成队列操作和破坏完成队列对操作而被串行化,使得用户模式程序在用户模式下处理工作请求的完成,而没有内核干预,不用闭锁或锁存而能够运行。

2.根据权利要求1的方法,其特征在于,对当前线程与其他轮询线程的串行化都由单一的原子操作完成。

3.根据权利要求1的方法,其特征在于,所述完成队列资源包括完成队列单元,并且该方法进一步包括:在获得所有权之前,复制所述完成队列单元,并且一旦获得了所有权,将不再提供对所述完成队列单元的访问。

4.根据权利要求1的方法,其特征在于,所述完成队列资源包括完成队列单元,并且所述完成队列单元可再使用,而不需要由所述主机通道适配器驱动程序软件更新。

5.根据权利要求1的方法,进一步包括:

使主机通道适配器空闲项计数与客户软件程序同步,而不需要任何软件闭锁开销。

6.根据权利要求1的方法,进一步包括在至少两个线程之间共享完成队列。

7.一种对I/O完成进行无锁InfiniBand轮询的方法,包括:创建步骤,所述创建步骤对以下属性进行创建:

完成队列系统属性,内含与完成队列有关的用户属性指针,由所述与完成队列有关的用户属性指针所定位的完成队列用户属性,队列对系统属性,以及

由有关的队列对用户属性指针所定位的队列对用户属性,

共享访问提供步骤,向执行轮询逻辑的多个并发线程提供对完成队列的共享访问;

判断步骤,判断是否有任何线程正在试图破坏完成队列资源,如果判断出有任何线程正在试图破坏完成队列资源,就返回出错状态,同步步骤,使主机通道适配器驱动程序软件与主机通道适配器硬件同步;

其特征在于,不使用内核服务而提供主线轮询逻辑的串行化;

所述轮询逻辑将试图对给定队列进行并发轮询的多个并发线程中的任何线程进行串行化,并且,所述轮询逻辑还将在至少一个其他线程上调用的一个或多个操作系统功能进行串行化,其中所述其他线程使用所述轮询逻辑正在试图对于所述给定队列进行访问的至少一个资源;

其中,提供在多线程环境中调用的轮询支持,而不使用需要进入内核的串行化技术,并且所述轮询逻辑利用内核实施的破坏完成队列操作和破坏完成队列对操作而被串行化,使得用户模式程序在用户模式下处理工作请求的完成,而没有内核干预,不用闭锁或锁存而能够运行。

8.根据权利要求7的方法,其特征在于,在所述共享访问提供步骤中,还向执行轮询逻辑的多个并发线程提供对所述完成队列系统属性、所述完成队列用户属性以及完成队列句柄的共享访问。

9.根据权利要求7的方法,其特征在于,所述完成队列系统属性进一步包括完成队列起源、破坏的队列对完成队列单元队列,以及最大的完成队列索引。

10.根据权利要求7的方法,其特征在于,所述完成队列用户属性进一步包括完成队列实例号、完成队列轮询计数、完成队列头索引、请求破坏指示、完成队列单元有效设置以及完成队列使用计数。

11.根据权利要求7的方法,其特征在于,所述完成队列资源包括完成队列单元,所述完成队列单元包括有效指示、队列对位置消息、有关的队列对实例号、已完成的若干工作队列单元计数以及工作队列单元时间标记信息。

12.根据权利要求7的方法,进一步包括对主机通道适配器完成队列计数进行寄存。

13.根据权利要求7的方法,其特征在于,所述队列对系统属性包括队列对实例号和有关的队列对用户属性指针。

14.根据权利要求7的方法,其特征在于,所述队列对用户属性包括串行化区、空闲工作队列单元计数、请求破坏队列对指示、队列对实例号以及请求的时间标记。

说明书 :

技术领域

一般说来,本公开文献涉及计算机和处理器架构、存储管理、输入/输出(I/O)处理、操作系统,确切地说,涉及InfiniBand轮询动词所用的方法、系统和存储介质,以便不使用内核服务而支持多线程环境,提供主线轮询逻辑的串行化。

背景技术

在典型的操作系统环境下,比如z/OS、OS/390以及先前版本中,输入/输出(I/O)完成过程需要内核代码去服务I/O中断、分析完成状态以及对内核态下执行的退出给予控制。
为了改进处理器存储体系的性能使用了本地硬件高速缓存,由于硬件高速缓存的污染、中断处理所导致的硬件串行化和在内核态下服务所述中断所需的指令,使用中断对应用程序处理是破坏性的。提供在内核态下执行的退出需要某种程度的专长和某种级别的权威,而这些是应用程序员所不希望的。
InfiniBand架构规范是从InfiniBand行业协会可得到的标准。InfiniBand架构规范定义了另外一种I/O处理途经,它允许应用程序更直接地使用I/O设施。
InfiniBand提供硬件消息传递机制,它是I/O设备和一般计算节点之间的内部进程通信(IPC)能够使用的机制。客户通过公布发送/接收消息而访问InfiniBand消息传递硬件,以便发送/接收InfiniBand通道适配器(CA)上的工作队列。所述发送/接收工作队列(WQ)分配给客户作为队列对(QP)。客户经由InfiniBand从完成队列(CQ)检索这些消息的结果,发送和接收工作完成(WC)。
源CA负责把出站消息分段并将它们发送到目的地。目的地CA负责重组入站消息并将它们装入目的地客户指定的存储空间中。有两种CA类型:主机CA和目标CA。通用计算节点使用主机通道适配器(HCA)访问InfiniBand架构。客户使用InfiniBand动词访问主机CA功能。解译动词和直接访问所述CA的软件称为通道界面(CI)。
所述轮询动词允许应用程序判定其哪项工作请求已经完成并提供结束状态。这种轮询动词被定义为在用户模式执行,即它不需要内核干预。为了恰当地串行化所述工作请求有关的资源使用,当前处理使用内核串行化服务以便提供禁用的自旋锁。即使在启用的环境下,比如在InfiniBand启用环境中所期待的,也可能期待使用内核串行化服务,例如采用锁存器。使用锁存器会影响轮询动词的性能,还可能需要某种恢复逻辑,以便在保持锁存器时,跟踪其所有权。
轮询动词与其他动词互动,所以对多线程环境支持轮询动词有些问题。例如多个客户独立地运行,并可能在同一瞬间对相同的完成队列请求轮询服务,产生串行化问题。因此需要不用内核串行化服务的可在用户模式中调用的轮询服务。

发明内容

本发明致力于采用InfiniBand轮询动词的方法、系统和存储介质,支持不使用内核服务的多线程环境,以便提供主线轮询逻辑的串行化。
本发明的一个方面是对I/O完成进行无锁InfiniBand轮询的方法。向执行轮询逻辑的多个并发线程提供对完成队列资源的共享访问。判断是否有任何线程正在试图破坏所述完成队列资源,如果有,就返回出错状态。不使用内核服务而提供主线轮询逻辑的串行化。
本发明的另一个方面是计算机可读存储介质,其上存储了若干指令,执行对I/O完成进行无锁InfiniBand轮询的方法。向执行轮询逻辑的多个并发线程提供对完成队列资源的共享访问。判断是否有任何线程正在试图破坏所述完成队列资源,如果有,就返回出错状态。不使用内核服务而提供主线轮询逻辑的串行化。
本发明的再一个方面是对I/O完成进行无锁InfiniBand轮询的系统,包括完成队列系统属性,内含完成队列涉及的用户属性指针、由所述完成队列涉及的用户属性指针所定位的完成队列用户属性、具有至少一个完成队列单元的完成队列、完成队列句柄、队列对系统属性以及由所涉及的队列对用户属性指针所定位的队列对用户属性。向执行轮询逻辑的多个并发线程提供对完成队列的共享访问。如果有任何线程正在试图破坏所述完成队列资源,就返回出错状态。不使用内核服务而提供主线轮询逻辑的串行化。
附图简要说明
参考关于以下的说明、附带的权利要求书和附图,将会更好地理解本发明的这些和其他特征、方面和优点,其中:
图1是现有技术中分布式计算机系统,是本发明实施例所用的示范运行环境;
图2是现有技术中主机处理器节点的功能框图,是本发明实施例所用示范运行环境的一部分;
图3展示了现有技术中工作请求的处理,是本发明实施例所用示范运行环境的一部分;
图4是现有技术中分层通信架构图,是本发明实施例所用示范运行环境的一部分;
图5是根据本发明实施例的示范CQ系统属性和用户属性的框图;
图6是根据本发明实施例的示范完成队列的框图;
图7是根据本发明实施例的示范CQE的框图;
图8是根据本发明实施例的示范CQ句柄的框图;
图9是根据本发明实施例的示范HCA空闲CQ计数寄存器框图;
图10是根据本发明实施例的示范QP系统属性和用户属性的框图。

具体实施方式

本发明示范实施例提供了InfiniBand轮询动词所用的方法、系统和存储介质,以便不使用内核服务而支持多线程环境,提供主线轮询逻辑的串行化。优选情况下,示范实施例在分布式计算机系统中实施,比如现有技术的系统区域网络(SAN),包含终端节点、交换机、路由器以及这些组件互连的链接。图1至图4显示了本发明实施例所用示范运行环境的不同部分。图5至图10显示了本发明的示范实施例。
图1是现有技术中分布式计算机系统,是本发明实施例所用的示范运行环境。图1中表示的分布式计算机系统采用系统区域网络(SAN)100的形式,且仅仅为展示目的而提供,以下说明的本发明实施例能够实施在众多的其他类型和配置的计算机系统上。例如,实施本发明的计算机系统可以涵盖从只有一个处理器和几个输入/输出(I/O)适配器的小型服务器到具有数百或数千个处理器和数千个I/O适配器的巨型并行超级计算机系统。
SAN 100是大带宽、低等待时间的网络,使分布式计算机系统之内的节点互连。节点是网络的一个或多个链接所连的任何组件,形成该网络之内消息的起源和/或目的地。在所描述的示例中,SAN 100包括的节点形式有:主机处理器节点102、主机处理器节点104、冗余磁盘阵列(RAID)子系统节点106以及I/O机架节点108。图1所展示的节点仅仅为展示目的,因为SAN 100能够连接任何数目、任何类型的独立处理器节点、I/O适配器节点以及I/O设备节点。任何一个所述节点都能用作终端节点,本文定义其为设备,在SAN 100中发起或最终消耗消息或帧。
在本发明的一个实施例中,呈现了分布式计算机系统中的出错处理机制,其中的出错处理机制容许在分布式计算机系统比如SAN 100中,实现终端节点之间的可靠连接即可靠数据报通信,
本文所用的消息是应用程序定义的数据交换单元,是协同操作过程之间通信的原始单位。信息包是一个数据单元,由网络协议头和/或尾所封装。协议头一般提供引导所述帧经过SAN 100的控制和路由信息。协议尾一般包含控制和循环冗余码校验(CRC)数据,以确保不传递内容被破坏的信息包。
SAN 100包含通信和管理基础设施,在分布式计算机系统之内既支持I/O又支持处理器间通信(IPC)。图1所示的SAN 100包括交换通信架构116,它容许多种设备在安全、远程管理的环境中,以大带宽和低等待时间并发地传输数据。终端节点可以在多个端口上通信,并经过所述SAN架构使用多条通路。经过图1所示SAN的多个端口和通路可以用于故障容错和增加数据传输的带宽。
图1中的所述SAN 100包括交换机112、交换机114、交换机146和路由器117。交换机是将多个链接连接在一起的设备,它容许使用小协议头目的地的本地标识符(DLID)字段,指定子网之内信息包从一个链接到另一个链接的路由。路由器是把多个子网连接在一起的设备,它能够使用大协议头目的地的全局唯一标识符(DGUID),指定若干帧从第一个子网中的一个链接到第二个子网中的另一个链接的路由。
在一个实施例中,链接是任何两个网络架构部件比如终端节点、交换机或路由器之间的全双工通道。适合链接的示例包括但不限于:铜电缆、光缆以及底板和印刷电路板上的印刷电路铜轨迹。
对可靠的服务类型,终端节点比如主机处理器终端节点和I/O适配器终端节点产生请求信息包并返回应答信息包。信息包沿交换机和路由器传递,从所述起源到所述目的地。除了变化的CRC尾字段之外(在网络中每个阶段都要更新它),交换机传递的信息包没有改变。当路由信息包时,路由器更新所述变化的CRC协议尾字段并修改在所述协议头中的其他字段。
在图1展示的SAN 100中,主机处理器节点102、主机处理器节点104以及I/O机架节点108包括至少一个通道适配器(CA),以与SAN 100接口。在一个实施例中,每个通道适配器都是终点,对SAN架构116上传输的源或末端信息包以足够的细节实施通道适配器接口。主机处理器节点102包含通道适配器,形式为主机通道适配器118和主机通道适配器120。主机处理器节点104包含主机通道适配器122和主机通道适配器124。主机处理器节点102还包含中央处理单元126-130和内存132,由总线系统134互连。主机处理器节点104同样包含中央处理单元136-140和内存142,由总线系统144互连。
主机通道适配器118和120提供到交换机112的连接,而主机通道适配器122和124则提供到交换机112和114的连接。
在一个实施例中,主机通道适配器在硬件中实施。在这个实施中,所述主机通道适配器使中央处理单元和I/O适配器通信的总开销卸载了许多。主机通道适配器的这种硬件实施方案也允许在交换网络上进行多项并发通信,而没有通信协议所关联的传统开销。在一个实施例中,主机通道适配器和图1中的SAN 100向分布式计算机系统的I/O和处理器间通信(IPC)客户,提供了不涉及操作系统内核过程的零处理器复制数据传输,并且使用硬件提供了可靠的、故障容错的通信。
如图1所示,路由器117连接到广域网(WAN)和/或局域网(LAN),再连接到其他主机或其他路由器。图1中的I/O机架108包括I/O交换机146和多个I/O模块148-156。在这些示例中,所述I/O模块采取适配卡的形式。图1中展示的适配卡示例包括I/O模块148的SCSI适配卡;I/O模块152的至光纤通道集线器和光纤通道仲裁环路(FC-AL)设备的适配卡;I/O模块150的以太网适配卡;I/O模块154的图形适配卡以及I/O模块156的视频适配卡。任何已知类型的适配卡都能够实施。I/O适配器还包括I/O适配器底板中的交换机,把所述适配卡连接到所述SAN架构。这些模块包含目标通道适配器158-166。
在这个示例中,图1中的RAID子系统节点106包括处理器168、内存170、目标通道适配器(TCA)172以及多个冗余和/或条带存储磁盘单元174。目标通道适配器172可以为全功能的主机通道适配器。
SAN 100为I/O和处理器间通信处理数据通信。SAN 100支持I/O所需的大带宽和可伸缩性,并支持处理器间通信所需的极低的等待时间和极低CPU开销。用户客户机程序可以绕过操作系统内核过程,直接访问网络通信硬件,比如主机通道适配器,它能够使用高效消息传递协议。SAN 100适合当前的计算模型而且是新形式I/O和计算机集群通信的标准组件。另外,图1中的SAN 100容许I/O适配器节点在它们自身之间通信,或者与分布式计算机系统中的任何或确保处理器节点通信。利用安装到所述SAN 100的I/O适配器,使得最终I/O适配器节点具有与SAN 100中任何主机处理器节点实质上相同的通信能力。
在一个实施例中,图1所示的SAN 100支持通道语义和存储语义。通道语义往往称为发送/接收或推通信操作。通道语义是传统I/O通道中使用的通信类型,其中起源设备推出数据,而目的地设备确定该数据的最终目的地。在通道语义中,从起源过程传输的信息包指定目的地过程的通信端口,但是不指定该信息包将写入目的地过程存储空间中何处。因此在通道语义中,所述目的地过程预先分配了所述传输数据将放置的位置。
在存储语义中,起源过程直接地读取或写入远程节点目的地过程的虚拟地址空间。远程目的地过程仅仅需要与数据缓冲区的位置通信,而不需要涉及任何数据的传输。因此在存储语义中,起源过程发送的数据包含有目的地过程的目的地缓冲区的存储地址。在存储语义中,所述目的地过程事先允许所述起源过程访问其存储器。
典型情况下,通道语义和存储语义都是I/O和处理器间通信所需的。典型的I/O操作使用通道语义和存储语义的组合。在图1所示的分布式计算机系统的I/O操作展示示例中,主机处理器节点,比如主机处理器节点102,使用通道语义起动I/O操作,向磁盘I/O适配器比如RAID子系统目标通道适配器(TCA)172,发送磁盘写入命令。所述磁盘I/O适配器检验该命令,并使用存储语义直接地从所述主机处理器节点的存储空间读取所述数据缓冲区。读取了所述数据缓冲区之后,所述磁盘I/O适配器使用通道语义推出I/O完成消息,回到所述主机处理器节点。
在一个示范实施例中,图1中所示的分布式计算机系统执行若干操作,它们使用虚拟地址和虚拟存储保护机制,以确保对所有存储进行正确、恰当的访问。在此类分布式计算机系统中运行的应用程序对任何操作都不需要使用物理地址。
下一步转向图2,其中描述了现有技术中主机处理器节点的功能框图,是本发明实施例所用示范运行环境的一部分。主机处理器节点200是主机处理器节点的示例,比如图1中的主机处理器节点102。
在这个示例中,图2中所示的主机处理器节点200包括一组客户202-208,它们是在主机处理器节点200上执行的过程。主机处理器节点200还包括通道适配器210和通道适配器212。通道适配器210包含端口214和216,而通道适配器212包含端口218和220。每个端口都连接到一个链接。这些端口可以连接到一个SAN子网或多个SAN子网,比如图1中的SAN 100。在这些示例中,通道适配器采取主机通道适配器的形式。
客户202-208经由动词接口222和消息与数据服务224向所述SAN传递消息。动词接口本质上是主机通道适配器功能的抽象描述。操作系统可以通过其程序接口陈述某些或所有的动词功能。一般来说,这种接口定义了所述主机的行为。此外,主机处理器节点200还包括消息与数据服务224,与所述动词层相比它是级别更高的接口,并用于处理通过通道适配器210和通道适配器212收到的消息和数据。消息与数据服务224向客户202-208提供了接口,以处理消息和其他数据。
现在参考图3,其中描述了现有技术中工作请求的处理,是本发明实施例所用示范运行环境的一部分。在图3中,呈现了接收工作队列300、发送工作队列302以及完成队列304,以便处理来自和对于客户306的请求。这些来自客户306的请求最终发送至硬件308。在这个示例中,客户306产生工作请求310和312,并接收工作完成314。如图3中所示,放置在工作队列上的工作请求称为工作队列单元(WQE)。
发送工作队列302包含工作队列单元(WQE)322-328,描述了将在所述SAN架构上传输的数据。接收工作队列300包含工作队列单元(WQE)316-320,描述在何处放置从SAN架构引入的通道语义数据。工作队列单元由所述主机通道适配器中的硬件308处理。
所述动词还提供了从完成队列304检索已完成工作的机制。如图3所示,完成队列304包含完成队列单元(CQE)330-336。完成队列单元包含着先前已完成工作队列单元的有关信息。完成队列304用于为多队列对创建单点的完成通知。完成队列单元是完成队列上的数据结构。这种单元描述已完成的工作队列单元。所述完成队列单元包含着足够的信息以确定已完成的队列对和具体工作队列单元。完成队列上下文是信息块,内含管理各个完成队列所需指针、长度和其他信息。
支持图3所示发送工作队列302的工作请求示例如下。发送工作请求是一种通道语义操作,将一组本地数据段推至由远程节点的接收工作队列单元所引用的数据段中。例如,工作队列单元328包含着对数据段4 338、数据段5 340和数据段6 342的引用。每个发送工作请求的数据段都包含着虚拟邻近的存储空间。用于引用本地数据段的虚拟地址在创建本地队列对之过程的地址上下文中。
远程直接存储访问(RDMA)读取工作请求提供了在远程节点上读取虚拟邻近存储空间的存储语义操作。存储空间既可以是存储区域部分,也可以是存储窗口部分。存储区域是指先前注册的一组虚拟邻近的存储地址,由虚拟地址和长度定义。存储窗口是指已经捆绑到先前注册区域的一组虚拟邻近存储地址。
RDMA读取工作请求读取远程终端节点上的虚拟邻近存储空间并把数据写入虚拟邻近本地存储空间。类似于发送工作请求,RDMA读取工作队列单元引用本地数据段所用的虚拟地址在创建本地队列对之过程的地址上下文中。例如,在接收工作队列300中的工作队列单元316引用数据段1 344、数据段2 346和数据段3 348。所述远程虚拟地址在拥有所述RDMA读取工作队列单元所指向之远程队列对的过程地址上下文中。
RDMA写入工作请求单元提供了在远程节点上写入虚拟邻近存储空间的存储语义操作。所述RDMA写入工作请求单元包含本地虚拟邻近存储空间的散列表,以及向其中写入所述本地存储空间的远程存储空间的虚拟地址。
RDMA FetchOp工作队列单元提供了在远程单词上进行自动操作的存储语义操作。所述RDMA FetchOp工作队列单元是组合的RDMA读取、修改和RDMA写入操作。所述RDMA FetchOp工作队列单元能够支持数种读-修改-写操作,比如比较和如果相等则交换。捆绑(非捆绑)远程访问关键字(R_Key)工作队列单元通过把所述存储窗口关联到存储区域(解除关联),向所述主机通道适配器硬件提供了修改(破坏)存储窗口的命令。所述R_Key是每个RDMA访问的一部分,并用于确认远程过程对所述缓冲区具有所允许的访问。
在一个实施例中,图3中所示的接收工作队列300仅仅支持一种类型的工作队列单元,称为接收工作队列单元。所述接收工作队列单元提供了通道语义操作,描述将发送进来的消息写入其中的本地存储空间。所述接收工作队列单元包括散列表,它描述数个虚拟邻近存储空间。发送进来的消息写入这些存储空间。所述虚拟地址在创建所述本地队列对之过程的地址上下文中。
对处理器间通信,用户模式软件过程直接地从存储器中缓冲区驻留之处经由队列对传递数据。在一个实施例中,经由所述队列对的传送绕过了操作系统,并耗费的主机指令周期不多。队列对在数据传递中能够实现零处理器复制,且不涉及操作系统内核。所述零处理器复制的数据传送对大带宽和低等待时间通信提供了高效的支持。
典型情况下,本发明的分布式计算机系统中的数据处理由几个硬件和软件步骤组成。客户过程数据输送服务可以是用户模式过程,也可以是内核态过程。所述客户过程经由一个或多个队列对访问主机通道适配器硬件,比如图3中展示的队列对。所述客户过程调用操作系统特有的程序接口,在此称为“动词”。实现动词的软件代码将工作队列单元送入给定队列对的工作队列。
送入工作队列单元有许多可能的方法,也有许多可能的工作队列单元格式,允许不同的成本/性能设计要点而不影响互操作性。然而,用户过程必须以定义明确的方式与动词通信,并且跨越所述SAN架构传送之数据的格式和协议必须充分指定,以允许设备在多机种的卖主环境下进行互操作。
在一个实施例中,通道适配器硬件检测工作队列单元送入,并访问该工作队列单元。在这个实施例中,所述通道适配器硬件译码和确认所述工作队列单元的虚拟地址,并访问该数据。
输出的消息要分离为一个或多个数据包。在一个实施例中,所述通道适配器硬件为每个信息包都加入输送头和网络头。输送头包括序列号和其他输送信息。网络头包括路由信息,比如目的地IP地址和其他网络路由信息。链接头包含所述目的地本地标识符(DLID)或其他本地路由信息。所述信息包总是要加入合适的链接头。如果所述目的地终端节点驻留在远程子网上,那么给定的信息包要加入合适的全局网络头。
如果使用了可靠的输送服务,当请求数据包到达其目的地终端节点时,所述目的地终端节点使用应答数据包,让请求数据包的发送者知道所述请求数据包在目的地被确认和接受了。应答数据包应答一个或多个有效和被接受的请求数据包。请求者在收到任何应答前,可以有多个待输出的请求数据包。在一个实施例中,在创建队列对时确定多个待输出消息即请求数据包的数目。
图4中以示意图的形式一般地展示了实施本发明之分层架构400的一个实施例。图4的分层架构示意图显示了数据通信通路的各种分层,以及各层之间传递的数据和控制信息的组织。
主机通道适配器终端节点协议层(例如终端节点411使用的)包括:由客户403定义的上层协议402、传输层404、网络层406、链路层408以及物理层410。交换层(例如由交换机413使用的)包括链路层408和物理层410。路由层(例如由路由器415使用的)包括网络层406、链路层408以及物理层410。
分层架构400一般遵循典型的通信栈框架。例如关于终端节点411的协议层,上层协议402使用动词在传输层404处创建消息。网络层(406)在网络的子网之间路由信息包(416)。链路层408在网络的子网之内路由信息包(418)。物理层410向其他设备的物理层发送若干位或多组若干位。每层都不知道其上层或下层如何执行其功能。
客户403和405代表为终端节点之间通信而使用其他层的应用程序或过程。传输层404提供端到端的消息运动。在一个实施例中,所述传输层提供了四类上述的传输服务,它们是可靠的连接服务、可靠的数据报服务、不可靠的数据报服务以及原始数据报服务。网络层406执行信息包路由,经由一个子网或多个子网到达目的地终端节点。链路层408跨越链接执行流控制的、出错检测的以及优先的信息包传递。
物理层410执行技术相关的位传输。若干位或多组若干位经由链路422、424和426在物理层之间传递。链路可以由印刷电路铜线、铜缆、光缆或其他合适的链路实现。
本发明的实施例运行在以上关于图1至图4介绍的SAN环境之内。图5至图10显示了本发明的示范数据结构实施例,用于实现遵守所述InfiniBand轮询动词规范的设计。
图5显示了CQ系统属性500的示范数据结构实施例,包括有关的用户属性502、CQ起源504、破坏的QP CQE队列506、提取的头索引掩码508以及最大CQ索引510。所述有关的用户属性502指向所述数据结构CQ用户属性512。CQ用户属性512具有串行化区526,它包括CQ实例号514、CQ交换计数516、CQ头索引518、破坏请求520、CQE有效设置522以及CQ使用计数524。
图6显示了具有n个单元{CQE0、CQE1、...CQEn}的完成队列600的示范数据结构实施例。
图7显示了CQE 700的示范数据结构实施例,包括有效指示702、QP位置信息704、有关的QP实例号706、已完成的WQE的数目708以及WQE时间标记信息710。
图8显示了CQ句柄800的示范数据结构实施例,包括CQ实例号802和CQ位置信息804。
图9显示了HCA空闲CQ计数寄存器900的示范数据结构实施例。
图10显示了QP系统属性1000的示范数据结构实施例,包括QP实例号1002和有关的用户属性1004。有关的用户属性1004指向QP用户属性1006,它包括串行化区1008、空闲WQE计数1010、请求的破坏QP 1012、QP实例号1014以及请求的时间标记1016。
图5至图10所示的示范数据结构实施例可以存储在固件中、存储在计算机可读存储器中存储比如内存142中,或者存储在硬件上比如HCA 118上。在一个优选实施例中,所有的示范数据结构都存储在计算机可读存储器中,所述HCA空闲CQ计数寄存器900除外,它存储在硬件上。
以下介绍使用图5至图10中示范数据结构实施例的示范方法,以便实施遵守所述InfiniBand轮询动词规范的设计。
所述InfiniBand架构说明了客户在创建队列对之前,必须调用所述创建完成队列服务,因为队列对关系到一个或两个完成队列(指定发送所用的完成队列允许与接收所用队列区分)。所述队列对设施支持使用发送和接收队列提交工作请求。一旦提交了工作请求,客户必须采取某种行动,以获知所述工作请求何时完成,并知晓完成状态。这些后面的能力经由所述轮询接口提供。
在创建完成队列期间,所述内核在系统存储中分配了完成队列600,为主机通道适配器(HCA)所使用;因而用户模式程序比如所述轮询库服务不可以更新这些区域。所述完成队列用作环绕数组,所述HCA使用其在称作完成队列项(CEQ 700)的项中存储工作完成信息。所述内核分配的系统区控制块500,以描述系统的状态和完成队列的属性。此外它还分配用户控制块(CQ用户属性512),以保存支持轮询所需的状态信息。这种用户控制块的地址保存在所述系统区控制块的字段中(有关的用户属性502)。所述系统区控制块对提供所述轮询服务的库服务是只读的,而所述用户控制块对这些服务是可读写的。从创建完成队列的输出之一是完成队列句柄800。这种句柄是轮询库服务的输入。所述句柄用作为所述完成队列访问系统区控制块(CQ系统属性500)的查找机制。这能够确认允许所述客户使用所述资源,并且容许所述库服务为所述完成队列定位所述用户控制块(CQ用户属性512)。
串行化区526在所述用户控制块之内,通过比较和交换类型的指令对串行化区526进行访问。所述用户控制块串行化区526包含某些与在系统区控制块中相同的生效信息,连同状态信息(CQ头索引518),定位将获取的下一个完成队列项,向客户提供工作状态。另外还有由破坏完成队列设置的指示(请求的破坏520)(这是另一种InfiniBand动词服务,但是在本公开文献中逻辑地代表终止操作),以防止对完成队列的新访问。在这个串行化区之内的再一个字段是使用计数(CQ使用计数524),它跟踪活动线程的数目,它们希望对库、服务串行化,以访问所述完成队列。
在所述轮询客户库服务(使用系统区控制块中信息)验证了输入完成队列句柄适合使用之后,自动获取用户控制块的串行化区。如果设置了破坏完成队列的指示(请求的破坏520),或生效信息(CQ实例号514)不正确,就拒绝所述轮询操作。否则自动地更新所述串行化区中的使用计数(CQ使用计数524),以反映由所述当前线程的使用,同时确保不存在拒绝的理由。
所述轮询库服务现在(使用CQ起源504和CQ头索引518)计算下一个完成队列项所处的位置,并通过对比所述CQE中的有效设置和所述用户控制块中的CQE有效设置522,判断CQE是否有效。如果所述CQE有效,轮询处理继续进行,如下所述。本公开要求所述HCA驱动(HCAD)软件不把CQE的更新作为耗费CQE的一部分。现有技术中存在一种技术,用于容许所述HCAD判断HCA何时已经把新的CQE加入,而无须所述HCAD更新所述CQE。如果当到达所述CQ的结尾时指明CQE是否有效的数值翻转,并且在所述完成队列中下一个空闲CQE变为第一个CQE,这不难实现。有效CQE指示的当前值由所述轮询服务保留在所述CQE有效设置522中,而且当到达所述CQ的结尾时这个值翻转(反转)。
如果下一个完成队列项有效,轮询备份所述完成队列项,然后对所述用户控制块串行化区进行对比和交换,以取得所述项的所有权。这种对比和交换操作之准备的一部分是为将要使用的下一项推进索引(CQ头索引518),并且检测在所述完成队列中最后物理项正被要求的条件(与最大CQ索引510相比)。在这种队列结尾情况下,所述下一项索引(CQ头索引518)必须设置为所述完成队列的起点,并且必须反转所述CQE有效设置522的值。
对小完成队列还有进一步的问题需要解决:取回所述对比和交换的信息之后,线程可能被延迟。在这种延迟的时间段,所述完成队列可能环绕回到相同的点(完成队列容许短至64项,容许有1.5%的随机可能性所述队列环绕回到相同点),使得当所述线程苏醒时,所述对比和交换会继续进行,而未意识到所述队列已经变化。为了应对这种情况,当处理最后一项时,还需要为所述完成队列增加轮询(wrapping)计数(CQ轮询计数516),它保留在所述用户控制块串行化区中,使得由再唤醒线程进行的对比和交换将检测到所述环绕条件。所述轮询计数的数值范围对小完成队列大,对大完成队列相对小。为了容纳这种变化,当创建完成队列时,不难在所述系统控制块中设置掩码,即提取头索引掩码508。这种掩码可以用于隔离与轮询计数有关的位。
如果所述对比和交换成功(正常情况),所述CQE备份版本用于向所述轮询客户提供返回信息。事实上,必须使用所述备份版本,而非CQE本身,正如不久后的解释。如果所述对比和交换不成功(异常情况),就忽略所述备份项,对所述逻辑重试轮询,它计算下一个要使用项的地址,如先所述。
如果成功地请求了有效项(对比和交换成功),轮询就更新所述HCA寄存器,以反映新的CQ空闲项。由于轮询处理的多线程实例不是根据其在处理中的进展排序,有可能正在处理较迟CQE的实例先进行这种HCA寄存器更新,而后才对较早的CQE进行类似的更新。由于HCA根据内部指针和CQ空闲项计数写入新的CQE,所以HCA写入新的完成数据的物理位置有可能与其他线程仍在处理的CQE相同。这就是为什么所述HCAD有必要在为了要求软件所有权而进行对比和交换之前备份所述CQE。一旦所述对比和交换成功地要求到项的软件所有权,随后项也就拥有所有权。这种行为也要求所述HCAD在取得所有权之后不可以更新所述CQE,例如使有效指示复位。为了在取得所有权之后实现对所述CQE的更新,对于优化HCA操作模式,可能有必要在所述轮询实例之间不利地获取和释放闭锁,以保存处理的相对顺序。如果当到达所述CQ的结尾时指明CQE是否有效的数值翻转,并且在所述完成队列中下一个空闲CQE变为第一个CQE,这不难实现。有效CQE指示的当前值由所述轮询服务保留在所述CQE有效设置522中,而且当到达所述CQ的结尾时这个值翻转(反转)。
在更新所述HCA空闲CQ项计数寄存器之后,轮询处理为有关的队列对更新软件信息。这种信息包括空闲WQE计数1010,它容许将新的工作请求送入我们正在处理其完成的工作队列。这种更新使用对比和交换类的操作,以验证所述队列对仍旧关联到所述工作完成。破坏队列对可以运行在送入工作请求之时和轮询处理所述工作完成之时之间。所述完成队列项包含着表示所述队列对的实例(有关的QP实例号706)的标记;在系统有关控制块中的这种实例号(QP实例号1002)由破坏队列对改变。注意,在创建完成队列处理期间,内核建立了所述完成队列,只有当所述调用者本身是用户模式程序时,才允许用户模式访问。如果系统态调用者调用所述创建完成队列,将不会容许用户模式程序更新所述HCA寄存器。
一旦完成轮询处理,退出逻辑必须使在用户控制块中的串行化区526更新,以反映轮询线程不再活动。这是使用对比和交换类逻辑执行的。如果提取的区域反映出破坏完成队列操作正处于挂起(请求的破坏520),最后的活动线程负责调用内核功能,以解锁所述破坏完成队列操作。
下面的表1提供了本公开示范方法实施例的详细伪代码说明。在以下的详细说明中,名字比如old、new、oldpost、newpost是指本地变量,其尺寸和格式满足保持初始化这些变量所用数据的需要。具体地说,old和new的尺寸和格式将按照所述CQ用户有关的串行化区526,而oldpost和newpost的尺寸和格式将按照所述QP用户有关的串行化区1008。
表1.示范方法伪代码的伪代码
1.根据输入CQ句柄(CQ本地信息804)为CQ寻找系统控制块500
2.从系统控制块500为CQ获取用户控制块的地址(有关的用户属性502)
3.将有关的用户控制块中的串行化区(串行化区526)复制到old
4.共享SHARE CQ:将old复制到new
5.如果在用户控制块中的旧版本中请求了破坏(请求的破坏520),或者CQ实例号514的旧版本不符合输入CQ句柄中的数值(CQ实例号802)
a)直接返回调用者,指明CQ对轮询无效
6.在新版本中增加当前CQ用户计数524
7.COMPARE AND SWAP(old、new、用户有关的串行化区526)
8.如果COMPARE AND SWAP失败,在共享SHARE CQ处重试
9.将new复制到old
10.获取FETCH CQE:将old复制到new
11.根据CQ头索引518的旧版本和系统有关的控制块中CQ起源504计算CQE 700的地址
12.如果头CQE无效(对比新版本中的有效设置-见CQE有效设置522,相对于CQE有效设置702)
a)如果所述破坏的QP CQE队列506非空
(1)调用内核服务从所述破坏的QP CQE队列506去除单元
(2)如果单元返回,流向QP PROCESSING逻辑
b)设置返回码=got none
c)流向EXIT LOGIC返回到调用者
13.在试图要求所有权之前将所述头CQE复制到动态区域
14.将new复制到old
15.调整new头索引(见CQ头索引518)并在new中环绕(见CQ轮询计数516)数值。考虑到环绕(使用最大CO索引510)并当环绕出现时反转new有效CQE设置(CQE有效设置522)
16.COMPARE AND SWAP(旧、new、用户有关的串行化区526)
17.如果COMPARE AND SWAP失败
a)如果old中CQ实例号(见CQ实例号514)不符合输入句柄中的值(CQ实例号802)
(1)直接返回到调用者,指明CQ对轮询无效
b)在获取FETCH CQE处重试
18.设置返回码=got one
19.在所述HCA空闲CQ计数寄存器900中向所述空闲项计数加法器写1
20.QP PROCESSING:在使用CQE的动态区备份中的QP位置信息704,计算系统控制块中描述队列对的地址(QP系统属性1000)。
21.如果在CQE的动态区备份中的QP资源实例号(有关的QP实例号706)不符合系统控制块中描述所述队列对的值(QP实例号1002)
a)流向EXIT LOGIC,向调用者提供复制的CQE数据
22.从描述所述队列对的系统控制块中获取与所述QP用户有关的控制块地址(有关的用户属性1004)
23.按照用户有关的QP控制块地址中的串行化区1008设置oldpost
24.更新UPDATE QP:把oldpost复制到更新所用版本,newpost
25.如果在oldpost中请求了破坏(请求的破坏QP 1012)
a)流向EXIT LOGIC,向调用者提供输出CQE数据
26.如果CQE的动态备份中的QP令牌实例号值(有关的QP实例号
706)’^=在oldpost中的实例值(见QP事例号1014)
a)流向退出逻辑EXIT LOGIC,向调用者提供输出CQE数据
27.由已完成WQE的数目(见已完成WQE的数目708)增加newpost中空闲计数(见空闲WQE计数1010)
28.如果CQE的动态备份中WQE时间标记有效(见WQE时间标记信息710)
a)设置请求的newpost时间标记=0(见请求的时间标记1016)
29.COMPARE AND SWAP(oldpost、newpost、用户有关的QP串行化区1008)
30.如果对比失败,在更新UPDATE QP处重试
31.EXIT LOGIC:按照用户有关的CQ控制块中串行化区526(CQ用户属性512)设置old
32.解锁UNLOCK CQ:复制old到new
33.如果old中CQ实例号514不符合CQ句柄中的值(CQ实例号)
a)返回调用者,返回码=CQ轮询无效
34.在new中减少当前使用计数(见CQ使用计数524)
35.COMPARE AND SWAP(old、new、用户有关的串行化区526)
36.如果COMPARE AND SWAP失败,在解锁UNLOCK CQ处重试
37.如果new当前使用计数=0(见CQ使用计数514),而且设置了new请求破坏(见请求的破坏520)
a)调用内核功能恢复破坏完成队列
38.如果轮询成功,为调用者封装所述输出数据
39.向调用者返回返回码,如果成功输出数据
在表1中,所述示范伪代码具有四种不同的COMPARE ANDSWAP操作(步骤7、16、29和35),它们串行化不同的过程,将所述伪代码分成四个主要部分。同时,在所述伪代码中还有六个主要程序块:(1)步骤1-8、(2)步骤9-12、(3)步骤13-19、(4)步骤20-23、(5)步骤24-30以及(6)步骤31-39。此外,具体的部分有具体的标号:步骤4的SHARE CQ、步骤10的FETCH CQE、步骤20的QP PROCESSING、步骤24的UPDATE QP、步骤31的EXITLOGIC以及步骤32的UNLOCK CQ。所述四个主要部分是广义的,然后下面将详细说明每个步骤。
步骤7的第一个COMPARE AND SWAP用其他功能串行化完成队列的使用,比如破坏完成队列,否则它可能会除去所述完成队列并丢弃这些资源。这第一个串行化点确保了一旦所述轮询功能开始执行,就容许它连续执行,因为所述资源没有被破坏,并且在这种逻辑受控时将不会被破坏。所述当前线程可以已经与其他线程共享了所有权,但是如果另一个线程已经具有了专用所有权比如所述破坏完成队列动词,当前线程就不能共享其所有权。
步骤16的第二COMPARE AND SWAP串行化CQ头索引518的所有权,它表示索引的当前位置。当前位置是软件将获取若干完成的下一个位置,以便返回给客户应用程序。这第二个串行化点基本上串行化该索引的所有权,使得若干完成唯一地传递。这就避免了使两个不同线程同时运行轮询,都访问同一个索引的问题。他们都可能向两个不同的线程返回同一个完成,这是不合需要的。这是专用类型的操作。
步骤29的第三个COMPARE AND SWAP串行化队列对中空闲单元数目的更新,即空闲WQE计数1010。这同样是专用类型的操作。
步骤35的第四个COMPARE AND SWAP,它在所述EXIT
LOGIC标注之后,放弃了对所述完成队列的共享所有权,使得它能够返回某种状态,如果没有正在使用就可能被破坏。同时,还有一些清除逻辑,用于在退出线程受控时不识别的其他事件。只要所述退出线程使得计数从1变为0,它就恰好是从所述轮询函数退出的最后线程,就要完成其他线程已经传送给它的这些职责。
更详细地说,从步骤1开始就找到了所述系统控制块500。图5中的CQ系统属性500对应于图8中的CQ句柄800。当创建所述完成队列600时创建这种控制块、CQ系统属性500。这时还创建了CQ用户属性512。
图10中的QP系统属性1000和QP用户属性1006由所述创建队列对动词创建。在创建队列对之时,有指定一个或两个完成队列600的额外责任,其中将为该队列对记录若干完成,例如,一个完成队列可以指定为既进行发送操作,也进行接收操作。
假定使用通过所述送入动词的发送操作在所述SAN架构116上发送了一条信息,则为发送操作建立了工作单元并放在队列对上,而且所述完成出现在该队列对发送队列所关联的指定完成队列600上。总之,首先建立完成队列600,然后建立队列对,并在队列对建立之时,对轮询指定从其返回结果的完成队列。因此,第一步骤基本上是获取CQ系统属性500。
第二步骤基本上是使用有关的用户属性502中的指针,从CQ系统属性500中找到CQ用户属性512。
第三步骤提取串行化区526,包括从其提取的头索引掩码508,并将其复制到称为“old”的变量内。
在步骤4为步骤7的COMPARE AND SWAP进行初始化。提取了称为“old”之变量的当前值并复制到称为“new”的变量,对提取值给出两个副本。
在步骤5判断完成队列600的活动性是不是当前的,它可能会防止轮询完成。例如,检测是否存在进行中的破坏(请求的破坏520)或对完成队列600是否存在状态信息中的任何非一致性,也就是说所述CQ实例号514在所述串行化区526中与在所述CQ句柄800中(CQ实例号802)不同。如果出现这些问题的任何一种,就向所述调用者返回所述完成队列600对所述轮询无效的指示。否则,控制流转向步骤6。
在步骤6,在所述新版本中的CQ用户计数524增加,以反映使用所述当前线程。
在步骤7执行所述COMPARE AND SWAP。如果它失败,控制流从步骤8返回步骤4的所述标注SHARE CQ处。
在步骤9将所述变量“new”复制到所述变量“old”,以确保它们具有同样的值。
在步骤10为所述重试情况将old复制到new。
在步骤11判断对于所述索引的当前位置——所述CQ头索引518,所述完成队列单元700所处的位置。计算所述完成队列600中当前CQE 700的虚拟地址,是取所述CQ起源504,并对其加上所述CQ头索引518乘以CQE的尺寸。将提取来自所述当前CQE 700的信息返回给所述调用者。
在步骤12中,如果所述当前CQE 700的有效指示702为无效,则除了无完成状态外不返回完成信息。当队列对具有未完成的操作时,可能会调用所述破坏队列对动词,它将会解除所述队列对所关联的资源。具体地说,所述QP系统属性1000和所述QP用户属性1006块可能不再可用。因此,需要判断对于任何队列对,完成信息未完成时,是否破坏了这些队列对。如果发生了这种未必可能的事件,所述队列对动词就在所述发送和接收操作的完成队列所关联的破坏的QP CQE队列506上保留完成有关的模拟信息,并且调用内核服务,从发送和接收操作的完成队列所关联的所述破坏的QP CQE队列506获取单元,返回所述调用者。当返回单元时,在步骤20的QP PROCESSING处继续处理。如果所述破坏QP CQE队列为空或无单元返回,就使得控制流转向所述标注EXIT LOGIC,向所述调用者返回无完成状态。
在步骤13中,在所述CQ头索引518给出的当前CQE有效的情况下,所述流开始。在返回所述完成状态之前,存在着所有权的竞争。
在步骤14中,为了准备所述COMPARE AND SWAP,将“new”复制到“old”,它涉及所述串行化区526。
在步骤15中,在所述“new”变量中所述CQ头索引518增加,考虑到它可能已经环绕。在所述完成队列600中,如果当前索引是最后的索引(N),并且下一个索引是第一个索引(0),就发生环绕。如果发生了环绕,在“new”变量中的索引变为0,而不是向旧值加1。CQ轮询计数516是应付小队列的机制,使得更可能发生环绕,并且另一个线程或一系列线程有可能要求所述完成队列600上单元的所有权。
在步骤16中,对与先前相同的串行化区526发布COMPAREAND SWAP。在这种情况下,不是试图更新所述使用计数,而是更新了所述CQ头索引518和CQ轮询计数516。
在步骤17中,如果COMPARE AND SWAP失败,则在所述串行化区526中已经发生了改变,或者另一个线程已经要求所述当前CQE的所有权,或者已经发生了另一个状态改变。如果在所述CQ系统属性500中的所述CQ实例号514与在所述CQ句柄800中的CQ实例号802不同,则立即向所述调用者返回控制,并指示所述完成队列600对所述轮询操作无效。在所有其他情况下,如果所述COMPAREAND SWAP失败,控制流转向步骤10的所述FETCH CQE标注。
在步骤18中,在完成了以下步骤时,将向所述调用者返回带有成功状态的CQE。
在步骤19中,更新了所述HCA空闲CQ计数寄存器900,它指示所述完成队列600上所述硬件可得到的空闲单元数目。在这点上有可能存在延迟,并且可能存在着其他线程要求队列中再向下之其他单元的所有权。例如,假若这个线程要求了所述完成队列600中单元1的所有权,在单元2和单元3中就可能存在完成事件。这些其他线程可能独立地执行这个同一逻辑,包括增大所述CQ头索引518和增大所述HCA空闲CQ计数寄存器900。结果,所述HCA可能改变空闲CQE的内容,事实上,它可能是当前线程所要求的CQE,即单元1。这就是为什么在步骤13中进行了所述CQE的备份。
在步骤20中,已经要求了所述CQ头索引518的所有权,并且所述完成状态的备份处于动态存储中,以便返回调用者。以下步骤将更新所拥有的CQE 700所关联的队列对状态信息,其完成状态将向调用者返回。所述CQE 700中的QP位置信息704用于为CQE 700所关联的队列对计算QP系统属性1000的地址。
在步骤21中,对比有关的QP实例号706与QP实例号1002。例如,有可能所述队列对已破坏,所述实例号已改变。在这种情况下,控制流转向步骤31的所述标注EXIT LOGIC。
在步骤22中,为了确定空闲WQE计数1010,从QP系统属性1000中的有关的用户属性1004提取了QP用户属性1006的地址。所述工作队列由QP系统属性1000和QP用户属性1006跟踪。所述工作队列具有的若干单元(WQE)对应于发送或接收数据的请求。
在步骤23中,从QP用户属性1006提取串行化区1008,而不是从CQ用户属性512。这个值复制到称为“oldpost”的变量。
在步骤24中,将“oldpost”复制到“newpost”。
在步骤25中,判断是否存在请求的破坏QP 1012。如果有,控制流转向步骤31的标注EXIT LOGIC。
在步骤26中,对比CQE 700中有关的QP实例号706与QP用户属性1006中的QP实例号1014。如果它们不同,则控制流转向步骤31的标注EXIT LOGIC。
在步骤27中,“newpost”中的空闲WQE计数1010增大了CQE700中已完成WQE的数目708。多个完成事件可以合成在单一的CQE700中。
在步骤28中,如果CQE 700的动态副本中的WQE时间标记信息710有效,则对,“newpost”副本清除QP用户属性1006中所请求的时间标记1016(设置为0)。WQE时间标记信息710向调用者指示他的工作请求花了多长时间。
在步骤29中,在QP用户属性串行化区1108中执行所述COMPARE AND SWAP。在另一个线程正在改变所述“newpost”时间标记1016的当前值、所述“newpost”空闲WQE计数1010的当前值或另一个字段的情况下,COMPARE AND SWAP将可能失败。
在步骤30中,失败后控制流转向步骤24的标注UPDATE QP。
以上多个步骤转移至步骤31的EXIT LOGIC标注。按照CQ用户属性512中的串行化区526设置“old”变量。
在步骤32中,将“old”变量复制到“new”变量。
在步骤33中判断是否存在某种干预,比如破坏CQ功能已经改变了实例号。如果CQ实例号514与CQ实例号802不符,则向调用者返回失败返回码。通常情况下不存在这种干预。
在步骤34中,串行化区526中的所述“new”CQ使用计数524减小。
在步骤35中,执行COMPARE AND SWAP,以发出所述当前线程不再使用所述完成队列600或有关的控制结构500或512的信号。
在步骤36中,失败后控制流转向步骤32的标注UNLOCK CQ,例如假若另一个轮询线程正在执行这些相同的步骤或破坏QP功能正在进入时,它有可能发生。
在步骤37中,如果“new”CQ使用计数524为0,并设置了请求的破坏520,则调用内核函数恢复所述破坏完成队列。如果所述当前线程是最后退出的线程,并且也已经请求了所述破坏完成队列,这将可能发生。
在步骤38中,封装输出数据,比如传输的字节数。
在步骤39中,向所述调用者返回所述轮询完成状态,并且当成功时返回所述完成的输出数据。
本发明的示范实施例具有许多优点。实施例提供了HCAD中的轮询支持,可以在多线程环境中调用,而不必使用串行化技术比如闭锁和锁存或其他需要进入内核的服务。轮询处理也利用内核实施的破坏完成队列和破坏完成QP操作串行化。结果,用户模式程序可以在用户模式下处理工作请求的完成,即没有内核干预,不用闭锁和锁存而能够运行。结果,执行的指令更少,消耗的资源更少,改进了性能。
另一个优点在于明智地应用了比较和交换机器指令,避免了链接成本和状态转换成本。这种指令容许自动地串行化状态变化,而且没有使用操作系统的开销。它还容许多线程技术,在大服务器环境下这是非常希望的。
另一个优点涉及执行轮询功能的示范伪代码与其他动词之间的互动,它们是特权操作,比如破坏完成队列和破坏队列对。所述示范伪代码解决了以下问题:如何对轮询动词串行化未授权环境下发生的的事件和活动,同时与操作系统串行化,它有特权并运行在不同的线程上。所述示范伪代码不仅串行化在相同队列上试图同时轮询的多个线程,而且还串行化了在其他线程上调用的操作系统功能,这些线程使用的资源与轮询正在试图访问的资源相同。非特权的示范实施例在其正在访问资源时,通过通报有特权的操作系统,使得在所述示范实施例正在试图使用这些资源时,它们不被所述操作系统丢弃,从而保护了示范实施例本身。这就避免了试图访问因为已重新分配而属于另一个用户的若干资源的完整性问题。
如上所述,本发明的实施例能够以计算机实施的过程和装置的形式实施,以便实践这些过程。本发明的实施例也能够以计算机程序代码的形式实施,其中包含的指令记录在有形的介质中,比如软盘、CD-ROM、硬盘驱动器或计算机可读的任何其他存储介质,其中,当所述计算机程序代码加载到计算机中并执行时,所述计算机变为实践本发明的装置。本发明还能够以计算机程序代码的形式实施,例如,无论是存储在存储介质中,加载到计算机中和/或执行,还是在某种传输媒介传送,比如经由电线或电缆、经由光纤或电磁辐射,其中,当所述计算机程序代码加载到计算机中并执行时,所述计算机变为实践本发明的装置。当在通用微处理器上实施时,所述计算机程序代码段配置所述微处理器,以建立特定的逻辑电路。
尽管参考若干示范实施例已经介绍了本发明,本领域的技术人员应当理解,可以进行许多改变以及对其中的单元可以进行等价的替换,而不脱离本发明的范围。不仅如此,多种组件可以实施在硬件、软件、固件或其任意组合中。最后,对本发明的教导可以作出许多修改以适应具体情况或材料,而不脱离其本质范围。因此,这意味着本发明不限于把所公开的具体实施例作为实施本发明所预期的最佳或唯一模式,而是本发明将包括附带的权利要求书范围之内的所有实施例。此外,使用术语第一、第二等并不表示任何次序或重要性,而是术语第一、第二等只是用于将一个单元与另一个单元区分。另外,使用术语一个等并不表示数量的限制,而是表示至少有一个引用项存在。