一种交互方法、NVMe设备、HOST及物理机系统与流程

文档序号:12176719阅读:594来源:国知局
一种交互方法、NVMe设备、HOST及物理机系统与流程

本发明涉及计算机技术领域,尤其涉及一种交互方法及、NVMe(Non Volatile Memory express,非易失存储快速通道)设备、HOST(主机)及物理机系统。



背景技术:

通常,运行在物理机CPU(Central Processing Unit,处理器)之上的软件可以分为系统软件和用户的业务软件。如图1所示,是现有的SDI(Service Driven lnfrastructure,业务驱动基础架构)架构,即将原来部署在处理器之上的系统软件卸载到独立的SDI卡上,CPU上仅运行用户的业务软件。这样,就将系统分为了HOST侧、NVMe设备侧两部分,二者之间通过PCIe(Peripheral Component Interconnect express,快速外部组件互联)总线进行通信。

SDI卡对CPU(HOST侧)呈现为NVMe设备,通过PCIe总线以及标准NVMe协议进行通信。NVMe设备(如:SDI卡)与HOST侧进行通信交互的过程中,HOST侧的CPU需要先后两次对NVMe设备的寄存器进行写操作(即进行门铃操作),改写NVMe设备的寄存器中某个字段,使得NVMe获知将与HOST进行交互,以保证交互正常进行。

通常,SDI卡是个插在服务器标准PCIe槽位上的独立硬件卡,卡上有承载系统软件和固件,这些软件和固件在使用过程中是需要进行升级。在一般情况下,软件及固件的升级都需要将SDI卡系统复位才能生效。SDI卡系统复位,对HOST侧而言等同于NVMe设备突然被拔掉。如果在HOST侧的CPU操作SDI卡的寄存器的时候,SDI卡系统复位,导致CPU的读/写请求得不到响应,CPU就会误认为设备异常,报出MCE(Machine Check Exception,机器校验错误)让整个系统挂死。



技术实现要素:

本发明实施例提供一种交互方法、NVMe设备、HOST及物理机系统,保证HOST侧与NVMe设备正常交互的前提下,能够有效避免由于SDI卡(NVMe设备)系统复位导致的系统挂死,实现NVMe设备的热插 拔。

本发明的实施例采用如下技术方案:

第一方面,公开了一种交互方法,包括:

主机HOST将任务指令写入所述HOST内存中的第一队列中,所述任务指令指示非易失存储快速通道NVMe设备将执行的操作;所述NVMe设备为与所述HOST通过快速外部组件互联PCIe总线进行交互的外围设备;

所述HOST将触发标识写入所述HOST内存中的第二队列;所述触发标识代表所述HOST已确认将与所述NVMe设备进行交互,所述交互为所述NVMe设备执行所述操作需要与所述HOST进行的交互;

所述HOST确认所述操作已完成,则将完成标识写入所述第一队列,所述完成标识代表所述HOST已确认所述交互已完成。

结合第一方面,在第一方面的第一种可能的实现方式中,所述HOST确认所述操作已完成包括:

所述HOST接收所述NVMe设备发送的预设中断,访问所述HOST内存中的第三队列,检测到操作完成标识,则确认所述操作已完成;

其中,所述预设中断用于指示所述HOST访问所述第三队列,所述操作完成标识指示所述操作已完成。

第二方面,公开了一种交互方法,包括:

非易失存储快速通道NVMe设备轮询第一队列;所述第一队列存储在主机HOST的内存中;

所述NVMe设备在所述第一队列中检测到触发标识,所述触发标识代表所述HOST已确认将与所述NVMe设备进行交互;所述交互为所述NVMe设备执行操作需要与所述HOST进行的交互;

所述NVMe设备获取任务指令;所述任务指令指示所述NVMe设备将执行的所述操作;

所述NVMe设备执行所述操作;

所述NVMe设备在所述第一队列中检测到完成标识;所述完成标识指示所述HOST已确认所述交互已完成,所述完成标识是所述HOST 确认所述操作完成之后写入所述第一队列的。

结合第二方面,在第二方面的第一种可能的实现方式中,所述NVMe设备获取任务指令包括:

所述NVMe设备访问所述HOST内存中的第二队列,在所述第二队列中获取所述任务指令。

结合第二方面或第二方面的第一种可能的实现方式,在第二方面的第二种可能的实现方式中,若所述操作为写数据,则所述NVMe设备执行所述操作具体包括:

所述NVMe设备在所述HOST的寄存器中获取待写数据,并将所述待写数据存储在所述NVMe设备的本地内存中;

所述NVMe设备将操作完成标识写入所述HOST内的第三队列;所述操作完成标识指示所述操作已完成;

所述NVMe设备向所述HOST发送第预设中断,指示所述HOST访问所述第三队列,确认所述操作已完成。

结合第二方面或第二方面的第一种可能的实现方式,在第二方面的第三种可能的实现方式中,若所述操作为读数据,则所述NVMe设备执行所述操作具体包括:

所述NVMe设备接收所述HOST的读数据请求,并将所述待读数据发送给所述HOST;

所述NVMe设备接收所述HOST发送的第一中断,将操作完成标识写入所述HOST内的第三队列;所述操作完成标识指示所述操作已完成,所述第一中断用于指示所述NVMe设备将所述操作完成标识写入所述HOST内存中的第三队列;

所述NVMe设备向所述HOST发送预设中断,指示所述HOST访问所述第三队列,确认所述操作已完成。

结合第二方面,在第二方面的第四种可能的实现方式中,所述NVMe设备轮询第一队列包括:

所述NVMe设备主动轮询所述第一队列;

或,所述NVMe设备接收所述HOST发送的指示信息后轮询所述 第一队列。

第三方面,公开了一种主机HOST,包括:

写入单元,用于将任务指令写入所述HOST内存中的第一队列中,所述任务指令指示非易失存储快速通道NVMe设备将执行的操作;所述NVMe设备为与所述HOST通过快速外部组件互联PCIe总线进行交互的外围设备;

所述写入单元还用于,将触发标识写入所述HOST内存中的第二队列;所述触发标识代表所述HOST已确认将与非易失存储快速通道NVMe设备进行交互,所述交互为所述NVMe设备执行所述操作需要与所述HOST进行的交互;

确认单元,用于确认所述操作已完成;

所述写入单元还用于,在所述确认单元确认所述操作已完成时,将完成标识写入所述第一队列,所述完成标识代表所述HOST已确认所述交互已完成。

结合第三方面,在第三方面的第一种可能的实现方式中,所述确认单元具体用于,

所述HOST接收所述NVMe设备发送的预设中断,访问所述HOST内存中的第三队列,检测到操作完成标识,则确认所述操作已完成;

其中,所述预设中断用于指示所述HOST访问所述第三队列,所述操作完成标识指示所述操作已完成。

第四方面,公开了一种非易失存储快速通道NVMe设备,包括:

检测单元,用于轮询第一队列;所述第一队列存储在主机HOST的内存中;

所述检测单元还用于,在所述第一队列中检测到触发标识,所述触发标识代表所述HOST已确认将与所述NVMe设备进行交互;所述交互为所述NVMe设备执行操作需要与所述HOST进行的交互;

获取单元,用于获取任务指令;所述任务指令指示所述HOST将执行的所述操作;

执行单元,用于执行所述操作;

所述检测单元还用于,在所述第一队列中检测到完成标识;所述完成标识指示所述HOST已确认与所述交互已完成,所述完成标识是所述HOST确认所述操作完成之后写入所述第一队列的。

结合第四方面,在第四方面的第一种可能的实现方式中,所述获取单元具体用于:访问所述HOST内存中的第二队列,在所述第二队列中获取所述任务指令。

结合第四方面或第四方面的第一种可能的实现方式,在第四方面的第二种可能的实现方式中,若操作为写数据,则所述执行单元具体用于:

