本发明属于磁盘阵列读写领域,特别涉及一种宽端口场景下i/o指令的保序管理方法及装置。
背景技术:
:sas是存储网络中使用最广泛的硬盘连接技术之一,具备当前硬盘通道技术中的最高接口速率,在sas磁盘设备阵列中,sas设备所建立的宽链路通常是由sas设备包含的一个以上phy的宽端口来实现。宽端口技术使得传输带宽得到成倍的提升。而在宽端口架构中,由于待接收的数据帧(frame)可能从宽端口内的任意一个phy接收,在将这些帧信息写入主机内存(ddr)并反馈给应用层软件时,需要保证写入时一定按照帧的顺序依次写入正确的地址空间。参见图1,现有技术中主机内存接收来自sas磁盘设备的数据流过程举例说明如下:1.主机下达读数据i/o指令;2.磁盘收到读数据i/o指令,开始准备读数据;3.磁盘准备好第一批3帧(假设接收端每个通道的接收缓存rxbuffer的容量大小正好为3帧)数据后,申请建立连接,expander选择phy0作为当前传输通道。4.连接建立成功后,磁盘将3帧数据写入通道0的接收缓存rxbuffer,然后关闭连接,并继续准备当前i/o读指令的剩余数据。5.通道0收到3帧读数据之后,开始执行dma搬运,将数据搬运至主机内存(ddr)。6.磁盘准备好第二批的3帧数据,重新申请建立连接,expander根据通道忙闲情况选择phy1作为当前传输通道。7.连接建立成功后,磁盘将第二批3帧数据写入通道1的接收缓存rxbuffer,然后关闭连接并继续准备当前i/o读指令的剩余数据。重复上述步骤3~6的操作。其中,通道1收到3帧数据之后,在启动dma传输之前必须确保前3帧的dma传输已经完成,且获取到正确的dma断点,才能启动当前的dma传输,否则写入ddr的数据帧顺序就会出现错误,最终导致i/o指令的读数据错误。可见,由于理想情况下dma的传输速度比硬盘的返回数据速度快,在硬盘返回下一批数据之前,上一批数据已经全部通过dma传输到ddr中。而实际情况下,并不一定能够保证在启动dma传输之前已完成前3帧dma传输。而由于未进行保序处理,则难以避免出现读数据被乱序覆盖而导致读数据错误的问题,特别是在总线出现拥塞的情况下。技术实现要素:本发明在第一方面提供了一种宽端口场景下i/o指令的保序管理装置,包括:多个物理i/o通道,每个i/o通道包括独立的接收缓存和dma传输模块,所述接收缓存,用于缓存来自磁盘中的i/o指令数据帧,所述dma传输模块,用于将所缓存的i/o指令数据帧搬运至主机内存;指令接收管理器,设置于所述多个物理i/o通道的dma传输模块与主机的总线之间,所述指令接收管理器被配置为,接收来自所述dma传输模块的i/o指令数据帧,对每个i/o指令设置帧计数器,通过所述帧计数器的数值来确定i/o指令的多个数据帧被发送至主机内存的顺序;所述dma传输模块进一步配置为,根据所确定的顺序,将i/o指令数据帧搬运至主机内存。优选地,所述帧计数器包括接收帧计数器和传输帧计数器,所述传输帧计数器表示所述i/o指令已经被dma搬运完成的帧数量,所述接收帧计数器表示i/o指令已经从物理通道接收的帧数量。优选地,所述指令接收管理器进一步被配置为,对每个i/o指令保存一个表项,所述表项包含每个i/o指令所对应的编号及其接收帧计数器和传输帧计数器的映射关系。优选地,每个所述i/o通道包括临时计数器,所述指令接收管理器进一步被配置为:在检测到新的接收数据帧时,接收sas通道上报i/o指令的编号,查找当前i/o指令的编号是否已经在所述表项中;如果所述表项中已存在当前编号,则将当前编号对应的所述接收帧计数器的值赋值给每个i/o通道本地的临时计数器,而当前编号对应的所述接收帧计数器的值加1;如果表项中不存在当前编号,则将该编号存入一个空的表项,同时将该表项对应的所述接收帧计数器的值加1,所述传输帧计数器的值置0,i/o通道本地的临时计数器置0;然后,查找该表项中当前编号对应的所述传输帧计数器,与当前帧所对应的i/o通道中的所述临时计数器的值进行比较;如果所述传输帧计数器与所述临时计数器的值相等,则启动当前帧所对应的i/o通道的dma传输,即将start信号置为有效,在所述dma传输完成之后将所述传输帧计数器的值加1;否则,如果所述传输帧计数器与所述临时计数器的值不相等,则禁止当前帧所对应的i/o通道的dma传输;以预设周期更新所述传输帧计数器,直到所述传输帧计数器与当前帧所对应的i/o通道的临时计数器的值相等时再启动该i/o通道的dma传输。优选地,所述指令接收管理器进一步配置为,在当前i/o指令编号对应的i/o指令的所有数据帧都被dma搬运完毕后,将该编号从所述表项中删除。相应地,根据本发明的另一方面,提供了一种宽端口场景下i/o指令的保序管理方法,包括:在多个物理i/o通道中,利用独立的接收缓存来缓存来自磁盘的i/o指令数据帧;对每个i/o指令设置帧计数器,通过所述帧计数器的数值来确定当前数据帧被发送至主机内存的顺序;根据所确定的顺序,将i/o指令数据帧通过dma传输搬运至主机内存。优选地,所述帧计数器包括接收帧计数器和传输帧计数器,所述传输帧计数器表示所述i/o指令已经被dma搬运完成的帧数量,所述接收帧计数器表示i/o指令已经从物理通道接收的帧数量。优选地,对每个i/o指令保存一个表项,所述表项包含每个i/o指令所对应的编号及其接收帧计数器和传输帧计数器的映射关系。优选地,所述多个物理i/o通道的每个i/o通道包括临时计数器,所述方法进一步包括:在检测到新的接收数据帧时,接收sas通道上报i/o指令的编号,查找当前i/o指令的编号是否已经在所述表项中;如果所述表项中已存在当前编号,则将当前编号对应的所述接收帧计数器的值赋值给每个i/o通道本地的临时计数器,而当前编号对应的所述接收帧计数器的值加1;如果表项中不存在当前编号,则将该编号存入一个空的表项,同时将该表项对应的所述接收帧计数器的值加1,所述传输帧计数器的值置0,i/o通道本地的临时计数器置0;然后查找该表项中当前编号对应的所述传输帧计数器,与当前帧所对应的i/o通道中的所述临时计数器的值进行比较;如果所述传输帧计数器与所述临时计数器的值相等,则启动当前帧所对应的i/o通道的dma传输,即将start信号置为有效,在所述dma传输完成之后将所述传输帧计数器的值加1;否则,如果所述传输帧计数器与所述临时计数器的值不相等,则禁止当前帧所对应的i/o通道的dma传输;以预设周期更新所述传输帧计数器,直到所述传输帧计数器与当前帧所对应的i/o通道的临时计数器的值相等时再启动该i/o通道的dma传输。优选地,在当前i/o指令编号对应的i/o指令的所有数据帧都被dma搬运完毕后,将该编号从所述表项中删除。相比于现有技术,本发明具有以下优点:本发明解决了sas宽端口场景下接收数据的多数据帧保序问题,实现了i/o读指令的读数据写回主机内存的数据帧按顺序写入,避免多个端口同时发起dma操作并且总线拥塞时出现读数据错误,提高系统的鲁棒性。本发明的其它特征和优点将在随后的说明书中阐述,并且部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在说明书、权利要求书以及附图中所指出的结构来实现和获得。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来说,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1示出了根据现有技术的宽端口i/o指令主机接收数据流的示意图。图2示出了根据本发明实施例的rx_manager在宽端口场景下i/o指令上行/下行交互示意图。图3示出了根据本发明实施例的宽端口场景下i/o指令的保序管理装置模块图。图4示出了根据本发明实施例的宽端口场景下i/o指令的保序管理方法流程图。具体实施方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地说明,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。如上所述,在不进行i/o保序的情况下,如果发生系统内部总线访问频繁而导致总线拥塞,可能导致dma来不及在下一批数据返回之前完成上一批数据的搬运,从而发生读数据指令出错。本发明提供了一种宽端口场景下i/o指令的保序管理方法和装置,用于sas宽端口场景下接收数据的多数据帧保序。在宽端口场景下,由于待接收的数据帧(frame)可能从宽端口内的任意一个phy接收,所以接收策略不仅包括接收本身,还包括对接收到的数据帧(frame)进行必要的检测,主要功能是用于确保宽端口模式下各个通道之间接收到的帧数据保序,按主机内存(ddr)连续地址写入。根据本发明的另一方面,相应地,提供了一种宽端口场景下i/o指令的保序管理装置。在本发明优选的实施例中,针对一个宽端口下的所有通道(phy),对每一个i/o指令设置接收帧计数器recv_tag和传输帧计数器tran_tag,通过帧计数器的数值来确定当前数据帧在主机内存(ddr)中所在的位置和顺序。本发明的宽端口场景下i/o指令的保序管理装置包括称为rx_manager的指令接收管理器模块,用于实现上述接收检测和保序功能。图3示出了根据本发明实施例的宽端口场景下i/o指令的保序管理装置模块图。rx_manager设置于dma传输模块与数据总线之间,用于直接控制所有通道的dma的传输。在rx_manager中,为当前正在处理的每个i/o指令保存一个表项,用于保存当前接收数据帧的序号。该表项的格式举例如下:bit[21:17]bit[16:12]bit[11:0]recv_tag_0tran_tag_0iptt_0recv_tag_1tran_tag_1iptt_1………recv_tag_15tran_tag_15iptt_15该表项包含3个字段:1.iptt:表示存在保序需求的i/o指令所对应的编号iptt;2.tran_tag:表示i/o指令已经被dma搬运完成的帧数量;3.recv_tag:表示i/o指令已经从物理通道接收的帧数量。所述rx_manager模块具体被配置为,在检测到新的接收数据帧时,接收sas通道上报i/o指令的编号iptt,查找当前i/o指令的编号iptt是否已经在上述表项中。如果表项中已存在当前iptt,则rx_manager模块将当前iptt对应的recv_tag赋值给每个通道本地的exp_tag临时计数器,表示期望的tag号,而当前iptt对应的recv_tag加1;如果表项中不存在当前iptt,则rx_manager模块将该iptt存入一个空的表项,同时将该表项的recv_tag加1,tran_tag置0,通道本地的exp_tag计数器置0。此时,当前每个iptt都已存在对应的表项。rx_manager模块继续查找该表项中当前iptt对应的tran_tag,与通道中的exp_tag号进行比较。如果tran_tag与exp_tag相等,则rx_manager模块启动该通道的dma传输,即将start信号置为有效,传输完成之后将tran_tag加1;如果tran_tag与exp_tag不相等,则rx_manager模块禁止当前通道的dma传输。其中,如果tran_tag与exp_tag不相等,表明前面的数据dma还未传输完毕,rx_manager需要等待前面的数据dma完成才能启动当前通道的dma传输,以此来确保写入主机内存的数据帧顺序。rx_manager模块以预设周期更新tran_tag,直到tran_tag与当前通道的exp_tag相等时再启动该通道的dma传输。优选地,rx_manager模块在当前iptt号对应的i/o指令的所有数据帧都被dma搬运完毕后,将该iptt从所述表项中删除。具体参见图2的rx_manager的上行/下行数据交互示意图。,当某个物理i/o通道的rxdmac检测到接收到来自buffer的一帧时,置有效性信号vld有效,同时向rx_manager提供所接收帧所对应的指令编号iptt;rx_manager检测到vld之后,对帧接收计数器进行加1操作,同时向rxdmac反馈接收到vld的就绪握手信号rdy;rxdmac接收到rdy信号后将vld信号置零。在rx_manager准备授权该rxdmac执行从接收帧缓存到主机内存ddr的搬运操作时,将启动信号start拉高,而该rxdmac检测到start为高时,执行数据搬运操作,搬运完毕后,将结束信号end拉高一个时钟周期,rx_manager收到end信号之后,将start信号置零。需要说明的是,表项中的数字序号(如iptt_0,…,iptt_15)表示存在保序需求的每个i/o指令的编号,该编号与sas通道中的i/o指令的数量是相对应的。本领域技术人员应当理解,在本发明的基础上可以根据实际需要对存在保序需求的i/o通道数量和i/o指令数量做出任意的调整,而不应将本发明限于上述示例的具体数值。同样地,表项中的bit(如[21:17])仅为比特位数的示例,本领域技术人员应当理解,在本发明的基础上可以根据实际需要对每个字段的比特数做出任意的调整,而不应将本发明限于上述示例的具体数值。根据本发明的另一方面,相应地,提供了一种宽端口场景下i/o指令的保序管理方法。图4示出了根据本发明实施例的宽端口场景下i/o指令的保序管理方法流程图。所述方法包括:在多个物理i/o通道中,利用接收缓存来缓存来自磁盘的i/o指令数据帧;rx_manager模块对每个i/o指令设置帧计数器,通过所述帧计数器的数值来确定当前数据帧被发送至主机内存的顺序;根据所确定的顺序,将所缓存的i/o指令数据帧通过dma传输模块搬运至主机内存。根据本发明的方法,rx_manager模块对接收到的数据帧进行必要的检测,用于确保宽端口模式下各个通道之间接收到的帧数据保序,按主机内存(ddr)连续地址写入。在优选的实施例中,具体操作流程举例如下:1.sas通道在检测到新的接收数据帧时上报i/o指令的编号iptt;2.rx_manager模块查找当前i/o指令的编号iptt是否已经在表项中;如果表项中已存在当前iptt,则将当前iptt对应的recv_tag赋值给每个通道本地的exp_tag计数器,表示期望的tag号,而当前iptt对应的recv_tag加1;如果表项中不存在当前iptt,则rx_manager将该iptt存入一个空的表项,同时将该表项的recv_tag加1,tran_tag置0,通道本地的exp_tag计数器置0;3.rx_manager模块查找当前iptt对应的tran_tag,与通道中的exp_tag号进行比较;如果tran_tag与exp_tag相等,则启动该通道的dma传输,即将start信号置为有效,传输完成之后将tran_tag加1;如果tran_tag与exp_tag不相等,则禁止当前通道的dma传输。其中,如果tran_tag与exp_tag不相等,表明前面的数据dma还未传输完毕,需要等待前面的数据dma完成才能启动当前通道的dma传输,以此来确保写入主机内存的数据帧顺序。rx_manager模块以预设周期更新tran_tag,直到tran_tag与当前通道的exp_tag相等时再启动相应通道的dma传输。4.在当前iptt号对应的i/o指令的所有数据帧都被dma搬运完毕后,将该iptt从所述表项中删除。上述方法中,仅当满足tran_tag与当前通道的exp_tag相等的条件时,再将start信号置为有效,保证了前面的数据dma完成并更新tran_tag后,才能启动当前通道的dma传输。由此可以确保写入主机内存(ddr)的数据帧顺序是正确的。可选地,在步骤3中,还可通过控制磁盘来保证写入主机内存的数据帧顺序。具体地,如果tran_tag与exp_tag相等,则启动该通道的磁盘数据接收,传输完成之后将tran_tag加1;如果tran_tag与exp_tag不相等,则禁止接收该磁盘的新数据,因为tran_tag与exp_tag不相等表明了前面的数据dma还未传输完毕,需要等待前面的数据dma完成才能从磁盘接收后续数据。此外,本领域技术人员可以理解,上述端口场景下i/o指令的保序管理装置并不构成对sas磁盘阵列结构的限定,sas磁盘阵列设备可以包括现有技术中更多或更少的部件,或者某些部件的组合。可以看出,本发明通过以上具体实施例的技术方案,实现了磁盘阵列系统中宽端口场景下i/o读指令的读数据写回主机内存(ddr)的数据帧按顺序写入,避免由于总线拥塞,多个端口同时发起dma操作而导致的读数据写入主机内存(ddr)时数据帧地址的错误,提高系统的鲁棒性。尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。当前第1页1 2 3 
技术特征:1.一种宽端口场景下i/o指令的保序管理装置,其特征在于,包括:
多个物理i/o通道,每个i/o通道包括独立的接收缓存和dma传输模块,所述接收缓存,用于缓存来自磁盘中的i/o指令数据帧,所述dma传输模块,用于将所缓存的i/o指令数据帧搬运至主机内存;
指令接收管理器,设置于所述多个物理i/o通道的dma传输模块与主机的总线之间,所述指令接收管理器被配置为,接收来自所述dma传输模块的i/o指令数据帧,对每个i/o指令设置帧计数器,通过所述帧计数器的数值来确定i/o指令的多个数据帧被发送至主机内存的顺序;
所述dma传输模块进一步配置为,根据所确定的顺序,将i/o指令数据帧搬运至主机内存。
2.根据权利要求1所述的宽端口场景下i/o指令的保序管理装置,其特征在于,所述帧计数器包括接收帧计数器和传输帧计数器,所述传输帧计数器表示所述i/o指令已经被dma搬运完成的帧数量,所述接收帧计数器表示i/o指令已经从物理通道接收的帧数量。
3.根据权利要求2所述的宽端口场景下i/o指令的保序管理装置,其特征在于:
所述指令接收管理器进一步被配置为,对每个i/o指令保存一个表项,所述表项包含每个i/o指令所对应的编号及其接收帧计数器和传输帧计数器的映射关系。
4.根据权利要求3所述的宽端口场景下i/o指令的保序管理装置,其特征在于,每个所述i/o通道包括临时计数器,所述指令接收管理器进一步被配置为:
在检测到新的接收数据帧时,接收sas通道上报i/o指令的编号,查找当前i/o指令的编号是否已经在所述表项中;
如果所述表项中已存在当前编号,则将当前编号对应的所述接收帧计数器的值赋值给每个i/o通道本地的临时计数器,而当前编号对应的所述接收帧计数器的值加1;如果表项中不存在当前编号,则将该编号存入一个空的表项,同时将该表项对应的所述接收帧计数器的值加1,所述传输帧计数器的值置0,i/o通道本地的临时计数器置0;
然后,查找该表项中当前编号对应的所述传输帧计数器,与当前帧所对应的i/o通道中的所述临时计数器的值进行比较;
如果所述传输帧计数器与所述临时计数器的值相等,则启动当前帧所对应的i/o通道的dma传输,即将start信号置为有效,在所述dma传输完成之后将所述传输帧计数器的值加1;
否则,如果所述传输帧计数器与所述临时计数器的值不相等,则禁止当前帧所对应的i/o通道的dma传输;
以预设周期更新所述传输帧计数器,直到所述传输帧计数器与当前帧所对应的i/o通道的临时计数器的值相等时再启动该i/o通道的dma传输。
5.根据权利要求1所述的宽端口场景下i/o指令的保序管理装置,其特征在于,所述指令接收管理器进一步配置为,在当前i/o指令编号对应的i/o指令的所有数据帧都被dma搬运完毕后,将该编号从所述表项中删除。
6.一种宽端口场景下i/o指令的保序管理方法,其特征在于,包括:
在多个物理i/o通道中,利用独立的接收缓存来缓存来自磁盘的i/o指令数据帧;
对每个i/o指令设置帧计数器,通过所述帧计数器的数值来确定当前数据帧被发送至主机内存的顺序;
根据所确定的顺序,将i/o指令数据帧通过dma传输搬运至主机内存。
7.根据权利要求6所述的宽端口场景下i/o指令的保序管理方法,其特征在于,所述帧计数器包括接收帧计数器和传输帧计数器,所述传输帧计数器表示所述i/o指令已经被dma搬运完成的帧数量,所述接收帧计数器表示i/o指令已经从物理通道接收的帧数量。
8.根据权利要求7所述的宽端口场景下i/o指令的保序管理方法,其特征在于,对每个i/o指令保存一个表项,所述表项包含每个i/o指令所对应的编号及其接收帧计数器和传输帧计数器的映射关系。
9.根据权利要求8所述的宽端口场景下i/o指令的保序管理方法,其特征在于,所述多个物理i/o通道的每个i/o通道包括临时计数器,所述方法进一步包括:
在检测到新的接收数据帧时,接收sas通道上报i/o指令的编号,查找当前i/o指令的编号是否已经在所述表项中;
如果所述表项中已存在当前编号,则将当前编号对应的所述接收帧计数器的值赋值给每个i/o通道本地的临时计数器,而当前编号对应的所述接收帧计数器的值加1;如果表项中不存在当前编号,则将该编号存入一个空的表项,同时将该表项对应的所述接收帧计数器的值加1,所述传输帧计数器的值置0,i/o通道本地的临时计数器置0;
然后查找该表项中当前编号对应的所述传输帧计数器,与当前帧所对应的i/o通道中的所述临时计数器的值进行比较;
如果所述传输帧计数器与所述临时计数器的值相等,则启动当前帧所对应的i/o通道的dma传输,即将start信号置为有效,在所述dma传输完成之后将所述传输帧计数器的值加1;
否则,如果所述传输帧计数器与所述临时计数器的值不相等,则禁止当前帧所对应的i/o通道的dma传输;
以预设周期更新所述传输帧计数器,直到所述传输帧计数器与当前帧所对应的i/o通道的临时计数器的值相等时再启动该i/o通道的dma传输。
10.根据权利要求6所述的宽端口场景下i/o指令的保序管理方法,其特征在于,进一步包括,在当前i/o指令编号对应的i/o指令的所有数据帧都被dma搬运完毕后,将该编号从所述表项中删除。
技术总结本发明提供了一种宽端口场景下I/O指令的保序管理方法及装置,包括:多个物理I/O通道,每个I/O通道包括独立的接收缓存和DMA传输模块,接收缓存用于缓存来自磁盘中的I/O指令数据帧,DMA传输模块用于将所缓存的I/O指令数据帧搬运至主机内存;指令接收管理器设置于所述多个物理I/O通道的DMA传输模块与主机的总线之间,配置为接收来自所述DMA传输模块的I/O指令数据帧,对每个I/O指令设置帧计数器,通过帧计数器的数值来确定I/O指令的多个数据帧被发送至主机内存的顺序;DMA传输模块根据所确定的顺序,将I/O指令数据帧搬运至主机内存。
技术研发人员:宁佐林;刘亿民
受保护的技术使用者:无锡众星微系统技术有限公司
技术研发日:2020.11.30
技术公布日:2021.03.12