查询队列状态的方法与装置
技术领域
本发明涉及用于处理NVMe命令的NVMe控制器,特别地,涉及在NVMe控制器中高效识别多个NVMe队列的状态。
背景技术
设备之间通过队列交换命令或消息是常用的。命令发送方将命令插入提交队列尾部,命令接收方从队列尾部取出命令并处理,将处理结果插入到完成队列尾部,命令发送方从完成队列头部取出命令处理结果。通过队列交换命令,能够在发送方与接收方直接维护多个并发的命令,并且命令之间的处理速度不必一致。NVMe协议(参见“NVM Express Revision 1.2”,2014年11月3日,通过引用将其全文合并于本说明书)定义了主机(Host)与设备(Device)之间交换数据的命令与数据结构(如图1所示)。主机中维护多个队列,每个队列中可填充多个命令。主机与设备基于队列交换数据。主机将命令C填入提交队列,设备从提交队列中取得命令C,并按命令C的内容进行处理,将处理结果填入完成队列。主机从完成队列获取命令C的处理结果以知晓命令C的处理完成。
依据NVMe协议,在设备端维护多个队列的队首与队尾指针。主机与设备都会更新队首与队尾指针。主机向设备发送命令时,主机将命令插入提交队列的队尾,并更新队尾指针。设备端比较提交队列的队首指针与队尾指针,在二者不同时,确定队列中有待处理的命令。设备端从队列中取出命令后,更新队首指针。主机端基于队首指针与队尾指针,可确定队列中是否有空间容纳新的命令。
在软件组件之间、集成电路组件之间以及软件与硬件之间也使用队列交换消息或命令。
发明人提出了在设备端维护队列指针的方式(申请号为201510997494.X、发明名称为NVMe门铃处理方法及其装置的中国专利申请)。(参看图2),将队列指针存储在设备端的NVMe控制器的存储器中,从而设备端的NVMe控制器可维护不同数量的NVMe队列指针。当在主机与设备之间有N个队列时,在存储器中存储2N个指针。为每个队列在存储器中存储队首指针与队尾指针。在NVMe控制器中还提供状态寄存器,用以指示各个队列的状态(队首指针与队尾指针是否相同,队首指针与队尾指针不同,意味着队列中有待处理的NVMe命令),状态寄存器中为每个队列提供一个寄存器位。
在图2中,主机能够访问设备端的存储器中存储的队列指针;NVMe控制器的CPU能够访问存储器中存储的队列指针;监控器组件1,在监视到主机更新存储器中的队尾指针时,设置状态寄存器中与该队尾指针所属的队列所对应的位;监控器组件2,在监视到NVMe控制器的CPU更新存储器中的队首指针时,读取与该队首指针相对应的队尾指针,在队首指针与队尾指针不同时,设置状态寄存器中与该队尾指针所属的队列所对应的位;在队首指针与队尾指针相同时,清除状态寄存器中与该队尾指针所属的队列所对应的位。
发明内容
然而,NVMe控制器CPU需要从状态寄存器中获取队列的状态,当队列数量较多时(如数千、数万个),访问状态寄存器会需要较多的CPU处理时间,并导致对队列的处理延迟增加。
因而,需要提供技术方案,使得NVMe控制器CPU能够尽快获知队列的状态。
根据本发明的第一方面,提供了根据本发明第一方面的第一队列状态查询电路,包括CPU,以及可被所述CPU访问的指示寄存器与状态寄存器,其中,状态寄存器的每个比特用以指示多个队列之一的状态;指示寄存器的每个比特指示状态寄存器的预定范围是否存在被置位的比特;所述CPU通过执行区段加载指令将状态寄存器的指定范围的值加载到CPU的目标寄存器;其中区段加载指令包括区段字段,用以描述状态寄存器的指定范围。
根据本发明的第一方面的第一队列状态查询电路,提供了根据本发明第一方面的第二队列状态查询电路,其中所述状态寄存器有1024比特,用于指示1024个队列的状态;以及所述指示寄存器有32比特,所述指示寄存器的每个比特指示状态寄存器的指定32比特中存在被置位的比特。
根据本发明的第一方面的第一或第二队列状态查询电路,提供了根据本发明第一方面的第三队列状态查询电路,其中状态寄存器被组织为多行与多列;以及所述区段加载指令的区段字段用于描述状态寄存器的行;所述CPU在执行区段加载指令时,将状态寄存器中被区段字段所指示的行加载到CPU的目的寄存器。
根据本发明的第一方面的第三队列状态查询电路,提供了根据本发明第一方面的第四队列状态查询电路,其中状态寄存器有32行与32列。
根据本发明的第一方面的第三或第四队列状态查询电路,提供了根据本发明第一方面的第五队列状态查询电路,其中指示寄存器的每个比特同状态寄存器的1行相对应,当状态寄存器的第一行中有任意比特被置位时,指示寄存器中同所述第一行相对应的比特被置位。
根据本发明的第一方面的前述队列状态查询电路,提供了根据本发明第一方面的第六队列状态查询电路,其中所述指示寄存器的宽度同所述CPU的数据总线宽度相同,以及所述状态寄存器的列数同所述CPU的数据总线宽度相同,使得对指示寄存器的访问以及区段加载指令的执行在一次总线传输内完成。
根据本发明的第二方面,提供了根据本发明第二方面的第一队列状态查询电路中的CPU执行的方法,包括:S1,读取指示寄存器;S2,对于指示寄存器中的第一有效比特,确定第一有效比特在指示寄存器中的第一位置;S3,以第一位置设置区段加载指令的区段字段,并执行区段加载指令,来将状态寄存器中与所述第一位置相对应的范围加载到目标寄存器;S4,基于目标寄存器中的第二有效比特,访问与第二有效比特相对应的队列。
根据本发明的第二方面的第一队列状态查询电路中的CPU执行的方法,提供了根据本发明第二方面的第二队列状态查询电路中的CPU执行的方法,还包括:轮询指示寄存器中的每个比特,对于指示寄存器中的每个有效比特,根据该有效比特在指示寄存器中的位置设置区段加载指令的区段字段,并执行区段加载指令。
根据本发明的第二方面的第一队列状态查询电路中的CPU执行的方法,提供了根据本发明第二方面的第三队列状态查询电路中的CPU执行的方法,其中所述指示寄存器的比特具有不同的优先级;以及所述第一有效比特是所述指示寄存器的多个有效比特中的优先级高的比特。
根据本发明的第二方面的第一至第三队列状态查询电路中的CPU执行的方法,提供了根据本发明第二方面的第四队列状态查询电路中的CPU执行的方法,还包括:
将所述指示寄存器的第一有效比特置为无效。
根据本发明的第二方面的第一至第四队列状态查询电路中的CPU执行的方法,提供了根据本发明第二方面的第五队列状态查询电路中的CPU执行的方法,其中所述队列状态查询电路是根据本发明第一方面的队列状态查询电路。
根据本发明的第二方面的第一至第五队列状态查询电路中的CPU执行的方法,提供了根据本发明第二方面的第六队列状态查询电路中的CPU执行的方法,其中以轮询方式从目标寄存器中选择第二有效比特。
根据本发明的第三方面,提供了根据本发明第三方面的队列状态查询电路中的CPU执行的装置,包括:指示寄存器读取模块,用于读取指示寄存器;位置确定模块,用于对于指示寄存器中的第一有效比特,确定第一有效比特在指示寄存器中的第一位置;区段加载模块,用于以第一位置设置区段加载指令的区段字段,并执行区段加载指令,来将状态寄存器中与所述第一位置相对应的范围加载到目标寄存器;队列访问访问模块,用于基于目标寄存器中的第二有效比特,访问与第二有效比特相对应的队列。
根据本发明的第三方面的第一队列状态查询电路中的CPU执行的装置,提供了根据本发明第三方面的第二队列状态查询电路中的CPU执行的装置,还包括:轮询模块,用于轮询指示寄存器中的每个比特,对于指示寄存器中的每个有效比特,根据该有效比特在指示寄存器中的位置设置区段加载指令的区段字段,并执行区段加载指令。
根据本发明的第三方面的第一队列状态查询电路中的CPU执行的装置,提供了根据本发明第三方面的第三队列状态查询电路中的CPU执行的装置,其中所述指示寄存器的比特具有不同的优先级;以及所述第一有效比特是所述指示寄存器的多个有效比特中的优先级高的比特。
根据本发明的第三方面的第一至第三队列状态查询电路中的CPU执行的装置,提供了根据本发明第三方面的第四队列状态查询电路中的CPU执行的装置,还包括:无效模块,用于将所述指示寄存器的第一有效比特置为无效。
根据本发明的第四方面,提供了根据本发明第四方面的第一队列状态查询电路中的CPU执行的方法,包括:S1,读取指示寄存器;S2,对于指示存储器的某一有效比特,确定该有效比特在指示寄存器的位置,该位置的选择使用Round-Robin轮询算法决定;S3,以S2得到的位置设置区段加载指令的区段字段,并执行区段加载指令,来将状态寄存器中与所述位置相对应的范围加载到目标寄存器;S4,使用Round-Robin轮询算法从目标寄存器中选择下一位置,访问下一位置的有效比特相对应的队列。
附图说明
当连同附图阅读时,通过参考后面对示出性的实施例的详细描述,将最佳地理解本发明以及优选的使用模式和其进一步的目的和优点,其中附图包括:
图1示出了现有技术中主机与设备间通过队列交换命令的示意图;
图2示出了根据现有技术的NVMe控制器的方框图;
图3示出了根据本发明实施例的带有队列状态查询装置的NVMe控制器的方框图;
图4示出了根据本发明实施例的状态寄存器与指示寄存器的组织;
图5示出了根据本发明实施例的NVMe控制器中的CPU查询队列状态的流程图;以及
图6示出了根据本发明依然又一实施例的带有队列状态查询装置的NVMe控制器的方框图。
具体实施方式
图3示出了根据本发明实施例的带有队列状态查询装置的NVMe控制器的方框图。在根据图3的实施例中,主机与设备根据NVMe协议而通过队列交换命令。在设备中包括NVMe控制器。设备作为举例可以是支持NVMe协议的固态硬盘。
图3的NVMe控制器包括存储器、处理器(CPU)、监控器、状态寄存器以及指示寄存器。指示寄存器耦合到CPU,并作为CPU可访问的通用寄存器之一。
在存储器中存储根据NVMe协议的队列指针。主机能够访问存储器中存储的队列指针。NVMe控制器的CPU能够访问存储器中存储的队列指针。监控器在监视到NVMe控制器的CPU更新存储器中的队首指针时,读取与该队首指针相对应的队尾指针,在队首指针与队尾指针不同时,设置状态寄存器中与该队尾指针所属的队列所对应的位;在队首指针与队尾指针相同时,清除状态寄存器中与该队尾指针所属的队列所对应的位。
监控器在发现NVMe控制器CPU更新了共享存储器中的队列指针后,监控器读取与NVMe控制器CPU更新的队列指针(队首指针)相对应的队尾指针,并确定队列是否有待处理的条目,进而更新状态寄存器。此时状态寄存器指示了队列的真实状态。继而NVMe控制器CPU可查询状态寄存器并对队列中的条目进行处理。
为获得队列的状态,CPU查询状态寄存器。在一个例子中,提供1024个队列用于在主机与设备之间交换NVMe命令。相应地,在状态寄存器中提供1024个比特用于存储每个队列的状态。在CPU的数据总线宽度为32比特时,轮询1024比特的状态寄存器需要32个指令周期。通过实施本发明,能够通过2个总线周期确定要处理的队列。
在根据本发明的实施例中,CPU通过执行指令访问指示寄存器,并在一个指令执行周期内获得指示寄存器的访问结果。CPU还可以通过执行指令访问状态寄存器。作为一个例子,通过执行区段加载指令,CPU获取状态寄存器中的指定区段的寄存器位的值。区段加载指令的形式可以为Load RD,reg_region,其中RD指示目的寄存器,可以是CPU的通用寄存器之一。而reg_region字段指示状态寄存器中的区段。在一个例子中,reg_region字段为5比特,从而可将状态寄存器划分为32个区段,并由reg_region字段指示32个状态寄存器的区段之一。依然作为举例,将1024比特的状态寄存器平均划分为32个区段,每个区段包含32个比特;reg_region字段为5比特,用于指示32个区段之一,而RD寄存器的宽度为32位,从而执行Load RD,reg_region而将状态寄存器中由reg_region字段所指示的一个区段的32比特加载到RD寄存器。并且CPU的数据总线是宽度是32位,从而在一个指令执行周期内,可完成区段加载指令的执行。
32比特的指示寄存器的每一比特,指示了状态寄存器的一个区段内是否存在被置为有效的寄存器比特。状态寄存器的一个区段内的任意比特被置位有效时,相应置位指示寄存器的对应比特。
为获得需要处理的队列,CPU首先访问指示寄存器。若指示寄存器中存在有效位时,意味着有队列需要处理。接下来,作为举例,将指示寄存器中有效比特之一的位置作为索引,来访问状态寄存器的区段之一。具体地,利用指示寄存器中有效比特之一的位置来设置区段加载指令的reg_region字段,并执行区段加载指令,将状态寄存器的指定区段的内容加载到区段加载指令所描述的目的寄存器,此时,目的寄存器的每个有效比特指示了有命令需要处理的队列。继而,依据指定区段的索引以及指定区段的内容,确定多个队列中有命令需要处理的队列。
图4示出了根据本发明实施例的状态寄存器与指示寄存器的组织。参看图4,状态寄存器有1024位,每一位用于指示1024个队列之一的状态。状态寄存器组织为32行与32列,在图4中行与列的交叉点代表状态寄存器的一位。图4中的每1行表示状态寄存器的1个区段。将1024位的状态寄存器划分为32个区段。状态寄存器可按照行访问,CPU可通过指定行号来访问对应行号的32个寄存器位。还提供32位的指示寄存器,如图4所示,指示寄存器的每个比特指示状态寄存器的对应的行中是否存在有效比特。
例如,若状态寄存器的行号为1的行的32个比特中,存在任意被置位的比特,则将指示寄存器的位置号为1的比特置为有效。而若状态寄存器的行号为2的行的32个比特中,不存在被置为有效的比特,则将指示寄存器的位置号为2的比特设置为无效。在依然另一个例子中,状态寄存器的行号为3的行的32个比特中,存在8个被置位的比特,则将指示寄存器的位置号为3的比特置为有效。
为获得队列的状态,CPU访问指示寄存器,指示寄存器的值为[x,1,0,1,xxx](x表示任意值),即位置号为1的比特为逻辑1,位置号为2的比特为逻辑0,而位置号为3的比特为逻辑1。由于位置号为1的比特为逻辑1,指示在状态寄存器的行号为1的区段中存在有效比特。CPU通过执行区段加载指令Load RD,reg_region访问状态寄存器的行号为1的行。其中,将reg_region字段设置为”1”来指示获取状态寄存器的行号为1的区段。通过执行区段加载指令Load RD,reg_region,将状态寄存器的行号为1的行加载到目的寄存器RD中。CPU再次依据寄存器RD中有效比特的位置(例如列号为1的比特有效),确定状态寄存器中第34个(32*1+1+1)(起始编号为1)比特有效,即1024个队列中的第34个(起始编号为1)队列中有命令需要处理。
若状态寄存器的行号为1的行中有多个比特被置位,表示有多个队列中有命令需要处理,CPU可依次处理每个待处理的队列,或依据优先级选择要处理的队列(例如,列号小的比特相对于列号大的比特对应更高的优先级)。
指示寄存器中可以有多个比特被置位,表示状态寄存器的多个区段中存在有效比特。CPU可轮询状态寄存器的每个区段,也可以依据优先级选择要处理的状态寄存器的区段。例如,状态寄存器的不同区段具有不同的优先级。
图5示出了根据本发明实施例的NVMe控制器中的CPU查询队列状态的流程图。CPU通过执行序列来实施如图5所示的处理流程。
参看图5,CPU读取指示寄存器(510)。参看图4,指示寄存器有32位,在一个指令执行周期内CPU获取到指示寄存器的值。CPU确定指示寄存器中是否存在有效比特以及有效比特在指示寄存器中的位置(520)。在图4的例子中,指示寄存器中位置号为1和3的比特有效。CPU确定指示寄存器中有效比特的位置为1和3。这意味着在状态寄存器的两个区段中存在有效比特。在一个例子中,CPU轮询处理状态寄存器的各个区段。在另一个例子中,状态寄存器的各个区段各自具有优先级。
作为举例,CPU决定处理位置号为1的区段。CPU将区段加载指令的reg_region字段设置为1,并执行区段加载指令(530),以获取状态寄存器的位置编号为1的区段的32个比特,并存储到目的(RD)寄存器(区段加载指令中的RD字段所指示的寄存器)。接下来,CPU确定目的(RD)寄存器中的有效比特,例如,位置号为1的比特有效。从而CPU可确定1024个队列中的位置号为33(32*1+1)的队列有命令需要处理。CPU访问位置号位33的队列(560)来处理该队列中的命令。进一步地,CPU处理完位置号33的队列后,还清除状态寄存器区段1中位置号为1的寄存器位。而指示寄存器的值则依据更新后的状态寄存器而被更新。
以此方式,CPU通过执行2条寄存器访问指令即可查询到有命令需要处理的队列的状态,加快了队列查询过程,降低了时间开销。
图6示出了根据本发明又一实施例的带有队列状态查询装置的NVMe控制器的方框图。图6的NVMe控制器包括存储器、处理器1(CPU1)、处理器2(CPU2)、监控器、状态寄存器。在存储器中存储根据NVMe协议的队列指针。主机能够访问存储器中存储的队列指针。NVMe控制器的CPU能够访问存储器中存储的队列指针。监控器在监视到NVMe控制器的CPU更新存储器中的队首指针时,读取与该队首指针相对应的队尾指针,在队首指针与队尾指针不同时,设置状态寄存器中与该队尾指针所属的队列所对应的位;在队首指针与队尾指针相同时,清除状态寄存器中与该队尾指针所属的队列所对应的位。处理器1(CPU1)包括指示寄存器1,CPU2包括指示寄存器2。指示寄存器1与状态寄存器相耦合,指示寄存器1的每个比特,指示状态寄存器中的一个区段中是否存在有效的比特。指示寄存器2与状态寄存器相耦合,指示寄存器2的每个比特,指示状态寄存器中的一个区段中是否存在有效的比特。
为获得队列的状态,CPU查询指示寄存器与状态寄存器。
在图6的实施例中,存储器中存储对应2048个队列的指针。状态寄存器包括2048个比特,并被分为64个区段。指示寄存器1指示区段0-31中是否存在有效的比特,而指示寄存器2指示区段32-63中是否存在有效的比特。
在图6的实施例中,CPU1访问指示寄存器1,继而从状态寄存器的区段0-31中获取队列状态指示。以及CPU2访问指示寄存器2,继而从状态寄存器区段32-63中获取队列状态指示。
在另一个例子中,状态寄存器包括1024个比例,而CPU1与CPU2共享同一个32位指示寄存器。CPU1与CPU2通过执行指令来区分各自处理的命令队列范围,例如,CPU1处理0-511号命令队列,而CPU2处理512-1023号命令队列。所属领域技术人员将意识到,CPU1与CPU2可通过多种方式协同处理1024个命令队列。以及在NVMe处理器中还可以提供更多数量的CPU。
所属领域技术人员将意识到,除应用于访问根据NVMe协议的命令队列的NVMe控制器,根据本发明的实施例还可应用于其他基于队列交换在发送方与接收方交换命令和/或数据的场合。
本发明实施例还提供一种包含程序代码的程序,当被载入CPU并在CPU中执行时,所述程序代码使所述CPU执行上面所述的方法。
本发明实施例还提供一种包括程序代码的程序,当被载入存储设备并在存储设备上执行时,所述程序使所述存储设备的处理器执行上面所述的方法之一。
应该理解,框图和流程图的每个框以及框图和流程图的框的组合可以分别由包括计算机程序指令的各种装置来实施。这些计算机程序指令可以加载到通用计算机、专用计算机或其他可编程数据控制设备上以产生机器,从而在计算机或其他可编程数据控制设备上执行的指令创建了用于实现一个或多个流程图框中指定的功能的装置。
这些计算机程序指令还可以存储在可以引导计算机或其他可编程数据控制设备的计算机可读存储器中从而以特定方式起作用,从而能够利用存储在计算机可读存储器中的指令来制造包括用于实现一个或多个流程图框中所指定功能的计算机可读指令的制品。计算机程序指令还可以加载到计算机或其他可编程数据控制设备上以使得在计算机或其他可编程数据控制设备上执行一系列的操作操作,从而产生计算机实现的过程,进而在计算机或其他可编程数据控制设备上执行的指令提供了用于实现一个或多个流程图框中所指定功能的操作。
因而,框图和流程图的框支持用于执行指定功能的装置的组合、用于执行指定功能的操作的组合和用于执行指定功能的程序指令装置的组合。还应该理解,框图和流程图的每个框以及框图和流程图的框的组合可以由执行指定功能或操作的、基于硬件的专用计算机系统实现,或由专用硬件和计算机指令的组合实现。
虽然当前发明参考的示例被描述,其只是为了解释的目的而不是对本发明的限制,对实施方式的改变,增加和/或删除可以被做出而不脱离本发明的范围。
这些实施方式所涉及的、从上面描述和相关联的附图中呈现的教导获益的领域中的技术人员将认识到这里记载的本发明的很多修改和其他实施方式。因此,应该理解,本发明不限于公开的具体实施方式,旨在将修改和其他实施方式包括在所附权利要求书的范围内。尽管在这里采用了特定的术语,但是仅在一般意义和描述意义上使用它们并且不是为了限制的目的而使用。