在所述HOST的寄存器中获取待写数据,并将所述待写数据存储在所述NVMe设备的本地内存中;

将操作完成标识写入所述HOST内的第三队列;所述操作完成标识指示所述操作已完成;

向所述HOST发送第预设中断,指示所述HOST访问所述第三队列,确认所述操作已完成。

结合第四方面或第四方面的第一种可能的实现方式,在第四方面的第三种可能的实现方式中,若操作为读数据,则所述执行单元具体用于:

接收所述HOST的读数据请求,并将所述待读数据发送给所述HOST;

接收所述HOST发送的第一中断,将操作完成标识写入所述HOST内的第三队列;所述操作完成标识指示所述操作已完成,所述第一中断用于指示所述NVMe设备将所述操作完成标识写入所述HOST内存中的第三队列;

向所述HOST发送预设中断,指示所述HOST访问所述第三队列,确认所述操作已完成。

结合第四方面,在第四方面的第四种可能的实现方式中,所述检测单元具体用于,设备主动轮询所述第一队列;

或,接收所述HOST发送的指示信息后轮询所述第一队列。

第五方面,公开了一种物理机系统,包括主机HOST和非易失存储快速通道NVMe设备,

所述HOST将任务指令写入所述HOST内存中的第一队列中,所述任务指令指示非易失存储快速通道NVMe设备将执行的操作;所述NVMe设备为与所述HOST通过快速外部组件互联PCIe总线进行交互的外围设备;

所述HOST将触发标识写入所述HOST内存中的第二队列;所述触发标识代表所述HOST已确认将与所述NVMe设备进行交互,所述交互为所述NVMe设备执行所述操作需要与所述HOST进行的交互;

所述NVMe设备轮询所述第二队列;

所述NVMe设备在所述第二队列中检测到触发标识;

所述NVMe设备在所述第一队列中获取任务指令;

所述NVMe设备执行所述操作;

所述HOST获取所述操作完成标识,确认所述操作已完成,则将完成标识写入所述第二队列;所述操作完成标识指示所述操作已完成;所述完成标识代表所述HOST已确认所述交互已完成;

所述NVMe设备在所述第二队列中检测到完成标识。

本发明实施例提供的交互方法、NVMe设备、HOST及物理机系统,所述NVMe设备在主机HOST的内存中的第一队列中轮询到触发指令;所述触发指令指示所述HOST已确认将与所述NVMe设备进行交互。所述NVMe设备获取任务指令,执行所述任务指令指示的操作。NVMe设备在所述HOST的内存中的第一队列中检测到完成指令;所述完成指令指示所述HOST已确认与所述NVMe设备完成了交互。这样,在HOST与NVMe设备交互的过程中,避免HOST的CPU直接操作NVMe设备的寄存器,从而避免HOST的CPU对NVMe设备侧寄存器操作无响应导致系统挂死的情况出现。即使出现NVMe设备突然被拔掉也不会导致HOST的CPU操作寄存器无响应的情况,系统只会认为是一次读写超时,从而有效的避免NVMe设备复位引起的系统挂死,实现NVMe设备的热插拔。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为现有的SDI架构的示意图;

图2是本发明实施例1提供的交互方法的流程示意图;

图3是本发明实施例2提供的交互方法的流程示意图;

图4是本发明实施例3提供的交互方法的流程示意图;

图5是本发明实施例4提供的写数据的流程示意图;

图6是本发明实施例5提供的读数据的流程示意图;

图7是本发明实施例6提供的HOST的结构框图;

图8是本发明实施例7提供的NVMe设备的结构框图;

图9是本发明实施例8提供的HOST的结构框图;

图10是本发明实施例9提供的NVMe设备的结构框图;

图11是本发明实施例10提供的物理机系统的架构图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

所谓SDI架构,即将原来部署在处理器之上的系统软件卸载到独立的SDI卡上,CPU上仅运行用户的业务软件。这样,就将系统分为了两部分。如图1所示,A部分称为HOST(主机)侧、B部分称为NVMe设备侧。通常,需要将SDI卡系统复位才能使得卡上有承载系统软件和固件正常升级。在SDI卡做系统复位动作时,对CPU而言等同于NVMe设备突然被拔掉。

现有标准中,NVMe设备与HOST侧交互流程具体包括:

(1)CPU(HOST侧的CPU)写入命令到SQ(Submission Queue,提交队列),即将本次交互执行的命令写入SQ中;

(2)CPU写NVMe设备的Doorbell(门铃)寄存器,这是CPU对NVMe设备寄存器的直接操作,HOST侧告知NVMe设备将要进行二者间的交互;

(3)NVMe设备从SQ队列中读取在步骤(1)写入的命令;

(4)NVMe设备执行该命令;

(5)NVMe设备将完成数据写入CQ(Completion Queue,完成队列)指示已完成步骤(1)写入的命令,并释放SQ;

(6)NVMe Contreller发送MSI-X中断到CPU,指示CPU执行CQ;

(7)CPU接收到中断后执行CQ;

(8)CPU写NVMe设备的Doorbell寄存器,这是HOST对NVMe设备寄存器的直接操作。随后NVMe设备释放CQ队列。一次完整的NVMe协议交互完成。

上述流程中,第(2)个步骤和第(8)步是HOST对NVMe设备寄存器的直接操作,其余步骤都是HOST侧对本方内存的读写、设备侧的行为。在步骤(2)、(8)中,如果NVMe设备突然被拔出(如:SDI卡进行复位),这时HOST侧CPU发起的读/写请求得不到响应,HOST就会认为设备异常,报出MCE错误让整个系统挂死。

所谓热插拔(hot-plugging或Hot Swap),即带电插拔,就是用户在不关闭系统,不切断电源的情况下取出和更换损坏的硬盘、电源或板卡等部件,同时不影响系统的正常运行。本发明旨在提供一种NVMe设备的热插拔实现方法,使得在NVMe设备拔出(如:SDI卡做系统复位)时,不影响系统的正常运行。

另外,对本发明涉及的队列做以解释说明。队列是常用数据结构之一,是一种特殊的线性表,它只允许在表的前端(frent)进行删除操作,而在表的后端(rear)进行插入操作。其中,进行插入操作的端称为队尾,进行删除操作的端称为队头。

实施例1:

本发明实施例提供一种交互方法,如图2所示,所述方法包括以下步 骤:

101、HOST将任务指令写入所述HOST内存中的第一队列中,所述任务指令指示NVMe设备将执行的操作;所述NVMe设备为与所述HOST通过快速外部组件互联PCIe总线进行交互的外围设备。

其中,所述操作,可以是所述NVMe设备在所述HOST的内存中读取数据,或者,是所述NVMe设备接收HOST读数据的请求,将响应数据发送给HOST。队列是一种数据结构,用于存储数据。

102、所述HOST将触发标识写入所述HOST内存中的第二队列;所述触发标识代表所述HOST已确认将与所述NVMe设备进行交互,所述交互为所述NVMe设备执行所述操作需要与所述HOST进行的交互。

其中,所谓交互即参与活动的对象可以相互交流,双方面互动。在本发明实施例中特指:HOST指示NVMe设备要执行某操作时,在NVMe设备执行操作之前、完成操作之后,NVMe设备与HOST间要进行的交流,以确保NVMe设备与HOST知晓进行的每一步流程。示例的,当HOST指示NVMe设备写数据,还需要写入触发标识,使得NVMe设备检测到触发标识后知晓HOST已经确认所述NVMe设备将从HOST的内存中写数据。又如:当NVMe设备执行写数据操作时,不单单是在HOST的内存中获取数据,还需要在完成写数据后写操作完成标识到HOST的内存,使得HOST知晓NVMe设备已完成写数据。

另外,所述触发指令可以是所述第一队列中的一个地址位,用于指示所述HOST是否已确认将与所述NVMe设备进行交互。示例的,地址位为“0”代表所述HOST未确认将与所述NVMe设备进行交互,地址位为“1”代表所述HOST已确认将与所述NVMe设备进行交互。

103、所述HOST确认所述操作已完成,则将完成标识写入所述第一队列,所述完成标识代表所述HOST已确认所述交互已完成。

需要说明的是,与所述触发标识一样,所述完成标识也可以是所述第一队列中的一个地址位,用于指示所述HOST是否已确认所述交互已完成。

具体实现中,所述HOST确认所述操作已完成包括:

所述HOST接收所述NVMe设备发送的预设中断,访问所述HOST内存中的第三队列,检测到操作完成标识,则确认所述操作已完成;

其中,所述预设中断用于指示所述HOST访问所述第三队列,所述操作完成标识指示所述操作已完成。

需要说明的是,所述预设中断可以是MSI(Message Signaled Interrupt,消息信息中断)-X。另外,在本实施例中,所述第一队列可以是SQ(Submit Queue,提交队列),所述第二队列可以是DQ(Doorbell Queue,门铃队列),所述第三队列可以是CQ(Complete Queue,完成队列)。

在现有NVMe设备与HOST交互过程中,HOST对NVMe设备的Doorbell操作是由指HOST直接写NVMe设备的寄存器,修改某个字段以告知NVMe设备需要与HOST进行交互,在此过程中,如果NVMe设备系统复位,就会导致HOST的写请求得不到响应,系统报出MCE,进而系统被挂起。本发明中,将Doorbell操作修改为由NVMe设备驱动去HOST的寄存器内存轮循第一队列,以确定是否将与HOST进行交互。这样既保证了NVMe设备与HOST之间交互的正常进行,又避免了由于NVMe设备系统复位导致的系统挂死。

本发明实施例提供的交互方法,所述NVMe设备在主机HOST的内存中的第一队列中轮询到触发指令;所述触发指令指示所述HOST已确认将与所述NVMe设备进行交互。所述NVMe设备获取任务指令,执行所述任务指令指示的操作。NVMe设备在所述HOST的内存中的第一队列中检测到完成指令;所述完成指令指示所述HOST已确认与所述NVMe设备完成了交互。这样,在HOST与NVMe设备交互的过程中,避免HOST的CPU直接操作NVMe设备的寄存器,从而避免HOST的CPU对NVMe设备侧寄存器操作无响应导致系统挂死的情况出现。即使出现NVMe设备突然被拔掉也不会导致HOST的CPU操作寄存器无响应的情况,系统只会认为是一次读写超时,从而有效的避免NVMe设备复位引起的系统挂死,实现NVMe设备的热插拔。

实施例2:

本发明实施例提供一种交互方法,如图3所示,所述方法包括以下步骤:

201、NVMe设备轮询第一队列;所述第一队列存储在主机HOST的内存中。

所谓轮询,是指NVMe设备去监控或者不断的去读取HOST内存中的第一队列,直到读取到所述触发指令(如:特定地址位的数值有变化:变为“1”),则认为NVMe设备将与所述HOST进行交互。

202、所述NVMe设备在所述第一队列中检测到触发标识,所述触发标识代表所述HOST已确认将与所述NVMe设备进行交互;所述交互为所述NVMe设备执行操作需要与所述HOST进行的交互。

其中,所述触发指令可以是所述第一队列中的一个地址位,用于指示所述HOST是否已确认将与所述NVMe设备进行交互。示例的,地址位为“0”代表所述HOST未确认将与所述NVMe设备进行交互,地址位为“1”代表所述HOST已确认将与所述NVMe设备进行交互。

另外,所述操作,可以是所述NVMe设备在所述HOST的内存中读取数据,或者,是所述NVMe设备接收HOST读数据的请求,将响应数据发送给HOST。队列是一种数据结构,用于存储数据。

所谓交互,是指HOST指示NVMe设备要执行某操作时,在NVMe设备执行操作之前、完成操作之后,NVMe设备与HOST间要进行的交互,以确保NVMe设备与HOST知晓进行的某一步流程。如:HOST在步骤101中写入任务指令,将指示NVMe设备写数据,之后在写入触发标识,使得NVMe设备检测到触发标识后知晓HOST已经确认所述NVMe设备将从HOST的内存中写数据。

203、所述NVMe设备获取任务指令;所述任务指令指示所述NVMe设备将执行的所述操作。

具体地,所述NVMe设备访问所述HOST内存中的第二队列,在所述第二队列中获取所述任务指令。

204、所述NVMe设备执行所述操作。

具体可以是,所述NVMe设备在所述HOST的内存中读取数据,或者,是所述NVMe设备接收HOST读数据的请求,将响应数据发送给HOST。

205、所述NVMe设备在所述第一队列中检测到完成标识;所述完成标识指示所述HOST已确认所述交互已完成,所述完成标识是所述HOST确认所述操作完成之后写入所述第一队列的。

与所述触发标识一样,所述完成标识也可以是所述第一队列中的一个地址位,用于指示所述HOST是否已确认所述交互已完成。

在现有NVMe设备与HOST交互过程中,HOST对NVMe设备的Doorbell操作是由指HOST直接写NVMe设备的寄存器,修改某个字段以告知NVMe设备需要与HOST进行交互,在此过程中,如果NVMe设备系统复位,就会导致HOST的写请求得不到响应,系统报出MCE,进而系统被挂起。本发明中,将Doorbell操作修改为由NVMe设备驱动去HOST的寄存器内存轮循第一队列,以确定HOST是否已确认将进行交互。这样,HOST不用去对NVMe设备的寄存器进行写操作,就可以避免了由于NVMe设备突然拔出(即SDI卡系统复位)导致的系统挂死。另外,告知NVMe设备将与HOST进行交互,交互完成之前不能进行NVMe设备拔出(即SDI卡系统复位)。

所述NVMe设备执行所述操作,具体可以包括以下两种情况:

第一、若所述操作为写数据,则所述NVMe设备执行所述操作具体包括:

所述NVMe设备在所述HOST的寄存器中获取待写数据,并将所述待写数据存储在所述NVMe设备的本地内存中;所述NVMe设备将操作完成标识写入所述HOST内的第三队列;所述操作完成标识指示所述操作已完成;所述NVMe设备向所述HOST发送第预设中断,指示所述HOST访问所述第三队列,确认所述操作已完成。

具体地,(1)NVMe Controller从SQ中读取NVMe命令。

其中,所述NVMe Controller是NVMe设备侧的控制模块,所述SQ即所述第二队列,所述NVMe命令即所述任务指令。这里,所述NVMe命令指示的操作为将待写数据写入到所述NVMe设备。

(2)NVMe Controller操作NVMe设备侧的DMA()引擎在HOST的内存中获取数据。

(3)NVMe Controller封装所述待写数据后发送至NVMe设备侧的分布式存储软件。

其中,所述分布式存储软件是所述NVMe设备侧的用于存储数据的。所谓封装待写数据即将待写数据封装成分布式存储软件可以识别的格式。

(4)分布式存储软件向NVMe Controller返回Response。

实际上,就是分布式存储软件在存储完NVMe Controller发送的数据之后,向NVMe Controller返回一个信息,用于告知NVMe Controller本次交互要写入NVMe设备的待写数据已经传完。

(5)NVMe Controller将操作完成标识写入第三队列。

其中,所述第三队列可以是CQ,所述操作完成标识指示操作已完成(即已将待写数据写入NVMe设备)。

(6)NVMe Controller向HOST发送MSI-X,指示所述HOST访问所述第三队列,在第三队列中获取操作完成标识后确认所述操作已完成。

第二、若所述操作为读数据,则所述NVMe设备执行所述操作具体包括:所述NVMe设备接收所述HOST的读数据请求,并将所述待读数据发送给所述HOST;所述NVMe设备接收所述HOST发送的第一中断,将操作完成标识写入所述HOST内的第三队列;所述操作完成标识指示所述操作已完成,所述第一中断用于指示所述NVMe设备将所述操作完成标识写入所述HOST内存中的第三队列;所述NVMe设备向所述HOST发送预设中断,指示所述HOST访问所述第三队列,确认所述操作已完成。

其中,所述第一中断可以是DMA((Direct Memory Access,直接内存存取))中断。

具体地,(1)NVMe Controller从SQ队列中读取NVMe命令。

其中,所述NVMe Controller是NVMe设备侧的控制模块,所述SQ即所述第二队列,所述NVMe命令即所述任务指令。这里,所述NVMe命令指示的操作为所述NVMe设备从HOST侧的内存中读数据。

(2)NVMe Controller封装待读数据后发送至分布式存储软件。

所谓封装待读数据即将待读数据封装成分布式存储软件可以识别的格式。

(3)分布式存储软件返回Response。

在此Response用于告知NVMe Controller所述待读数据已完成接收。

(4)NVMe Controller设备侧的DMA引擎在分布式存储软件中读取待读数据,并将待读数据发送至HOST。

(5)HOST完成待读数据接收后向NVMe侧返回DMA中断。

其中,所述DMA中断用于告知NVMe Controlle已完成数据接收。

(6)NVMe Controller接收DMA中断后将操作完成标识写入第三队列。

其中,所述第三队列可以是CQ,所述操作完成标识指示操作已完成(即已将待写数据写入NVMe设备)。

(7)NVMe Controller向HOST发送MSI-X,指示所述HOST访问所述第三队列,在第三队列中获取操作完成标识后确认所述操作已完成。

这样,在HOST与NVMe设备交互的过程中,避免HOST的CPU直接操作NVMe设备的寄存器。将HOST对NVMe设备的两次直接寄存器操作变成NVMe设备侧主动去HOST的内存队列轮循,从而避免HOST的CPU对NVMe设备侧寄存器操作无响应导致系统挂死的情况出现。Doorbell操作由原来的HOST直接写NVMe设备寄存器修改为由NVMe设备驱动去轮循Doorbell队列(即本发明所述第一队列),HOST将所述触发指令、完成指令写入内存中的Doorbell队列,即认为是读写请求已经得到响应。这时候即使出现NVMe设备突然被拔掉也不会导致HOST的CPU操作寄存器无响应的情况,系统只会认为是一次读写超时,从而有效 的避免系统挂死的情况。这样,HOST不用去对NVMe设备的寄存器进行写操作,二者之间还可以进行正常交互,还可以避免了由于NVMe设备突然拔出导致的系统挂死。另外,告知NVMe设备与HOST之间的交互完成,可以进行NVMe设备拔出,从而实现NVMe设备的热插拔。

进一步地,在本发明的优选实施例中,所述NVMe设备获取完成指令之后,所述方法还包括:

所述NVMe设备释放所述第三队列。

在本发明的另一优选实施例中,所述NVMe设备在所述HOST的寄存器中轮询第一队列包括:

所述NVMe设备主动轮询所述第一队列;

或,所述NVMe设备接收所述HOST发送的指示信息后轮询所述第一队列。

另外,需要说明的是,本实施例所述的第一队列即实施例1所述的第二队列,可以是门铃队列DQ。本实施例所述的所述第二队列即实施例1所述的第一队列,可以是提交队列SQ。所述第三队列可以是完成队列CQ。

本发明实施例提供的交互方法,所述NVMe设备在主机HOST的内存中的第一队列中轮询到触发指令;所述触发指令指示所述HOST已确认将与所述NVMe设备进行交互。所述NVMe设备获取任务指令,执行所述任务指令指示的操作。NVMe设备在所述HOST的内存中的第一队列中检测到完成指令;所述完成指令指示所述HOST已确认与所述NVMe设备完成了交互。这样,在HOST与NVMe设备交互的过程中,避免HOST的CPU直接操作NVMe设备的寄存器,从而避免HOST的CPU对NVMe设备侧寄存器操作无响应导致系统挂死的情况出现。即使出现NVMe设备突然被拔掉也不会导致HOST的CPU操作寄存器无响应的情况,系统只会认为是一次读写超时,从而有效的避免NVMe设备复位引起的系统挂死,实现NVMe设备的热插拔。

实施例3:

本发明实施例提供一种交互方法,如图4所示,所述方法包括以下步骤:

301、HOST将任务指令写入所述HOST内存中的第一队列中。

其中,所述任务指令指示非易失存储快速通道NVMe设备将执行的操作;所述NVMe设备为与所述HOST通过快速外部组件互联PCIe总线进行交互的外围设备。

302、所述HOST将触发标识写入所述HOST内存中的第二队列。

所述触发标识代表所述HOST已确认将与所述NVMe设备进行交互,所述交互为所述NVMe设备执行所述操作需要与所述HOST进行的交互。

303、所述NVMe设备轮询所述第二队列。

304、所述NVMe设备在所述第二队列中检测到触发标识。

305、所述NVMe设备在所述第一队列中获取任务指令,执行任务指令指示的操作。

具体地,若所述操作为写数据,则所述NVMe设备执行所述操作具体包括:

所述NVMe设备在所述HOST的寄存器中获取待写数据,并将所述待写数据存储在所述NVMe设备的本地内存中;所述NVMe设备将操作完成标识写入所述HOST内的第三队列;所述操作完成标识指示所述操作已完成;所述NVMe设备向所述HOST发送第预设中断,指示所述HOST访问所述第三队列,确认所述操作已完成。

若所述操作为读数据,则所述NVMe设备执行所述操作具体包括:所述NVMe设备接收所述HOST的读数据请求,并将所述待读数据发送给所述HOST;所述NVMe设备接收所述HOST发送的第一中断,将操作完成标识写入所述HOST内的第三队列;所述操作完成标识指示所述操作已完成,所述第一中断用于指示所述NVMe设备将所述操作完成标识写入所述HOST内存中的第三队列。

其中,所述预设中断可以是MSI-X,所述第一中断可以是DMA中断。

306、所述HOST获取所述操作完成标识,确认所述操作已完成,则将完成标识写入所述第二队列。

所述操作完成标识指示所述操作已完成。所述完成标识代表所述HOST已确认所述交互已完成。

具体实现中,是所述HOST接收所述NVMe设备发送的预设中断,并访问所述第三队列,在所述第三队列中获取所述操作完成标识。

307、所述NVMe设备在所述第二队列中检测到完成标识。

与所述触发标识一样,所述完成标识也可以是所述第一队列中的一个地址位,用于指示所述HOST是否已确认所述交互已完成。

在现有NVMe设备与HOST交互过程中,HOST对NVMe设备的Doorbell操作是由指HOST直接写NVMe设备的寄存器,修改某个字段以告知NVMe设备需要与HOST进行交互,在此过程中,如果NVMe设备系统复位,就会导致HOST的写请求得不到响应,系统报出MCE,进而系统被挂起。本发明中,将Doorbell操作修改为由NVMe设备驱动去HOST的寄存器内存轮循第一队列,以确定HOST是否已确认将进行交互。这样,HOST不用去对NVMe设备的寄存器进行写操作,就可以避免了由于NVMe设备突然拔出(即SDI卡系统复位)导致的系统挂死。另外,告知NVMe设备将与HOST进行交互,交互完成之前不能进行NVMe设备拔出(即SDI卡系统复位)。

本发明实施例提供的交互方法,HOST将触发指令写入内存,所述NVMe设备在主机HOST的内存中的第一队列中轮询到触发指令;所述触发指令指示所述HOST已确认将与所述NVMe设备进行交互。所述NVMe设备获取任务指令,执行所述任务指令指示的操作。NVMe设备在所述HOST的内存中的第一队列中检测到完成指令;所述完成指令指示所述HOST已确认与所述NVMe设备完成了交互。这样,在HOST与NVMe设备交互的过程中,避免HOST的CPU直接操作NVMe设备的寄存器,从而避免HOST的CPU对NVMe设备侧寄存器操作无响应导致系统挂死的情况出现。即使出现NVMe设备突然被拔掉也不会导致HOST的CPU操作寄存器无响应的情况,系统只会认为是一次读写超时,从而有效的避免NVMe设备复位引起的系统挂死,实现NVMe设备的热插拔。

实施例4:

本发明实施例提供一种交互方法,主要用于NVMe设备与HOST交互,将数据写入NVMe设备。如图5所示,所述方法包括以下步骤:

401、HOST写入命令到SQ队列。

402、HOST将触发指令写入DQ(Doorbell Queue,门铃队列)。

403、NVMe Controller(控制器)从DQ中轮循到触发指令。

404、NVMe Controller在HOST的内存中获取SQ队列。

405、NVMe Controller在SQ队列中获取任务指令。

406、NVMe Controller操作NVMe设备侧的DMA引擎在HOST的内存中读取待写数据。

407、NVMe Controller封装待写数据后发送至分布式存储软件。

408、分布式存储软件向NVMe Controlle返回Response(响应)。

409、NVMe Controller将操作完成标识写入CQ队列并释放SQ队列。

410、NVMe Controller发送MSI-X中断到HOST。

411、HOST接收到中断后执行CQ队列。

即访问CQ队列,获取操作完成标识。

412、HOST将完成指令写入Doorbell队列。

413、NVMe Controller从Doorbell队列中轮询到完成指令,NVMe Controller释放CQ队列。

至此,依照NVMe协议,HOST与NVMe之间一次完整的写数据流程就完成了。

本发明实施例提供一种交互方法,所述NVMe设备写入数据时,避免HOST的CPU直接操作NVMe设备的寄存器,从而避免HOST的CPU对NVMe设备侧寄存器操作无响应导致系统挂死的情况出现。即使出现NVMe设备突然被拔掉也不会导致HOST的CPU操作寄存器无响应的情况,系统只会认为是一次读写超时,从而有效的避免NVMe设备复位引起 的系统挂死,实现NVMe设备的热插拔。

实施例5:

本发明实施例提供一种交互方法,主要用于NVMe设备与HOST交互,HOST在NVMe设备中读数据。如图6所示,所述方法包括以下步骤:

501、HOST写入命令到SQ队列。

502、HOST将触发指令写入Doorbell队列。

503、NVMe Controller从Doorbell队列中轮询到触发指令。

504、NVMe Controller在HOST的内存中获取SQ队列。

505、NVMe Controller从SQ队列中获取任务指令。

506、NVMe Controller封装待读数据后发送至分布式存储软件。

507、分布式存储软件返回Response。

508、NVMe Controller操作NVMe设备侧的DMA引擎在分布式存储软件中读取待读数据,并将待读数据发送至HOST。

509、HOST完成待读数据的接收后返回DMA中断。

510、NVMe Controller将操作完成标识写入CQ队列并释放SQ队列。

511、NVMe Controller发送MSI-X中断到HOST。

512、HOST接收到中断后执行CQ队列。

即访问CQ队列,获取操作完成标识。

513、HOST将完成指令写入Doorbell队列。

514、NVMe Controller从Doorbell队列中轮询到完成指令,NVMe Controller释放CQ队列。

至此,依照NVMe协议,HOST与NVMe之间一次完整的读数据流程就完成了。

本发明实施例提供一种交互方法,所述NVMe设备读数据时,避免 HOST的CPU直接操作NVMe设备的寄存器,从而避免HOST的CPU对NVMe设备侧寄存器操作无响应导致系统挂死的情况出现。即使出现NVMe设备突然被拔掉也不会导致HOST的CPU操作寄存器无响应的情况,系统只会认为是一次读写超时,从而有效的避免NVMe设备复位引起的系统挂死,实现NVMe设备的热插拔。

实施例6:

本发明实施例提供一种HOST,如图7所示,所述HOST包括:写入单元601、确认单元602。

写入单元601,用于将任务指令写入所述HOST内存中的第一队列中,所述任务指令指示NVMe设备将执行的操作;所述NVMe设备为与所述HOST通过快速外部组件互联PCIe总线进行交互的外围设备。

其中,所述操作,可以是所述NVMe设备在所述HOST的内存中读取数据,或者,是所述NVMe设备接收HOST读数据的请求,将响应数据发送给HOST。队列是一种数据结构,用于存储数据。

所述写入单元601还用于,将触发标识写入所述HOST内存中的第二队列;所述触发标识代表所述HOST已确认将与非易失存储快速通道NVMe设备进行交互,所述交互为所述NVMe设备执行所述操作需要与所述HOST进行的交互。

所谓交互,是指HOST指示NVMe设备要执行某操作时,在NVMe设备执行操作之前、完成操作之后,NVMe设备与HOST间要进行的交互,以确保NVMe设备与HOST知晓进行的某一步流程。如:HOST在步骤101中写入任务指令,将指示NVMe设备写数据,之后在写入触发标识,使得NVMe设备检测到触发标识后知晓HOST已经确认所述NVMe设备将从HOST的内存中写数据。

另外,所述触发指令可以是所述第一队列中的一个地址位,用于指示所述HOST是否已确认将与所述NVMe设备进行交互。示例的,地址位为“0”代表所述HOST未确认将与所述NVMe设备进行交互,地址位为“1”代表所述HOST已确认将与所述NVMe设备进行交互。

确认单元602,用于确认所述操作已完成。

所述写入单元601还用于,在所述确认单元确认所述操作已完成时,将完成标识写入所述第一队列,所述完成标识代表所述HOST已确认所述交互已完成。

需要说明的是,与所述触发标识一样,所述完成标识也可以是所述第一队列中的一个地址位,用于指示所述HOST是否已确认所述交互已完成。

所述确认单元602具体用于,所述HOST接收所述NVMe设备发送的预设中断,访问所述HOST内存中的第三队列,检测到操作完成标识,则确认所述操作已完成。

其中,所述预设中断用于指示所述HOST访问所述第三队列,所述操作完成标识指示所述操作已完成。

需要说明的是,所述预设中断可以是MSI(Message Signaled Interrupt,消息信息中断)-X。另外,在本实施例中,所述第一队列可以是SQ(Submit Queue,提交队列),所述第二队列可以是DQ(Doorbell Queue,门铃队列),所述第三队列可以是CQ(Complete Queue,完成队列)。

在现有NVMe设备与HOST交互过程中,HOST对NVMe设备的Doorbell操作是由指HOST直接写NVMe设备的寄存器,修改某个字段以告知NVMe设备需要与HOST进行交互,在此过程中,如果NVMe设备系统复位,就会导致HOST的写请求得不到响应,系统报出MCE,进而系统被挂起。本发明中,将Doorbell操作修改为由NVMe设备驱动去HOST的寄存器内存轮循第一队列,以确定是否将与HOST进行交互。这样既保证了NVMe设备与HOST之间交互的正常进行,又避免了由于NVMe设备系统复位导致的系统挂死。

本发明实施例提供的HOST,将触发指令写入内存,使得所述NVMe设备在主机HOST的内存中的第一队列中轮询到触发指令;所述触发指令指示所述HOST已确认将与所述NVMe设备进行交互。所述NVMe设备获取任务指令,执行所述任务指令指示的操作。NVMe设备在所述HOST的内存中的第一队列中检测到完成指令;所述完成 指令指示所述HOST已确认与所述NVMe设备完成了交互。这样,在HOST与NVMe设备交互的过程中,避免HOST的CPU直接操作NVMe设备的寄存器,从而避免HOST的CPU对NVMe设备侧寄存器操作无响应导致系统挂死的情况出现。即使出现NVMe设备突然被拔掉也不会导致HOST的CPU操作寄存器无响应的情况,系统只会认为是一次读写超时,从而有效的避免NVMe设备复位引起的系统挂死,实现NVMe设备的热插拔。

实施例7:

本发明实施例提供一种NVMe设备,如图8所示,所述HOST包括:检测单元701、获取单元702、执行单元703。

检测单元701,用于轮询第一队列;所述第一队列存储在主机HOST的内存中。

所谓轮询,是指NVMe设备去监控或者不断的去读取HOST内存中的第一队列,直到读取到所述触发指令(如:特定地址位的数值有变化:变为“1”),则认为NVMe设备将与所述HOST进行交互。

所述检测单元701还用于,在所述第一队列中检测到触发标识,所述触发标识代表所述HOST已确认将与所述NVMe设备进行交互;所述交互为所述NVMe设备执行操作需要与所述HOST进行的交互。

其中,所述触发指令可以是所述第一队列中的一个地址位,用于指示所述HOST是否已确认将与所述NVMe设备进行交互。示例的,地址位为“0”代表所述HOST未确认将与所述NVMe设备进行交互,地址位为“1”代表所述HOST已确认将与所述NVMe设备进行交互。

另外,所述操作,可以是所述NVMe设备在所述HOST的内存中读取数据,或者,是所述NVMe设备接收HOST读数据的请求,将响应数据发送给HOST。队列是一种数据结构,用于存储数据。

所谓交互,是指HOST指示NVMe设备要执行某操作时,在NVMe设备执行操作之前、完成操作之后,NVMe设备与HOST间要进行的交互,以确保NVMe设备与HOST知晓进行的某一步流程。如:HOST在步骤 101中写入任务指令,将指示NVMe设备写数据,之后在写入触发标识,使得NVMe设备检测到触发标识后知晓HOST已经确认所述NVMe设备将从HOST的内存中写数据。

获取单元702,用于获取任务指令;所述任务指令指示所述HOST将执行的所述操作。

执行单元703,用于执行所述操作。

所述检测单元701还用于,在所述第一队列中检测到完成标识;所述完成标识指示所述HOST已确认与所述交互已完成,所述完成标识是所述HOST确认所述操作完成之后写入所述第一队列的。

需要说明的是,与所述触发标识一样,所述完成标识也可以是所述第一队列中的一个地址位,用于指示所述HOST是否已确认所述交互已完成。

在现有NVMe设备与HOST交互过程中,HOST对NVMe设备的Doorbell操作是由指HOST直接写NVMe设备的寄存器,修改某个字段以告知NVMe设备需要与HOST进行交互,在此过程中,如果NVMe设备系统复位,就会导致HOST的写请求得不到响应,系统报出MCE,进而系统被挂起。本发明中,将Doorbell操作修改为由NVMe设备驱动去HOST的寄存器内存轮循第一队列,以确定HOST是否已确认将进行交互。这样,HOST不用去对NVMe设备的寄存器进行写操作,就可以避免了由于NVMe设备突然拔出(即SDI卡系统复位)导致的系统挂死。另外,告知NVMe设备将与HOST进行交互,交互完成之前不能进行NVMe设备拔出(即SDI卡系统复位)。

所述获取单元702具体用于:访问所述HOST内存中的第二队列,在所述第二队列中获取所述任务指令。

若操作为写数据,则所述执行单元703具体用于:

在所述HOST的寄存器中获取待写数据,并将所述待写数据存储在所述NVMe设备的本地内存中;

将操作完成标识写入所述HOST内的第三队列;所述操作完成标识指示所述操作已完成;

向所述HOST发送第预设中断,指示所述HOST访问所述第三队列,确认所述操作已完成。

示例的:(1)NVMe Controller从SQ中读取NVMe命令。

其中,所述NVMe Controller是NVMe设备侧的控制模块,所述SQ即所述第二队列,所述NVMe命令即所述任务指令。这里,所述NVMe命令指示的操作为将待写数据写入到所述NVMe设备。

(2)NVMe Controller操作NVMe设备侧的DMA()引擎在HOST的内存中获取数据。

(3)NVMe Controller封装所述待写数据后发送至NVMe设备侧的分布式存储软件。

其中,所述分布式存储软件是所述NVMe设备侧的用于存储数据的。所谓封装待写数据即将待写数据封装成分布式存储软件可以识别的格式。

(4)分布式存储软件向NVMe Controller返回Response。

实际上,就是分布式存储软件在存储完NVMe Controller发送的数据之后,向NVMe Controller返回一个信息,用于告知NVMe Controller本次交互要写入NVMe设备的待写数据已经传完。

(5)NVMe Controller将操作完成标识写入第三队列。

其中,所述第三队列可以是CQ,所述操作完成标识指示操作已完成(即已将待写数据写入NVMe设备)。

(6)NVMe Controller向HOST发送MSI-X,指示所述HOST访问所述第三队列,在第三队列中获取操作完成标识后确认所述操作已完成。

若操作为读数据,则所述执行单元703具体用于:

接收所述HOST的读数据请求,并将所述待读数据发送给所述HOST;

接收所述HOST发送的第一中断,将操作完成标识写入所述HOST内的第三队列;所述操作完成标识指示所述操作已完成,所述第一中断用于指示所述NVMe设备将所述操作完成标识写入所述HOST内存中 的第三队列;

向所述HOST发送预设中断,指示所述HOST访问所述第三队列,确认所述操作已完成。

示例的,(1)NVMe Controller从SQ队列中读取NVMe命令。

其中,所述NVMe Controller是NVMe设备侧的控制模块,所述SQ即所述第二队列,所述NVMe命令即所述任务指令。这里,所述NVMe命令指示的操作为所述NVMe设备从HOST侧的内存中读数据。

(2)NVMe Controller封装待读数据后发送至分布式存储软件。

所谓封装待读数据即将待读数据封装成分布式存储软件可以识别的格式。

(3)分布式存储软件返回Response。

在此Response用于告知NVMe Controller所述待读数据已完成接收。

(4)NVMe Controller设备侧的DMA引擎在分布式存储软件中读取待读数据,并将待读数据发送至HOST。

(5)HOST完成待读数据接收后向NVMe侧返回DMA中断。

其中,所述DMA中断用于告知NVMe Controlle已完成数据接收。

(6)NVMe Controller接收DMA中断后将操作完成标识写入第三队列。

其中,所述第三队列可以是CQ,所述操作完成标识指示操作已完成(即已将待写数据写入NVMe设备)。

(7)NVMe Controller向HOST发送MSI-X,指示所述HOST访问所述第三队列,在第三队列中获取操作完成标识后确认所述操作已完成。

所述检测单元701具体用于,设备主动轮询所述第一队列;

或,接收所述HOST发送的指示信息后轮询所述第一队列。

本发明实施例提供的NVMe设备,在主机HOST的内存中的第一队列中轮询到触发指令;所述触发指令指示所述HOST已确认将与所 述NVMe设备进行交互。所述NVMe设备获取任务指令,执行所述任务指令指示的操作。NVMe设备在所述HOST的内存中的第一队列中检测到完成指令;所述完成指令指示所述HOST已确认与所述NVMe设备完成了交互。这样,在HOST与NVMe设备交互的过程中,避免HOST的CPU直接操作NVMe设备的寄存器,从而避免HOST的CPU对NVMe设备侧寄存器操作无响应导致系统挂死的情况出现。即使出现NVMe设备突然被拔掉也不会导致HOST的CPU操作寄存器无响应的情况,系统只会认为是一次读写超时,从而有效的避免NVMe设备复位引起的系统挂死,实现NVMe设备的热插拔。

实施例8:

本发明实施例提供一种HOST,如图9所示,所述HOST包括:处理器801、系统总线802和存储器803。

其中,处理器801可以为中央处理器(英文:central processing unit,缩写:CPU)。

存储器803,用于存储程序代码,并将该程序代码传输给该处理器801,处理器801根据程序代码执行下述指令。存储器803可以包括易失性存储器(英文:volatile memory),例如随机存取存储器(英文:random-access memory,缩写:RAM);存储器803也可以包括非易失性存储器(英文:non-volatile memory),例如只读存储器(英文:read-only memory,缩写:ROM),快闪存储器(英文:flash memory),硬盘(英文:hard disk drive,缩写:HDD)或固态硬盘(英文:solid-state drive,缩写:SSD)。存储器803还可以包括上述种类的存储器的组合。处理器801、存储器803之间通过系统总线802连接并完成相互间的通信。

处理器801,用于将任务指令写入所述HOST内存中的第一队列中,所述任务指令指示NVMe设备将执行的操作;所述NVMe设备为与所述HOST通过快速外部组件互联PCIe总线进行交互的外围设备。

其中,所述操作,可以是所述NVMe设备在所述HOST的内存中读取数据,或者,是所述NVMe设备接收HOST读数据的请求,将响应数据发送给HOST。队列是一种数据结构,用于存储数据。

所述处理器801还用于,将触发标识写入所述HOST内存中的第二队列;所述触发标识代表所述HOST已确认将与非易失存储快速通道NVMe设备进行交互,所述交互为所述NVMe设备执行所述操作需要与所述HOST进行的交互。

其中,所谓交互,是指HOST指示NVMe设备要执行某操作时,在NVMe设备执行操作之前、完成操作之后,NVMe设备与HOST间要进行的交互,以确保NVMe设备与HOST知晓进行的某一步流程。如:HOST在步骤101中写入任务指令,将指示NVMe设备写数据,之后在写入触发标识,使得NVMe设备检测到触发标识后知晓HOST已经确认所述NVMe设备将从HOST的内存中写数据。

另外,所述触发指令可以是所述第一队列中的一个地址位,用于指示所述HOST是否已确认将与所述NVMe设备进行交互。示例的,地址位为“0”代表所述HOST未确认将与所述NVMe设备进行交互,地址位为“1”代表所述HOST已确认将与所述NVMe设备进行交互。

确认处理器801,用于确认所述操作已完成,确认所述操作已完成时,将完成标识写入所述第一队列,所述完成标识代表所述HOST已确认所述交互已完成。

需要说明的是,与所述触发标识一样,所述完成标识也可以是所述第一队列中的一个地址位,用于指示所述HOST是否已确认所述交互已完成。

所述处理器801具体用于,所述HOST接收所述NVMe设备发送的预设中断,访问所述HOST内存中的第三队列,检测到操作完成标识,则确认所述操作已完成。

其中,所述预设中断用于指示所述HOST访问所述第三队列,所述操作完成标识指示所述操作已完成。

本发明实施例提供的HOST,将触发指令写入内存,使得所述NVMe设备在主机HOST的内存中的第一队列中轮询到触发指令;所述触发指令指示所述HOST已确认将与所述NVMe设备进行交互。所述NVMe设备获取任务指令,执行所述任务指令指示的操作。NVMe 设备在所述HOST的内存中的第一队列中检测到完成指令;所述完成指令指示所述HOST已确认与所述NVMe设备完成了交互。这样,在HOST与NVMe设备交互的过程中,避免HOST的CPU直接操作NVMe设备的寄存器,从而避免HOST的CPU对NVMe设备侧寄存器操作无响应导致系统挂死的情况出现。即使出现NVMe设备突然被拔掉也不会导致HOST的CPU操作寄存器无响应的情况,系统只会认为是一次读写超时,从而有效的避免NVMe设备复位引起的系统挂死,实现NVMe设备的热插拔。

实施例9:

本发明实施例提供一种NVMe设备,如图10所示,所述HOST包括:处理器901、系统总线902和存储器903。

其中,处理器901可以为中央处理器(英文:central processing unit,缩写:CPU)。

存储器903,用于存储程序代码,并将该程序代码传输给该处理器901,处理器901根据程序代码执行下述指令。存储器903可以包括易失性存储器(英文:volatile memory),例如随机存取存储器(英文:random-access memory,缩写:RAM);存储器903也可以包括非易失性存储器(英文:non-volatile memory),例如只读存储器(英文:read-only memory,缩写:ROM),快闪存储器(英文:flash memory),硬盘(英文:hard disk drive,缩写:HDD)或固态硬盘(英文:solid-state drive,缩写:SSD)。存储器903还可以包括上述种类的存储器的组合。处理器901、存储器903之间通过系统总线902连接并完成相互间的通信。

处理器901,用于轮询第一队列;所述第一队列存储在主机HOST的内存中。在所述第一队列中检测到触发标识,所述触发标识代表所述HOST已确认将与所述NVMe设备进行交互;所述交互为所述NVMe设备执行操作需要与所述HOST进行的交互。

所谓轮询,是指NVMe设备去监控或者不断的去读取HOST内存中的第一队列,直到读取到所述触发指令(如:特定地址位的数值有变化:变为“1”),则认为NVMe设备将与所述HOST进行交互。

处理器901,用于获取任务指令;所述任务指令指示所述HOST将执行的所述操作。

其中,所述触发指令可以是所述第一队列中的一个地址位,用于指示所述HOST是否已确认将与所述NVMe设备进行交互。示例的,地址位为“0”代表所述HOST未确认将与所述NVMe设备进行交互,地址位为“1”代表所述HOST已确认将与所述NVMe设备进行交互。

另外,所述操作,可以是所述NVMe设备在所述HOST的内存中读取数据,或者,是所述NVMe设备接收HOST读数据的请求,将响应数据发送给HOST。队列是一种数据结构,用于存储数据。

所谓交互,是指HOST指示NVMe设备要执行某操作时,在NVMe设备执行操作之前、完成操作之后,NVMe设备与HOST间要进行的交互,以确保NVMe设备与HOST知晓进行的某一步流程。如:HOST在步骤101中写入任务指令,将指示NVMe设备写数据,之后在写入触发标识,使得NVMe设备检测到触发标识后知晓HOST已经确认所述NVMe设备将从HOST的内存中写数据。

处理器901还用于,执行所述操作。

所述处理器901还用于,在所述第一队列中检测到完成标识;所述完成标识指示所述HOST已确认与所述交互已完成,所述完成标识是所述HOST确认所述操作完成之后写入所述第一队列的。与所述触发标识一样,所述完成标识也可以是所述第一队列中的一个地址位,用于指示所述HOST是否已确认所述交互已完成。

所述处理器901具体用于:访问所述HOST内存中的第二队列,在所述第二队列中获取所述任务指令。

若操作为写数据,则所述处理器901具体用于:

在所述HOST的寄存器中获取待写数据,并将所述待写数据存储在所述NVMe设备的本地内存中;

将操作完成标识写入所述HOST内的第三队列;所述操作完成标识指示所述操作已完成;

向所述HOST发送第预设中断,指示所述HOST访问所述第三队 列,确认所述操作已完成。

示例的,1)NVMe Controller从SQ中读取NVMe命令。

其中,所述NVMe Controller是NVMe设备侧的控制模块,所述SQ即所述第二队列,所述NVMe命令即所述任务指令。这里,所述NVMe命令指示的操作为将待写数据写入到所述NVMe设备。

(2)NVMe Controller操作NVMe设备侧的DMA()引擎在HOST的内存中获取数据。

(3)NVMe Controller封装所述待写数据后发送至NVMe设备侧的分布式存储软件。

其中,所述分布式存储软件是所述NVMe设备侧的用于存储数据的。所谓封装待写数据即将待写数据封装成分布式存储软件可以识别的格式。

(4)分布式存储软件向NVMe Controller返回Response。

实际上,就是分布式存储软件在存储完NVMe Controller发送的数据之后,向NVMe Controller返回一个信息,用于告知NVMe Controller本次交互要写入NVMe设备的待写数据已经传完。

(5)NVMe Controller将操作完成标识写入第三队列。

其中,所述第三队列可以是CQ,所述操作完成标识指示操作已完成(即已将待写数据写入NVMe设备)。

(6)NVMe Controller向HOST发送MSI-X,指示所述HOST访问所述第三队列,在第三队列中获取操作完成标识后确认所述操作已完成。

若操作为读数据,则所述处理器901具体用于:

接收所述HOST的读数据请求,并将所述待读数据发送给所述HOST;

接收所述HOST发送的第一中断,将操作完成标识写入所述HOST内的第三队列;所述操作完成标识指示所述操作已完成,所述第一中断用于指示所述NVMe设备将所述操作完成标识写入所述HOST内存中的第三队列;

向所述HOST发送预设中断,指示所述HOST访问所述第三队列,确认所述操作已完成。

示例的:(1)NVMe Controller从SQ队列中读取NVMe命令。

其中,所述NVMe Controller是NVMe设备侧的控制模块,所述SQ即所述第二队列,所述NVMe命令即所述任务指令。这里,所述NVMe命令指示的操作为所述NVMe设备从HOST侧的内存中读数据。

(2)NVMe Controller封装待读数据后发送至分布式存储软件。

所谓封装待读数据即将待读数据封装成分布式存储软件可以识别的格式。

(3)分布式存储软件返回Response。

在此Response用于告知NVMe Controller所述待读数据已完成接收。

(4)NVMe Controller设备侧的DMA引擎在分布式存储软件中读取待读数据,并将待读数据发送至HOST。

(5)HOST完成待读数据接收后向NVMe侧返回DMA中断。

其中,所述DMA中断用于告知NVMe Controlle已完成数据接收。

(6)NVMe Controller接收DMA中断后将操作完成标识写入第三队列。

其中,所述第三队列可以是CQ,所述操作完成标识指示操作已完成(即已将待写数据写入NVMe设备)。

(7)NVMe Controller向HOST发送MSI-X,指示所述HOST访问所述第三队列,在第三队列中获取操作完成标识后确认所述操作已完成。

这样,在HOST与NVMe设备交互的过程中,避免HOST的CPU直接操作NVMe设备的寄存器。将HOST对NVMe设备的两次直接寄存器操作变成NVMe设备侧主动去HOST的内存队列轮循,从而避免HOST的CPU对NVMe设备侧寄存器操作无响应导致系统挂死的情况出现。Doorbell操作由原来的HOST直接写NVMe设备寄存器修改为由NVMe 设备驱动去轮循Doorbell队列(即本发明所述第一队列),HOST将所述触发指令、完成指令写入内存中的Doorbell队列,即认为是读写请求已经得到响应。这时候即使出现NVMe设备突然被拔掉也不会导致HOST的CPU操作寄存器无响应的情况,系统只会认为是一次读写超时,从而有效的避免系统挂死的情况。这样,HOST不用去对NVMe设备的寄存器进行写操作,二者之间还可以进行正常交互,还可以避免了由于NVMe设备突然拔出导致的系统挂死。另外,告知NVMe设备与HOST之间的交互完成,可以进行NVMe设备拔出,从而实现NVMe设备的热插拔。

所述处理器901具体用于,设备主动轮询所述第一队列;

或,接收所述HOST发送的指示信息后轮询所述第一队列。

本发明实施例提供的NVMe设备,在主机HOST的内存中的第一队列中轮询到触发指令;所述触发指令指示所述HOST已确认将与所述NVMe设备进行交互。所述NVMe设备获取任务指令,执行所述任务指令指示的操作。NVMe设备在所述HOST的内存中的第一队列中检测到完成指令;所述完成指令指示所述HOST已确认与所述NVMe设备完成了交互。这样,在HOST与NVMe设备交互的过程中,避免HOST的CPU直接操作NVMe设备的寄存器,从而避免HOST的CPU对NVMe设备侧寄存器操作无响应导致系统挂死的情况出现。即使出现NVMe设备突然被拔掉也不会导致HOST的CPU操作寄存器无响应的情况,系统只会认为是一次读写超时,从而有效的避免NVMe设备复位引起的系统挂死,实现NVMe设备的热插拔。

实施例10:

本发明实施例提供一种物理机系统,如图11所示,所述物理机系统包括包括HOST和NVMe设备。

具体地,所述HOST和NVMe设备间的交互包括:

所述HOST将任务指令写入所述HOST内存中的第一队列中,所述任务指令指示非易失存储快速通道NVMe设备将执行的操作。所述NVMe设备为与所述HOST通过快速外部组件互联PCIe总线进行交互的外围设备。

所述HOST将触发标识写入所述HOST内存中的第二队列;所述触发标识代表所述HOST已确认将与所述NVMe设备进行交互,所述交互为所述NVMe设备执行所述操作需要与所述HOST进行的交互。

所述NVMe设备轮询所述第二队列。

所述NVMe设备在所述第二队列中检测到触发标识。

所述NVMe设备在所述第一队列中获取任务指令;行所述操作。

所述HOST获取所述操作完成标识,确认所述操作已完成,则将完成标识写入所述第二队列;所述操作完成标识指示所述操作已完成;所述完成标识代表所述HOST已确认所述交互已完成;

所述NVMe设备在所述第二队列中检测到完成标识。

需要说明的是,所述任务指令指示的操作具体可以是所述NVMe设备在所述HOST的内存中读取数据,或者,是所述NVMe设备接收HOST读数据的请求,将响应数据发送给HOST。

若所述操作为写数据,则所述NVMe设备执行所述操作具体包括:

所述NVMe设备在所述HOST的寄存器中获取待写数据,并将所述待写数据存储在所述NVMe设备的本地内存中;所述NVMe设备将操作完成标识写入所述HOST内的第三队列;所述操作完成标识指示所述操作已完成;所述NVMe设备向所述HOST发送第预设中断,指示所述HOST访问所述第三队列,确认所述操作已完成。

若所述操作为读数据,则所述NVMe设备执行所述操作具体包括:所述NVMe设备接收所述HOST的读数据请求,并将所述待读数据发送给所述HOST;所述NVMe设备接收所述HOST发送的第一中断,将操作完成标识写入所述HOST内的第三队列;所述操作完成标识指示所述操作已完成,所述第一中断用于指示所述NVMe设备将所述操作完成标识写入所述HOST内存中的第三队列;所述NVMe设备向所述HOST发送预设中断,指示所述HOST访问所述第三队列,确认所述操作已完成。

这样,HOST接收所述预设中断后就会访问第三队列,获取其中的操作完成标识,进而将完成标识写入所述第二队列。

本实施例所述的第一队列,可以是提交队列SQ,本实施例所述的第 二队列,可以是门铃队列DQ。所述第三队列可以是完成队列CQ。所述预设中断可以是MSI-X。

本发明实施例提供的物理机系统,NVMe设备在主机HOST的内存中的第一队列中轮询到触发指令;所述触发指令指示所述HOST已确认将与所述NVMe设备进行交互。所述NVMe设备获取任务指令,执行所述任务指令指示的操作。NVMe设备在所述HOST的内存中的第一队列中检测到完成指令;所述完成指令指示所述HOST已确认与所述NVMe设备完成了交互。这样,在HOST与NVMe设备交互的过程中,避免HOST的CPU直接操作NVMe设备的寄存器,从而避免HOST的CPU对NVMe设备侧寄存器操作无响应导致系统挂死的情况出现。即使出现NVMe设备突然被拔掉也不会导致HOST的CPU操作寄存器无响应的情况,系统只会认为是一次读写超时,从而有效的避免NVMe设备复位引起的系统挂死,实现NVMe设备的热插拔。

通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。上述描述的装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是一个物理单元或多个物理单元,即可以位于一个地方,或者也可以分布到多个不同地方。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方 案的全部或部分可以以软件产品的形式体现出来,该软件产品存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1