本發(fā)明涉及計算機(jī)技術(shù)領(lǐng)域,尤其涉及一種交互方法及、NVMe(Non Volatile Memory express,非易失存儲快速通道)設(shè)備、HOST(主機(jī))及物理機(jī)系統(tǒng)。
背景技術(shù):
通常,運(yùn)行在物理機(jī)CPU(Central Processing Unit,處理器)之上的軟件可以分為系統(tǒng)軟件和用戶的業(yè)務(wù)軟件。如圖1所示,是現(xiàn)有的SDI(Service Driven lnfrastructure,業(yè)務(wù)驅(qū)動基礎(chǔ)架構(gòu))架構(gòu),即將原來部署在處理器之上的系統(tǒng)軟件卸載到獨(dú)立的SDI卡上,CPU上僅運(yùn)行用戶的業(yè)務(wù)軟件。這樣,就將系統(tǒng)分為了HOST側(cè)、NVMe設(shè)備側(cè)兩部分,二者之間通過PCIe(Peripheral Component Interconnect express,快速外部組件互聯(lián))總線進(jìn)行通信。
SDI卡對CPU(HOST側(cè))呈現(xiàn)為NVMe設(shè)備,通過PCIe總線以及標(biāo)準(zhǔn)NVMe協(xié)議進(jìn)行通信。NVMe設(shè)備(如:SDI卡)與HOST側(cè)進(jìn)行通信交互的過程中,HOST側(cè)的CPU需要先后兩次對NVMe設(shè)備的寄存器進(jìn)行寫操作(即進(jìn)行門鈴操作),改寫NVMe設(shè)備的寄存器中某個字段,使得NVMe獲知將與HOST進(jìn)行交互,以保證交互正常進(jìn)行。
通常,SDI卡是個插在服務(wù)器標(biāo)準(zhǔn)PCIe槽位上的獨(dú)立硬件卡,卡上有承載系統(tǒng)軟件和固件,這些軟件和固件在使用過程中是需要進(jìn)行升級。在一般情況下,軟件及固件的升級都需要將SDI卡系統(tǒng)復(fù)位才能生效。SDI卡系統(tǒng)復(fù)位,對HOST側(cè)而言等同于NVMe設(shè)備突然被拔掉。如果在HOST側(cè)的CPU操作SDI卡的寄存器的時候,SDI卡系統(tǒng)復(fù)位,導(dǎo)致CPU的讀/寫請求得不到響應(yīng),CPU就會誤認(rèn)為設(shè)備異常,報出MCE(Machine Check Exception,機(jī)器校驗(yàn)錯誤)讓整個系統(tǒng)掛死。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供一種交互方法、NVMe設(shè)備、HOST及物理機(jī)系統(tǒng),保證HOST側(cè)與NVMe設(shè)備正常交互的前提下,能夠有效避免由于SDI卡(NVMe設(shè)備)系統(tǒng)復(fù)位導(dǎo)致的系統(tǒng)掛死,實(shí)現(xiàn)NVMe設(shè)備的熱插 拔。
本發(fā)明的實(shí)施例采用如下技術(shù)方案:
第一方面,公開了一種交互方法,包括:
主機(jī)HOST將任務(wù)指令寫入所述HOST內(nèi)存中的第一隊列中,所述任務(wù)指令指示非易失存儲快速通道NVMe設(shè)備將執(zhí)行的操作;所述NVMe設(shè)備為與所述HOST通過快速外部組件互聯(lián)PCIe總線進(jìn)行交互的外圍設(shè)備;
所述HOST將觸發(fā)標(biāo)識寫入所述HOST內(nèi)存中的第二隊列;所述觸發(fā)標(biāo)識代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互,所述交互為所述NVMe設(shè)備執(zhí)行所述操作需要與所述HOST進(jìn)行的交互;
所述HOST確認(rèn)所述操作已完成,則將完成標(biāo)識寫入所述第一隊列,所述完成標(biāo)識代表所述HOST已確認(rèn)所述交互已完成。
結(jié)合第一方面,在第一方面的第一種可能的實(shí)現(xiàn)方式中,所述HOST確認(rèn)所述操作已完成包括:
所述HOST接收所述NVMe設(shè)備發(fā)送的預(yù)設(shè)中斷,訪問所述HOST內(nèi)存中的第三隊列,檢測到操作完成標(biāo)識,則確認(rèn)所述操作已完成;
其中,所述預(yù)設(shè)中斷用于指示所述HOST訪問所述第三隊列,所述操作完成標(biāo)識指示所述操作已完成。
第二方面,公開了一種交互方法,包括:
非易失存儲快速通道NVMe設(shè)備輪詢第一隊列;所述第一隊列存儲在主機(jī)HOST的內(nèi)存中;
所述NVMe設(shè)備在所述第一隊列中檢測到觸發(fā)標(biāo)識,所述觸發(fā)標(biāo)識代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互;所述交互為所述NVMe設(shè)備執(zhí)行操作需要與所述HOST進(jìn)行的交互;
所述NVMe設(shè)備獲取任務(wù)指令;所述任務(wù)指令指示所述NVMe設(shè)備將執(zhí)行的所述操作;
所述NVMe設(shè)備執(zhí)行所述操作;
所述NVMe設(shè)備在所述第一隊列中檢測到完成標(biāo)識;所述完成標(biāo)識指示所述HOST已確認(rèn)所述交互已完成,所述完成標(biāo)識是所述HOST 確認(rèn)所述操作完成之后寫入所述第一隊列的。
結(jié)合第二方面,在第二方面的第一種可能的實(shí)現(xiàn)方式中,所述NVMe設(shè)備獲取任務(wù)指令包括:
所述NVMe設(shè)備訪問所述HOST內(nèi)存中的第二隊列,在所述第二隊列中獲取所述任務(wù)指令。
結(jié)合第二方面或第二方面的第一種可能的實(shí)現(xiàn)方式,在第二方面的第二種可能的實(shí)現(xiàn)方式中,若所述操作為寫數(shù)據(jù),則所述NVMe設(shè)備執(zhí)行所述操作具體包括:
所述NVMe設(shè)備在所述HOST的寄存器中獲取待寫數(shù)據(jù),并將所述待寫數(shù)據(jù)存儲在所述NVMe設(shè)備的本地內(nèi)存中;
所述NVMe設(shè)備將操作完成標(biāo)識寫入所述HOST內(nèi)的第三隊列;所述操作完成標(biāo)識指示所述操作已完成;
所述NVMe設(shè)備向所述HOST發(fā)送第預(yù)設(shè)中斷,指示所述HOST訪問所述第三隊列,確認(rèn)所述操作已完成。
結(jié)合第二方面或第二方面的第一種可能的實(shí)現(xiàn)方式,在第二方面的第三種可能的實(shí)現(xiàn)方式中,若所述操作為讀數(shù)據(jù),則所述NVMe設(shè)備執(zhí)行所述操作具體包括:
所述NVMe設(shè)備接收所述HOST的讀數(shù)據(jù)請求,并將所述待讀數(shù)據(jù)發(fā)送給所述HOST;
所述NVMe設(shè)備接收所述HOST發(fā)送的第一中斷,將操作完成標(biāo)識寫入所述HOST內(nèi)的第三隊列;所述操作完成標(biāo)識指示所述操作已完成,所述第一中斷用于指示所述NVMe設(shè)備將所述操作完成標(biāo)識寫入所述HOST內(nèi)存中的第三隊列;
所述NVMe設(shè)備向所述HOST發(fā)送預(yù)設(shè)中斷,指示所述HOST訪問所述第三隊列,確認(rèn)所述操作已完成。
結(jié)合第二方面,在第二方面的第四種可能的實(shí)現(xiàn)方式中,所述NVMe設(shè)備輪詢第一隊列包括:
所述NVMe設(shè)備主動輪詢所述第一隊列;
或,所述NVMe設(shè)備接收所述HOST發(fā)送的指示信息后輪詢所述 第一隊列。
第三方面,公開了一種主機(jī)HOST,包括:
寫入單元,用于將任務(wù)指令寫入所述HOST內(nèi)存中的第一隊列中,所述任務(wù)指令指示非易失存儲快速通道NVMe設(shè)備將執(zhí)行的操作;所述NVMe設(shè)備為與所述HOST通過快速外部組件互聯(lián)PCIe總線進(jìn)行交互的外圍設(shè)備;
所述寫入單元還用于,將觸發(fā)標(biāo)識寫入所述HOST內(nèi)存中的第二隊列;所述觸發(fā)標(biāo)識代表所述HOST已確認(rèn)將與非易失存儲快速通道NVMe設(shè)備進(jìn)行交互,所述交互為所述NVMe設(shè)備執(zhí)行所述操作需要與所述HOST進(jìn)行的交互;
確認(rèn)單元,用于確認(rèn)所述操作已完成;
所述寫入單元還用于,在所述確認(rèn)單元確認(rèn)所述操作已完成時,將完成標(biāo)識寫入所述第一隊列,所述完成標(biāo)識代表所述HOST已確認(rèn)所述交互已完成。
結(jié)合第三方面,在第三方面的第一種可能的實(shí)現(xiàn)方式中,所述確認(rèn)單元具體用于,
所述HOST接收所述NVMe設(shè)備發(fā)送的預(yù)設(shè)中斷,訪問所述HOST內(nèi)存中的第三隊列,檢測到操作完成標(biāo)識,則確認(rèn)所述操作已完成;
其中,所述預(yù)設(shè)中斷用于指示所述HOST訪問所述第三隊列,所述操作完成標(biāo)識指示所述操作已完成。
第四方面,公開了一種非易失存儲快速通道NVMe設(shè)備,包括:
檢測單元,用于輪詢第一隊列;所述第一隊列存儲在主機(jī)HOST的內(nèi)存中;
所述檢測單元還用于,在所述第一隊列中檢測到觸發(fā)標(biāo)識,所述觸發(fā)標(biāo)識代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互;所述交互為所述NVMe設(shè)備執(zhí)行操作需要與所述HOST進(jìn)行的交互;
獲取單元,用于獲取任務(wù)指令;所述任務(wù)指令指示所述HOST將執(zhí)行的所述操作;
執(zhí)行單元,用于執(zhí)行所述操作;
所述檢測單元還用于,在所述第一隊列中檢測到完成標(biāo)識;所述完成標(biāo)識指示所述HOST已確認(rèn)與所述交互已完成,所述完成標(biāo)識是所述HOST確認(rèn)所述操作完成之后寫入所述第一隊列的。
結(jié)合第四方面,在第四方面的第一種可能的實(shí)現(xiàn)方式中,所述獲取單元具體用于:訪問所述HOST內(nèi)存中的第二隊列,在所述第二隊列中獲取所述任務(wù)指令。
結(jié)合第四方面或第四方面的第一種可能的實(shí)現(xiàn)方式,在第四方面的第二種可能的實(shí)現(xiàn)方式中,若操作為寫數(shù)據(jù),則所述執(zhí)行單元具體用于:
在所述HOST的寄存器中獲取待寫數(shù)據(jù),并將所述待寫數(shù)據(jù)存儲在所述NVMe設(shè)備的本地內(nèi)存中;
將操作完成標(biāo)識寫入所述HOST內(nèi)的第三隊列;所述操作完成標(biāo)識指示所述操作已完成;
向所述HOST發(fā)送第預(yù)設(shè)中斷,指示所述HOST訪問所述第三隊列,確認(rèn)所述操作已完成。
結(jié)合第四方面或第四方面的第一種可能的實(shí)現(xiàn)方式,在第四方面的第三種可能的實(shí)現(xiàn)方式中,若操作為讀數(shù)據(jù),則所述執(zhí)行單元具體用于:
接收所述HOST的讀數(shù)據(jù)請求,并將所述待讀數(shù)據(jù)發(fā)送給所述HOST;
接收所述HOST發(fā)送的第一中斷,將操作完成標(biāo)識寫入所述HOST內(nèi)的第三隊列;所述操作完成標(biāo)識指示所述操作已完成,所述第一中斷用于指示所述NVMe設(shè)備將所述操作完成標(biāo)識寫入所述HOST內(nèi)存中的第三隊列;
向所述HOST發(fā)送預(yù)設(shè)中斷,指示所述HOST訪問所述第三隊列,確認(rèn)所述操作已完成。
結(jié)合第四方面,在第四方面的第四種可能的實(shí)現(xiàn)方式中,所述檢測單元具體用于,設(shè)備主動輪詢所述第一隊列;
或,接收所述HOST發(fā)送的指示信息后輪詢所述第一隊列。
第五方面,公開了一種物理機(jī)系統(tǒng),包括主機(jī)HOST和非易失存儲快速通道NVMe設(shè)備,
所述HOST將任務(wù)指令寫入所述HOST內(nèi)存中的第一隊列中,所述任務(wù)指令指示非易失存儲快速通道NVMe設(shè)備將執(zhí)行的操作;所述NVMe設(shè)備為與所述HOST通過快速外部組件互聯(lián)PCIe總線進(jìn)行交互的外圍設(shè)備;
所述HOST將觸發(fā)標(biāo)識寫入所述HOST內(nèi)存中的第二隊列;所述觸發(fā)標(biāo)識代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互,所述交互為所述NVMe設(shè)備執(zhí)行所述操作需要與所述HOST進(jìn)行的交互;
所述NVMe設(shè)備輪詢所述第二隊列;
所述NVMe設(shè)備在所述第二隊列中檢測到觸發(fā)標(biāo)識;
所述NVMe設(shè)備在所述第一隊列中獲取任務(wù)指令;
所述NVMe設(shè)備執(zhí)行所述操作;
所述HOST獲取所述操作完成標(biāo)識,確認(rèn)所述操作已完成,則將完成標(biāo)識寫入所述第二隊列;所述操作完成標(biāo)識指示所述操作已完成;所述完成標(biāo)識代表所述HOST已確認(rèn)所述交互已完成;
所述NVMe設(shè)備在所述第二隊列中檢測到完成標(biāo)識。
本發(fā)明實(shí)施例提供的交互方法、NVMe設(shè)備、HOST及物理機(jī)系統(tǒng),所述NVMe設(shè)備在主機(jī)HOST的內(nèi)存中的第一隊列中輪詢到觸發(fā)指令;所述觸發(fā)指令指示所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。所述NVMe設(shè)備獲取任務(wù)指令,執(zhí)行所述任務(wù)指令指示的操作。NVMe設(shè)備在所述HOST的內(nèi)存中的第一隊列中檢測到完成指令;所述完成指令指示所述HOST已確認(rèn)與所述NVMe設(shè)備完成了交互。這樣,在HOST與NVMe設(shè)備交互的過程中,避免HOST的CPU直接操作NVMe設(shè)備的寄存器,從而避免HOST的CPU對NVMe設(shè)備側(cè)寄存器操作無響應(yīng)導(dǎo)致系統(tǒng)掛死的情況出現(xiàn)。即使出現(xiàn)NVMe設(shè)備突然被拔掉也不會導(dǎo)致HOST的CPU操作寄存器無響應(yīng)的情況,系統(tǒng)只會認(rèn)為是一次讀寫超時,從而有效的避免NVMe設(shè)備復(fù)位引起的系統(tǒng)掛死,實(shí)現(xiàn)NVMe設(shè)備的熱插拔。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為現(xiàn)有的SDI架構(gòu)的示意圖;
圖2是本發(fā)明實(shí)施例1提供的交互方法的流程示意圖;
圖3是本發(fā)明實(shí)施例2提供的交互方法的流程示意圖;
圖4是本發(fā)明實(shí)施例3提供的交互方法的流程示意圖;
圖5是本發(fā)明實(shí)施例4提供的寫數(shù)據(jù)的流程示意圖;
圖6是本發(fā)明實(shí)施例5提供的讀數(shù)據(jù)的流程示意圖;
圖7是本發(fā)明實(shí)施例6提供的HOST的結(jié)構(gòu)框圖;
圖8是本發(fā)明實(shí)施例7提供的NVMe設(shè)備的結(jié)構(gòu)框圖;
圖9是本發(fā)明實(shí)施例8提供的HOST的結(jié)構(gòu)框圖;
圖10是本發(fā)明實(shí)施例9提供的NVMe設(shè)備的結(jié)構(gòu)框圖;
圖11是本發(fā)明實(shí)施例10提供的物理機(jī)系統(tǒng)的架構(gòu)圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
所謂SDI架構(gòu),即將原來部署在處理器之上的系統(tǒng)軟件卸載到獨(dú)立的SDI卡上,CPU上僅運(yùn)行用戶的業(yè)務(wù)軟件。這樣,就將系統(tǒng)分為了兩部分。如圖1所示,A部分稱為HOST(主機(jī))側(cè)、B部分稱為NVMe設(shè)備側(cè)。通常,需要將SDI卡系統(tǒng)復(fù)位才能使得卡上有承載系統(tǒng)軟件和固件正常升級。在SDI卡做系統(tǒng)復(fù)位動作時,對CPU而言等同于NVMe設(shè)備突然被拔掉。
現(xiàn)有標(biāo)準(zhǔn)中,NVMe設(shè)備與HOST側(cè)交互流程具體包括:
(1)CPU(HOST側(cè)的CPU)寫入命令到SQ(Submission Queue,提交隊列),即將本次交互執(zhí)行的命令寫入SQ中;
(2)CPU寫NVMe設(shè)備的Doorbell(門鈴)寄存器,這是CPU對NVMe設(shè)備寄存器的直接操作,HOST側(cè)告知NVMe設(shè)備將要進(jìn)行二者間的交互;
(3)NVMe設(shè)備從SQ隊列中讀取在步驟(1)寫入的命令;
(4)NVMe設(shè)備執(zhí)行該命令;
(5)NVMe設(shè)備將完成數(shù)據(jù)寫入CQ(Completion Queue,完成隊列)指示已完成步驟(1)寫入的命令,并釋放SQ;
(6)NVMe Contreller發(fā)送MSI-X中斷到CPU,指示CPU執(zhí)行CQ;
(7)CPU接收到中斷后執(zhí)行CQ;
(8)CPU寫NVMe設(shè)備的Doorbell寄存器,這是HOST對NVMe設(shè)備寄存器的直接操作。隨后NVMe設(shè)備釋放CQ隊列。一次完整的NVMe協(xié)議交互完成。
上述流程中,第(2)個步驟和第(8)步是HOST對NVMe設(shè)備寄存器的直接操作,其余步驟都是HOST側(cè)對本方內(nèi)存的讀寫、設(shè)備側(cè)的行為。在步驟(2)、(8)中,如果NVMe設(shè)備突然被拔出(如:SDI卡進(jìn)行復(fù)位),這時HOST側(cè)CPU發(fā)起的讀/寫請求得不到響應(yīng),HOST就會認(rèn)為設(shè)備異常,報出MCE錯誤讓整個系統(tǒng)掛死。
所謂熱插拔(hot-plugging或Hot Swap),即帶電插拔,就是用戶在不關(guān)閉系統(tǒng),不切斷電源的情況下取出和更換損壞的硬盤、電源或板卡等部件,同時不影響系統(tǒng)的正常運(yùn)行。本發(fā)明旨在提供一種NVMe設(shè)備的熱插拔實(shí)現(xiàn)方法,使得在NVMe設(shè)備拔出(如:SDI卡做系統(tǒng)復(fù)位)時,不影響系統(tǒng)的正常運(yùn)行。
另外,對本發(fā)明涉及的隊列做以解釋說明。隊列是常用數(shù)據(jù)結(jié)構(gòu)之一,是一種特殊的線性表,它只允許在表的前端(frent)進(jìn)行刪除操作,而在表的后端(rear)進(jìn)行插入操作。其中,進(jìn)行插入操作的端稱為隊尾,進(jìn)行刪除操作的端稱為隊頭。
實(shí)施例1:
本發(fā)明實(shí)施例提供一種交互方法,如圖2所示,所述方法包括以下步 驟:
101、HOST將任務(wù)指令寫入所述HOST內(nèi)存中的第一隊列中,所述任務(wù)指令指示NVMe設(shè)備將執(zhí)行的操作;所述NVMe設(shè)備為與所述HOST通過快速外部組件互聯(lián)PCIe總線進(jìn)行交互的外圍設(shè)備。
其中,所述操作,可以是所述NVMe設(shè)備在所述HOST的內(nèi)存中讀取數(shù)據(jù),或者,是所述NVMe設(shè)備接收HOST讀數(shù)據(jù)的請求,將響應(yīng)數(shù)據(jù)發(fā)送給HOST。隊列是一種數(shù)據(jù)結(jié)構(gòu),用于存儲數(shù)據(jù)。
102、所述HOST將觸發(fā)標(biāo)識寫入所述HOST內(nèi)存中的第二隊列;所述觸發(fā)標(biāo)識代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互,所述交互為所述NVMe設(shè)備執(zhí)行所述操作需要與所述HOST進(jìn)行的交互。
其中,所謂交互即參與活動的對象可以相互交流,雙方面互動。在本發(fā)明實(shí)施例中特指:HOST指示NVMe設(shè)備要執(zhí)行某操作時,在NVMe設(shè)備執(zhí)行操作之前、完成操作之后,NVMe設(shè)備與HOST間要進(jìn)行的交流,以確保NVMe設(shè)備與HOST知曉進(jìn)行的每一步流程。示例的,當(dāng)HOST指示NVMe設(shè)備寫數(shù)據(jù),還需要寫入觸發(fā)標(biāo)識,使得NVMe設(shè)備檢測到觸發(fā)標(biāo)識后知曉HOST已經(jīng)確認(rèn)所述NVMe設(shè)備將從HOST的內(nèi)存中寫數(shù)據(jù)。又如:當(dāng)NVMe設(shè)備執(zhí)行寫數(shù)據(jù)操作時,不單單是在HOST的內(nèi)存中獲取數(shù)據(jù),還需要在完成寫數(shù)據(jù)后寫操作完成標(biāo)識到HOST的內(nèi)存,使得HOST知曉NVMe設(shè)備已完成寫數(shù)據(jù)。
另外,所述觸發(fā)指令可以是所述第一隊列中的一個地址位,用于指示所述HOST是否已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。示例的,地址位為“0”代表所述HOST未確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互,地址位為“1”代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。
103、所述HOST確認(rèn)所述操作已完成,則將完成標(biāo)識寫入所述第一隊列,所述完成標(biāo)識代表所述HOST已確認(rèn)所述交互已完成。
需要說明的是,與所述觸發(fā)標(biāo)識一樣,所述完成標(biāo)識也可以是所述第一隊列中的一個地址位,用于指示所述HOST是否已確認(rèn)所述交互已完成。
具體實(shí)現(xiàn)中,所述HOST確認(rèn)所述操作已完成包括:
所述HOST接收所述NVMe設(shè)備發(fā)送的預(yù)設(shè)中斷,訪問所述HOST內(nèi)存中的第三隊列,檢測到操作完成標(biāo)識,則確認(rèn)所述操作已完成;
其中,所述預(yù)設(shè)中斷用于指示所述HOST訪問所述第三隊列,所述操作完成標(biāo)識指示所述操作已完成。
需要說明的是,所述預(yù)設(shè)中斷可以是MSI(Message Signaled Interrupt,消息信息中斷)-X。另外,在本實(shí)施例中,所述第一隊列可以是SQ(Submit Queue,提交隊列),所述第二隊列可以是DQ(Doorbell Queue,門鈴隊列),所述第三隊列可以是CQ(Complete Queue,完成隊列)。
在現(xiàn)有NVMe設(shè)備與HOST交互過程中,HOST對NVMe設(shè)備的Doorbell操作是由指HOST直接寫NVMe設(shè)備的寄存器,修改某個字段以告知NVMe設(shè)備需要與HOST進(jìn)行交互,在此過程中,如果NVMe設(shè)備系統(tǒng)復(fù)位,就會導(dǎo)致HOST的寫請求得不到響應(yīng),系統(tǒng)報出MCE,進(jìn)而系統(tǒng)被掛起。本發(fā)明中,將Doorbell操作修改為由NVMe設(shè)備驅(qū)動去HOST的寄存器內(nèi)存輪循第一隊列,以確定是否將與HOST進(jìn)行交互。這樣既保證了NVMe設(shè)備與HOST之間交互的正常進(jìn)行,又避免了由于NVMe設(shè)備系統(tǒng)復(fù)位導(dǎo)致的系統(tǒng)掛死。
本發(fā)明實(shí)施例提供的交互方法,所述NVMe設(shè)備在主機(jī)HOST的內(nèi)存中的第一隊列中輪詢到觸發(fā)指令;所述觸發(fā)指令指示所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。所述NVMe設(shè)備獲取任務(wù)指令,執(zhí)行所述任務(wù)指令指示的操作。NVMe設(shè)備在所述HOST的內(nèi)存中的第一隊列中檢測到完成指令;所述完成指令指示所述HOST已確認(rèn)與所述NVMe設(shè)備完成了交互。這樣,在HOST與NVMe設(shè)備交互的過程中,避免HOST的CPU直接操作NVMe設(shè)備的寄存器,從而避免HOST的CPU對NVMe設(shè)備側(cè)寄存器操作無響應(yīng)導(dǎo)致系統(tǒng)掛死的情況出現(xiàn)。即使出現(xiàn)NVMe設(shè)備突然被拔掉也不會導(dǎo)致HOST的CPU操作寄存器無響應(yīng)的情況,系統(tǒng)只會認(rèn)為是一次讀寫超時,從而有效的避免NVMe設(shè)備復(fù)位引起的系統(tǒng)掛死,實(shí)現(xiàn)NVMe設(shè)備的熱插拔。
實(shí)施例2:
本發(fā)明實(shí)施例提供一種交互方法,如圖3所示,所述方法包括以下步驟:
201、NVMe設(shè)備輪詢第一隊列;所述第一隊列存儲在主機(jī)HOST的內(nèi)存中。
所謂輪詢,是指NVMe設(shè)備去監(jiān)控或者不斷的去讀取HOST內(nèi)存中的第一隊列,直到讀取到所述觸發(fā)指令(如:特定地址位的數(shù)值有變化:變?yōu)椤?”),則認(rèn)為NVMe設(shè)備將與所述HOST進(jìn)行交互。
202、所述NVMe設(shè)備在所述第一隊列中檢測到觸發(fā)標(biāo)識,所述觸發(fā)標(biāo)識代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互;所述交互為所述NVMe設(shè)備執(zhí)行操作需要與所述HOST進(jìn)行的交互。
其中,所述觸發(fā)指令可以是所述第一隊列中的一個地址位,用于指示所述HOST是否已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。示例的,地址位為“0”代表所述HOST未確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互,地址位為“1”代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。
另外,所述操作,可以是所述NVMe設(shè)備在所述HOST的內(nèi)存中讀取數(shù)據(jù),或者,是所述NVMe設(shè)備接收HOST讀數(shù)據(jù)的請求,將響應(yīng)數(shù)據(jù)發(fā)送給HOST。隊列是一種數(shù)據(jù)結(jié)構(gòu),用于存儲數(shù)據(jù)。
所謂交互,是指HOST指示NVMe設(shè)備要執(zhí)行某操作時,在NVMe設(shè)備執(zhí)行操作之前、完成操作之后,NVMe設(shè)備與HOST間要進(jìn)行的交互,以確保NVMe設(shè)備與HOST知曉進(jìn)行的某一步流程。如:HOST在步驟101中寫入任務(wù)指令,將指示NVMe設(shè)備寫數(shù)據(jù),之后在寫入觸發(fā)標(biāo)識,使得NVMe設(shè)備檢測到觸發(fā)標(biāo)識后知曉HOST已經(jīng)確認(rèn)所述NVMe設(shè)備將從HOST的內(nèi)存中寫數(shù)據(jù)。
203、所述NVMe設(shè)備獲取任務(wù)指令;所述任務(wù)指令指示所述NVMe設(shè)備將執(zhí)行的所述操作。
具體地,所述NVMe設(shè)備訪問所述HOST內(nèi)存中的第二隊列,在所述第二隊列中獲取所述任務(wù)指令。
204、所述NVMe設(shè)備執(zhí)行所述操作。
具體可以是,所述NVMe設(shè)備在所述HOST的內(nèi)存中讀取數(shù)據(jù),或者,是所述NVMe設(shè)備接收HOST讀數(shù)據(jù)的請求,將響應(yīng)數(shù)據(jù)發(fā)送給HOST。
205、所述NVMe設(shè)備在所述第一隊列中檢測到完成標(biāo)識;所述完成標(biāo)識指示所述HOST已確認(rèn)所述交互已完成,所述完成標(biāo)識是所述HOST確認(rèn)所述操作完成之后寫入所述第一隊列的。
與所述觸發(fā)標(biāo)識一樣,所述完成標(biāo)識也可以是所述第一隊列中的一個地址位,用于指示所述HOST是否已確認(rèn)所述交互已完成。
在現(xiàn)有NVMe設(shè)備與HOST交互過程中,HOST對NVMe設(shè)備的Doorbell操作是由指HOST直接寫NVMe設(shè)備的寄存器,修改某個字段以告知NVMe設(shè)備需要與HOST進(jìn)行交互,在此過程中,如果NVMe設(shè)備系統(tǒng)復(fù)位,就會導(dǎo)致HOST的寫請求得不到響應(yīng),系統(tǒng)報出MCE,進(jìn)而系統(tǒng)被掛起。本發(fā)明中,將Doorbell操作修改為由NVMe設(shè)備驅(qū)動去HOST的寄存器內(nèi)存輪循第一隊列,以確定HOST是否已確認(rèn)將進(jìn)行交互。這樣,HOST不用去對NVMe設(shè)備的寄存器進(jìn)行寫操作,就可以避免了由于NVMe設(shè)備突然拔出(即SDI卡系統(tǒng)復(fù)位)導(dǎo)致的系統(tǒng)掛死。另外,告知NVMe設(shè)備將與HOST進(jìn)行交互,交互完成之前不能進(jìn)行NVMe設(shè)備拔出(即SDI卡系統(tǒng)復(fù)位)。
所述NVMe設(shè)備執(zhí)行所述操作,具體可以包括以下兩種情況:
第一、若所述操作為寫數(shù)據(jù),則所述NVMe設(shè)備執(zhí)行所述操作具體包括:
所述NVMe設(shè)備在所述HOST的寄存器中獲取待寫數(shù)據(jù),并將所述待寫數(shù)據(jù)存儲在所述NVMe設(shè)備的本地內(nèi)存中;所述NVMe設(shè)備將操作完成標(biāo)識寫入所述HOST內(nèi)的第三隊列;所述操作完成標(biāo)識指示所述操作已完成;所述NVMe設(shè)備向所述HOST發(fā)送第預(yù)設(shè)中斷,指示所述HOST訪問所述第三隊列,確認(rèn)所述操作已完成。
具體地,(1)NVMe Controller從SQ中讀取NVMe命令。
其中,所述NVMe Controller是NVMe設(shè)備側(cè)的控制模塊,所述SQ即所述第二隊列,所述NVMe命令即所述任務(wù)指令。這里,所述NVMe命令指示的操作為將待寫數(shù)據(jù)寫入到所述NVMe設(shè)備。
(2)NVMe Controller操作NVMe設(shè)備側(cè)的DMA()引擎在HOST的內(nèi)存中獲取數(shù)據(jù)。
(3)NVMe Controller封裝所述待寫數(shù)據(jù)后發(fā)送至NVMe設(shè)備側(cè)的分布式存儲軟件。
其中,所述分布式存儲軟件是所述NVMe設(shè)備側(cè)的用于存儲數(shù)據(jù)的。所謂封裝待寫數(shù)據(jù)即將待寫數(shù)據(jù)封裝成分布式存儲軟件可以識別的格式。
(4)分布式存儲軟件向NVMe Controller返回Response。
實(shí)際上,就是分布式存儲軟件在存儲完NVMe Controller發(fā)送的數(shù)據(jù)之后,向NVMe Controller返回一個信息,用于告知NVMe Controller本次交互要寫入NVMe設(shè)備的待寫數(shù)據(jù)已經(jīng)傳完。
(5)NVMe Controller將操作完成標(biāo)識寫入第三隊列。
其中,所述第三隊列可以是CQ,所述操作完成標(biāo)識指示操作已完成(即已將待寫數(shù)據(jù)寫入NVMe設(shè)備)。
(6)NVMe Controller向HOST發(fā)送MSI-X,指示所述HOST訪問所述第三隊列,在第三隊列中獲取操作完成標(biāo)識后確認(rèn)所述操作已完成。
第二、若所述操作為讀數(shù)據(jù),則所述NVMe設(shè)備執(zhí)行所述操作具體包括:所述NVMe設(shè)備接收所述HOST的讀數(shù)據(jù)請求,并將所述待讀數(shù)據(jù)發(fā)送給所述HOST;所述NVMe設(shè)備接收所述HOST發(fā)送的第一中斷,將操作完成標(biāo)識寫入所述HOST內(nèi)的第三隊列;所述操作完成標(biāo)識指示所述操作已完成,所述第一中斷用于指示所述NVMe設(shè)備將所述操作完成標(biāo)識寫入所述HOST內(nèi)存中的第三隊列;所述NVMe設(shè)備向所述HOST發(fā)送預(yù)設(shè)中斷,指示所述HOST訪問所述第三隊列,確認(rèn)所述操作已完成。
其中,所述第一中斷可以是DMA((Direct Memory Access,直接內(nèi)存存取))中斷。
具體地,(1)NVMe Controller從SQ隊列中讀取NVMe命令。
其中,所述NVMe Controller是NVMe設(shè)備側(cè)的控制模塊,所述SQ即所述第二隊列,所述NVMe命令即所述任務(wù)指令。這里,所述NVMe命令指示的操作為所述NVMe設(shè)備從HOST側(cè)的內(nèi)存中讀數(shù)據(jù)。
(2)NVMe Controller封裝待讀數(shù)據(jù)后發(fā)送至分布式存儲軟件。
所謂封裝待讀數(shù)據(jù)即將待讀數(shù)據(jù)封裝成分布式存儲軟件可以識別的格式。
(3)分布式存儲軟件返回Response。
在此Response用于告知NVMe Controller所述待讀數(shù)據(jù)已完成接收。
(4)NVMe Controller設(shè)備側(cè)的DMA引擎在分布式存儲軟件中讀取待讀數(shù)據(jù),并將待讀數(shù)據(jù)發(fā)送至HOST。
(5)HOST完成待讀數(shù)據(jù)接收后向NVMe側(cè)返回DMA中斷。
其中,所述DMA中斷用于告知NVMe Controlle已完成數(shù)據(jù)接收。
(6)NVMe Controller接收DMA中斷后將操作完成標(biāo)識寫入第三隊列。
其中,所述第三隊列可以是CQ,所述操作完成標(biāo)識指示操作已完成(即已將待寫數(shù)據(jù)寫入NVMe設(shè)備)。
(7)NVMe Controller向HOST發(fā)送MSI-X,指示所述HOST訪問所述第三隊列,在第三隊列中獲取操作完成標(biāo)識后確認(rèn)所述操作已完成。
這樣,在HOST與NVMe設(shè)備交互的過程中,避免HOST的CPU直接操作NVMe設(shè)備的寄存器。將HOST對NVMe設(shè)備的兩次直接寄存器操作變成NVMe設(shè)備側(cè)主動去HOST的內(nèi)存隊列輪循,從而避免HOST的CPU對NVMe設(shè)備側(cè)寄存器操作無響應(yīng)導(dǎo)致系統(tǒng)掛死的情況出現(xiàn)。Doorbell操作由原來的HOST直接寫NVMe設(shè)備寄存器修改為由NVMe設(shè)備驅(qū)動去輪循Doorbell隊列(即本發(fā)明所述第一隊列),HOST將所述觸發(fā)指令、完成指令寫入內(nèi)存中的Doorbell隊列,即認(rèn)為是讀寫請求已經(jīng)得到響應(yīng)。這時候即使出現(xiàn)NVMe設(shè)備突然被拔掉也不會導(dǎo)致HOST的CPU操作寄存器無響應(yīng)的情況,系統(tǒng)只會認(rèn)為是一次讀寫超時,從而有效 的避免系統(tǒng)掛死的情況。這樣,HOST不用去對NVMe設(shè)備的寄存器進(jìn)行寫操作,二者之間還可以進(jìn)行正常交互,還可以避免了由于NVMe設(shè)備突然拔出導(dǎo)致的系統(tǒng)掛死。另外,告知NVMe設(shè)備與HOST之間的交互完成,可以進(jìn)行NVMe設(shè)備拔出,從而實(shí)現(xiàn)NVMe設(shè)備的熱插拔。
進(jìn)一步地,在本發(fā)明的優(yōu)選實(shí)施例中,所述NVMe設(shè)備獲取完成指令之后,所述方法還包括:
所述NVMe設(shè)備釋放所述第三隊列。
在本發(fā)明的另一優(yōu)選實(shí)施例中,所述NVMe設(shè)備在所述HOST的寄存器中輪詢第一隊列包括:
所述NVMe設(shè)備主動輪詢所述第一隊列;
或,所述NVMe設(shè)備接收所述HOST發(fā)送的指示信息后輪詢所述第一隊列。
另外,需要說明的是,本實(shí)施例所述的第一隊列即實(shí)施例1所述的第二隊列,可以是門鈴隊列DQ。本實(shí)施例所述的所述第二隊列即實(shí)施例1所述的第一隊列,可以是提交隊列SQ。所述第三隊列可以是完成隊列CQ。
本發(fā)明實(shí)施例提供的交互方法,所述NVMe設(shè)備在主機(jī)HOST的內(nèi)存中的第一隊列中輪詢到觸發(fā)指令;所述觸發(fā)指令指示所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。所述NVMe設(shè)備獲取任務(wù)指令,執(zhí)行所述任務(wù)指令指示的操作。NVMe設(shè)備在所述HOST的內(nèi)存中的第一隊列中檢測到完成指令;所述完成指令指示所述HOST已確認(rèn)與所述NVMe設(shè)備完成了交互。這樣,在HOST與NVMe設(shè)備交互的過程中,避免HOST的CPU直接操作NVMe設(shè)備的寄存器,從而避免HOST的CPU對NVMe設(shè)備側(cè)寄存器操作無響應(yīng)導(dǎo)致系統(tǒng)掛死的情況出現(xiàn)。即使出現(xiàn)NVMe設(shè)備突然被拔掉也不會導(dǎo)致HOST的CPU操作寄存器無響應(yīng)的情況,系統(tǒng)只會認(rèn)為是一次讀寫超時,從而有效的避免NVMe設(shè)備復(fù)位引起的系統(tǒng)掛死,實(shí)現(xiàn)NVMe設(shè)備的熱插拔。
實(shí)施例3:
本發(fā)明實(shí)施例提供一種交互方法,如圖4所示,所述方法包括以下步驟:
301、HOST將任務(wù)指令寫入所述HOST內(nèi)存中的第一隊列中。
其中,所述任務(wù)指令指示非易失存儲快速通道NVMe設(shè)備將執(zhí)行的操作;所述NVMe設(shè)備為與所述HOST通過快速外部組件互聯(lián)PCIe總線進(jìn)行交互的外圍設(shè)備。
302、所述HOST將觸發(fā)標(biāo)識寫入所述HOST內(nèi)存中的第二隊列。
所述觸發(fā)標(biāo)識代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互,所述交互為所述NVMe設(shè)備執(zhí)行所述操作需要與所述HOST進(jìn)行的交互。
303、所述NVMe設(shè)備輪詢所述第二隊列。
304、所述NVMe設(shè)備在所述第二隊列中檢測到觸發(fā)標(biāo)識。
305、所述NVMe設(shè)備在所述第一隊列中獲取任務(wù)指令,執(zhí)行任務(wù)指令指示的操作。
具體地,若所述操作為寫數(shù)據(jù),則所述NVMe設(shè)備執(zhí)行所述操作具體包括:
所述NVMe設(shè)備在所述HOST的寄存器中獲取待寫數(shù)據(jù),并將所述待寫數(shù)據(jù)存儲在所述NVMe設(shè)備的本地內(nèi)存中;所述NVMe設(shè)備將操作完成標(biāo)識寫入所述HOST內(nèi)的第三隊列;所述操作完成標(biāo)識指示所述操作已完成;所述NVMe設(shè)備向所述HOST發(fā)送第預(yù)設(shè)中斷,指示所述HOST訪問所述第三隊列,確認(rèn)所述操作已完成。
若所述操作為讀數(shù)據(jù),則所述NVMe設(shè)備執(zhí)行所述操作具體包括:所述NVMe設(shè)備接收所述HOST的讀數(shù)據(jù)請求,并將所述待讀數(shù)據(jù)發(fā)送給所述HOST;所述NVMe設(shè)備接收所述HOST發(fā)送的第一中斷,將操作完成標(biāo)識寫入所述HOST內(nèi)的第三隊列;所述操作完成標(biāo)識指示所述操作已完成,所述第一中斷用于指示所述NVMe設(shè)備將所述操作完成標(biāo)識寫入所述HOST內(nèi)存中的第三隊列。
其中,所述預(yù)設(shè)中斷可以是MSI-X,所述第一中斷可以是DMA中斷。
306、所述HOST獲取所述操作完成標(biāo)識,確認(rèn)所述操作已完成,則將完成標(biāo)識寫入所述第二隊列。
所述操作完成標(biāo)識指示所述操作已完成。所述完成標(biāo)識代表所述HOST已確認(rèn)所述交互已完成。
具體實(shí)現(xiàn)中,是所述HOST接收所述NVMe設(shè)備發(fā)送的預(yù)設(shè)中斷,并訪問所述第三隊列,在所述第三隊列中獲取所述操作完成標(biāo)識。
307、所述NVMe設(shè)備在所述第二隊列中檢測到完成標(biāo)識。
與所述觸發(fā)標(biāo)識一樣,所述完成標(biāo)識也可以是所述第一隊列中的一個地址位,用于指示所述HOST是否已確認(rèn)所述交互已完成。
在現(xiàn)有NVMe設(shè)備與HOST交互過程中,HOST對NVMe設(shè)備的Doorbell操作是由指HOST直接寫NVMe設(shè)備的寄存器,修改某個字段以告知NVMe設(shè)備需要與HOST進(jìn)行交互,在此過程中,如果NVMe設(shè)備系統(tǒng)復(fù)位,就會導(dǎo)致HOST的寫請求得不到響應(yīng),系統(tǒng)報出MCE,進(jìn)而系統(tǒng)被掛起。本發(fā)明中,將Doorbell操作修改為由NVMe設(shè)備驅(qū)動去HOST的寄存器內(nèi)存輪循第一隊列,以確定HOST是否已確認(rèn)將進(jìn)行交互。這樣,HOST不用去對NVMe設(shè)備的寄存器進(jìn)行寫操作,就可以避免了由于NVMe設(shè)備突然拔出(即SDI卡系統(tǒng)復(fù)位)導(dǎo)致的系統(tǒng)掛死。另外,告知NVMe設(shè)備將與HOST進(jìn)行交互,交互完成之前不能進(jìn)行NVMe設(shè)備拔出(即SDI卡系統(tǒng)復(fù)位)。
本發(fā)明實(shí)施例提供的交互方法,HOST將觸發(fā)指令寫入內(nèi)存,所述NVMe設(shè)備在主機(jī)HOST的內(nèi)存中的第一隊列中輪詢到觸發(fā)指令;所述觸發(fā)指令指示所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。所述NVMe設(shè)備獲取任務(wù)指令,執(zhí)行所述任務(wù)指令指示的操作。NVMe設(shè)備在所述HOST的內(nèi)存中的第一隊列中檢測到完成指令;所述完成指令指示所述HOST已確認(rèn)與所述NVMe設(shè)備完成了交互。這樣,在HOST與NVMe設(shè)備交互的過程中,避免HOST的CPU直接操作NVMe設(shè)備的寄存器,從而避免HOST的CPU對NVMe設(shè)備側(cè)寄存器操作無響應(yīng)導(dǎo)致系統(tǒng)掛死的情況出現(xiàn)。即使出現(xiàn)NVMe設(shè)備突然被拔掉也不會導(dǎo)致HOST的CPU操作寄存器無響應(yīng)的情況,系統(tǒng)只會認(rèn)為是一次讀寫超時,從而有效的避免NVMe設(shè)備復(fù)位引起的系統(tǒng)掛死,實(shí)現(xiàn)NVMe設(shè)備的熱插拔。
實(shí)施例4:
本發(fā)明實(shí)施例提供一種交互方法,主要用于NVMe設(shè)備與HOST交互,將數(shù)據(jù)寫入NVMe設(shè)備。如圖5所示,所述方法包括以下步驟:
401、HOST寫入命令到SQ隊列。
402、HOST將觸發(fā)指令寫入DQ(Doorbell Queue,門鈴隊列)。
403、NVMe Controller(控制器)從DQ中輪循到觸發(fā)指令。
404、NVMe Controller在HOST的內(nèi)存中獲取SQ隊列。
405、NVMe Controller在SQ隊列中獲取任務(wù)指令。
406、NVMe Controller操作NVMe設(shè)備側(cè)的DMA引擎在HOST的內(nèi)存中讀取待寫數(shù)據(jù)。
407、NVMe Controller封裝待寫數(shù)據(jù)后發(fā)送至分布式存儲軟件。
408、分布式存儲軟件向NVMe Controlle返回Response(響應(yīng))。
409、NVMe Controller將操作完成標(biāo)識寫入CQ隊列并釋放SQ隊列。
410、NVMe Controller發(fā)送MSI-X中斷到HOST。
411、HOST接收到中斷后執(zhí)行CQ隊列。
即訪問CQ隊列,獲取操作完成標(biāo)識。
412、HOST將完成指令寫入Doorbell隊列。
413、NVMe Controller從Doorbell隊列中輪詢到完成指令,NVMe Controller釋放CQ隊列。
至此,依照NVMe協(xié)議,HOST與NVMe之間一次完整的寫數(shù)據(jù)流程就完成了。
本發(fā)明實(shí)施例提供一種交互方法,所述NVMe設(shè)備寫入數(shù)據(jù)時,避免HOST的CPU直接操作NVMe設(shè)備的寄存器,從而避免HOST的CPU對NVMe設(shè)備側(cè)寄存器操作無響應(yīng)導(dǎo)致系統(tǒng)掛死的情況出現(xiàn)。即使出現(xiàn)NVMe設(shè)備突然被拔掉也不會導(dǎo)致HOST的CPU操作寄存器無響應(yīng)的情況,系統(tǒng)只會認(rèn)為是一次讀寫超時,從而有效的避免NVMe設(shè)備復(fù)位引起 的系統(tǒng)掛死,實(shí)現(xiàn)NVMe設(shè)備的熱插拔。
實(shí)施例5:
本發(fā)明實(shí)施例提供一種交互方法,主要用于NVMe設(shè)備與HOST交互,HOST在NVMe設(shè)備中讀數(shù)據(jù)。如圖6所示,所述方法包括以下步驟:
501、HOST寫入命令到SQ隊列。
502、HOST將觸發(fā)指令寫入Doorbell隊列。
503、NVMe Controller從Doorbell隊列中輪詢到觸發(fā)指令。
504、NVMe Controller在HOST的內(nèi)存中獲取SQ隊列。
505、NVMe Controller從SQ隊列中獲取任務(wù)指令。
506、NVMe Controller封裝待讀數(shù)據(jù)后發(fā)送至分布式存儲軟件。
507、分布式存儲軟件返回Response。
508、NVMe Controller操作NVMe設(shè)備側(cè)的DMA引擎在分布式存儲軟件中讀取待讀數(shù)據(jù),并將待讀數(shù)據(jù)發(fā)送至HOST。
509、HOST完成待讀數(shù)據(jù)的接收后返回DMA中斷。
510、NVMe Controller將操作完成標(biāo)識寫入CQ隊列并釋放SQ隊列。
511、NVMe Controller發(fā)送MSI-X中斷到HOST。
512、HOST接收到中斷后執(zhí)行CQ隊列。
即訪問CQ隊列,獲取操作完成標(biāo)識。
513、HOST將完成指令寫入Doorbell隊列。
514、NVMe Controller從Doorbell隊列中輪詢到完成指令,NVMe Controller釋放CQ隊列。
至此,依照NVMe協(xié)議,HOST與NVMe之間一次完整的讀數(shù)據(jù)流程就完成了。
本發(fā)明實(shí)施例提供一種交互方法,所述NVMe設(shè)備讀數(shù)據(jù)時,避免 HOST的CPU直接操作NVMe設(shè)備的寄存器,從而避免HOST的CPU對NVMe設(shè)備側(cè)寄存器操作無響應(yīng)導(dǎo)致系統(tǒng)掛死的情況出現(xiàn)。即使出現(xiàn)NVMe設(shè)備突然被拔掉也不會導(dǎo)致HOST的CPU操作寄存器無響應(yīng)的情況,系統(tǒng)只會認(rèn)為是一次讀寫超時,從而有效的避免NVMe設(shè)備復(fù)位引起的系統(tǒng)掛死,實(shí)現(xiàn)NVMe設(shè)備的熱插拔。
實(shí)施例6:
本發(fā)明實(shí)施例提供一種HOST,如圖7所示,所述HOST包括:寫入單元601、確認(rèn)單元602。
寫入單元601,用于將任務(wù)指令寫入所述HOST內(nèi)存中的第一隊列中,所述任務(wù)指令指示NVMe設(shè)備將執(zhí)行的操作;所述NVMe設(shè)備為與所述HOST通過快速外部組件互聯(lián)PCIe總線進(jìn)行交互的外圍設(shè)備。
其中,所述操作,可以是所述NVMe設(shè)備在所述HOST的內(nèi)存中讀取數(shù)據(jù),或者,是所述NVMe設(shè)備接收HOST讀數(shù)據(jù)的請求,將響應(yīng)數(shù)據(jù)發(fā)送給HOST。隊列是一種數(shù)據(jù)結(jié)構(gòu),用于存儲數(shù)據(jù)。
所述寫入單元601還用于,將觸發(fā)標(biāo)識寫入所述HOST內(nèi)存中的第二隊列;所述觸發(fā)標(biāo)識代表所述HOST已確認(rèn)將與非易失存儲快速通道NVMe設(shè)備進(jìn)行交互,所述交互為所述NVMe設(shè)備執(zhí)行所述操作需要與所述HOST進(jìn)行的交互。
所謂交互,是指HOST指示NVMe設(shè)備要執(zhí)行某操作時,在NVMe設(shè)備執(zhí)行操作之前、完成操作之后,NVMe設(shè)備與HOST間要進(jìn)行的交互,以確保NVMe設(shè)備與HOST知曉進(jìn)行的某一步流程。如:HOST在步驟101中寫入任務(wù)指令,將指示NVMe設(shè)備寫數(shù)據(jù),之后在寫入觸發(fā)標(biāo)識,使得NVMe設(shè)備檢測到觸發(fā)標(biāo)識后知曉HOST已經(jīng)確認(rèn)所述NVMe設(shè)備將從HOST的內(nèi)存中寫數(shù)據(jù)。
另外,所述觸發(fā)指令可以是所述第一隊列中的一個地址位,用于指示所述HOST是否已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。示例的,地址位為“0”代表所述HOST未確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互,地址位為“1”代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。
確認(rèn)單元602,用于確認(rèn)所述操作已完成。
所述寫入單元601還用于,在所述確認(rèn)單元確認(rèn)所述操作已完成時,將完成標(biāo)識寫入所述第一隊列,所述完成標(biāo)識代表所述HOST已確認(rèn)所述交互已完成。
需要說明的是,與所述觸發(fā)標(biāo)識一樣,所述完成標(biāo)識也可以是所述第一隊列中的一個地址位,用于指示所述HOST是否已確認(rèn)所述交互已完成。
所述確認(rèn)單元602具體用于,所述HOST接收所述NVMe設(shè)備發(fā)送的預(yù)設(shè)中斷,訪問所述HOST內(nèi)存中的第三隊列,檢測到操作完成標(biāo)識,則確認(rèn)所述操作已完成。
其中,所述預(yù)設(shè)中斷用于指示所述HOST訪問所述第三隊列,所述操作完成標(biāo)識指示所述操作已完成。
需要說明的是,所述預(yù)設(shè)中斷可以是MSI(Message Signaled Interrupt,消息信息中斷)-X。另外,在本實(shí)施例中,所述第一隊列可以是SQ(Submit Queue,提交隊列),所述第二隊列可以是DQ(Doorbell Queue,門鈴隊列),所述第三隊列可以是CQ(Complete Queue,完成隊列)。
在現(xiàn)有NVMe設(shè)備與HOST交互過程中,HOST對NVMe設(shè)備的Doorbell操作是由指HOST直接寫NVMe設(shè)備的寄存器,修改某個字段以告知NVMe設(shè)備需要與HOST進(jìn)行交互,在此過程中,如果NVMe設(shè)備系統(tǒng)復(fù)位,就會導(dǎo)致HOST的寫請求得不到響應(yīng),系統(tǒng)報出MCE,進(jìn)而系統(tǒng)被掛起。本發(fā)明中,將Doorbell操作修改為由NVMe設(shè)備驅(qū)動去HOST的寄存器內(nèi)存輪循第一隊列,以確定是否將與HOST進(jìn)行交互。這樣既保證了NVMe設(shè)備與HOST之間交互的正常進(jìn)行,又避免了由于NVMe設(shè)備系統(tǒng)復(fù)位導(dǎo)致的系統(tǒng)掛死。
本發(fā)明實(shí)施例提供的HOST,將觸發(fā)指令寫入內(nèi)存,使得所述NVMe設(shè)備在主機(jī)HOST的內(nèi)存中的第一隊列中輪詢到觸發(fā)指令;所述觸發(fā)指令指示所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。所述NVMe設(shè)備獲取任務(wù)指令,執(zhí)行所述任務(wù)指令指示的操作。NVMe設(shè)備在所述HOST的內(nèi)存中的第一隊列中檢測到完成指令;所述完成 指令指示所述HOST已確認(rèn)與所述NVMe設(shè)備完成了交互。這樣,在HOST與NVMe設(shè)備交互的過程中,避免HOST的CPU直接操作NVMe設(shè)備的寄存器,從而避免HOST的CPU對NVMe設(shè)備側(cè)寄存器操作無響應(yīng)導(dǎo)致系統(tǒng)掛死的情況出現(xiàn)。即使出現(xiàn)NVMe設(shè)備突然被拔掉也不會導(dǎo)致HOST的CPU操作寄存器無響應(yīng)的情況,系統(tǒng)只會認(rèn)為是一次讀寫超時,從而有效的避免NVMe設(shè)備復(fù)位引起的系統(tǒng)掛死,實(shí)現(xiàn)NVMe設(shè)備的熱插拔。
實(shí)施例7:
本發(fā)明實(shí)施例提供一種NVMe設(shè)備,如圖8所示,所述HOST包括:檢測單元701、獲取單元702、執(zhí)行單元703。
檢測單元701,用于輪詢第一隊列;所述第一隊列存儲在主機(jī)HOST的內(nèi)存中。
所謂輪詢,是指NVMe設(shè)備去監(jiān)控或者不斷的去讀取HOST內(nèi)存中的第一隊列,直到讀取到所述觸發(fā)指令(如:特定地址位的數(shù)值有變化:變?yōu)椤?”),則認(rèn)為NVMe設(shè)備將與所述HOST進(jìn)行交互。
所述檢測單元701還用于,在所述第一隊列中檢測到觸發(fā)標(biāo)識,所述觸發(fā)標(biāo)識代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互;所述交互為所述NVMe設(shè)備執(zhí)行操作需要與所述HOST進(jìn)行的交互。
其中,所述觸發(fā)指令可以是所述第一隊列中的一個地址位,用于指示所述HOST是否已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。示例的,地址位為“0”代表所述HOST未確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互,地址位為“1”代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。
另外,所述操作,可以是所述NVMe設(shè)備在所述HOST的內(nèi)存中讀取數(shù)據(jù),或者,是所述NVMe設(shè)備接收HOST讀數(shù)據(jù)的請求,將響應(yīng)數(shù)據(jù)發(fā)送給HOST。隊列是一種數(shù)據(jù)結(jié)構(gòu),用于存儲數(shù)據(jù)。
所謂交互,是指HOST指示NVMe設(shè)備要執(zhí)行某操作時,在NVMe設(shè)備執(zhí)行操作之前、完成操作之后,NVMe設(shè)備與HOST間要進(jìn)行的交互,以確保NVMe設(shè)備與HOST知曉進(jìn)行的某一步流程。如:HOST在步驟 101中寫入任務(wù)指令,將指示NVMe設(shè)備寫數(shù)據(jù),之后在寫入觸發(fā)標(biāo)識,使得NVMe設(shè)備檢測到觸發(fā)標(biāo)識后知曉HOST已經(jīng)確認(rèn)所述NVMe設(shè)備將從HOST的內(nèi)存中寫數(shù)據(jù)。
獲取單元702,用于獲取任務(wù)指令;所述任務(wù)指令指示所述HOST將執(zhí)行的所述操作。
執(zhí)行單元703,用于執(zhí)行所述操作。
所述檢測單元701還用于,在所述第一隊列中檢測到完成標(biāo)識;所述完成標(biāo)識指示所述HOST已確認(rèn)與所述交互已完成,所述完成標(biāo)識是所述HOST確認(rèn)所述操作完成之后寫入所述第一隊列的。
需要說明的是,與所述觸發(fā)標(biāo)識一樣,所述完成標(biāo)識也可以是所述第一隊列中的一個地址位,用于指示所述HOST是否已確認(rèn)所述交互已完成。
在現(xiàn)有NVMe設(shè)備與HOST交互過程中,HOST對NVMe設(shè)備的Doorbell操作是由指HOST直接寫NVMe設(shè)備的寄存器,修改某個字段以告知NVMe設(shè)備需要與HOST進(jìn)行交互,在此過程中,如果NVMe設(shè)備系統(tǒng)復(fù)位,就會導(dǎo)致HOST的寫請求得不到響應(yīng),系統(tǒng)報出MCE,進(jìn)而系統(tǒng)被掛起。本發(fā)明中,將Doorbell操作修改為由NVMe設(shè)備驅(qū)動去HOST的寄存器內(nèi)存輪循第一隊列,以確定HOST是否已確認(rèn)將進(jìn)行交互。這樣,HOST不用去對NVMe設(shè)備的寄存器進(jìn)行寫操作,就可以避免了由于NVMe設(shè)備突然拔出(即SDI卡系統(tǒng)復(fù)位)導(dǎo)致的系統(tǒng)掛死。另外,告知NVMe設(shè)備將與HOST進(jìn)行交互,交互完成之前不能進(jìn)行NVMe設(shè)備拔出(即SDI卡系統(tǒng)復(fù)位)。
所述獲取單元702具體用于:訪問所述HOST內(nèi)存中的第二隊列,在所述第二隊列中獲取所述任務(wù)指令。
若操作為寫數(shù)據(jù),則所述執(zhí)行單元703具體用于:
在所述HOST的寄存器中獲取待寫數(shù)據(jù),并將所述待寫數(shù)據(jù)存儲在所述NVMe設(shè)備的本地內(nèi)存中;
將操作完成標(biāo)識寫入所述HOST內(nèi)的第三隊列;所述操作完成標(biāo)識指示所述操作已完成;
向所述HOST發(fā)送第預(yù)設(shè)中斷,指示所述HOST訪問所述第三隊列,確認(rèn)所述操作已完成。
示例的:(1)NVMe Controller從SQ中讀取NVMe命令。
其中,所述NVMe Controller是NVMe設(shè)備側(cè)的控制模塊,所述SQ即所述第二隊列,所述NVMe命令即所述任務(wù)指令。這里,所述NVMe命令指示的操作為將待寫數(shù)據(jù)寫入到所述NVMe設(shè)備。
(2)NVMe Controller操作NVMe設(shè)備側(cè)的DMA()引擎在HOST的內(nèi)存中獲取數(shù)據(jù)。
(3)NVMe Controller封裝所述待寫數(shù)據(jù)后發(fā)送至NVMe設(shè)備側(cè)的分布式存儲軟件。
其中,所述分布式存儲軟件是所述NVMe設(shè)備側(cè)的用于存儲數(shù)據(jù)的。所謂封裝待寫數(shù)據(jù)即將待寫數(shù)據(jù)封裝成分布式存儲軟件可以識別的格式。
(4)分布式存儲軟件向NVMe Controller返回Response。
實(shí)際上,就是分布式存儲軟件在存儲完NVMe Controller發(fā)送的數(shù)據(jù)之后,向NVMe Controller返回一個信息,用于告知NVMe Controller本次交互要寫入NVMe設(shè)備的待寫數(shù)據(jù)已經(jīng)傳完。
(5)NVMe Controller將操作完成標(biāo)識寫入第三隊列。
其中,所述第三隊列可以是CQ,所述操作完成標(biāo)識指示操作已完成(即已將待寫數(shù)據(jù)寫入NVMe設(shè)備)。
(6)NVMe Controller向HOST發(fā)送MSI-X,指示所述HOST訪問所述第三隊列,在第三隊列中獲取操作完成標(biāo)識后確認(rèn)所述操作已完成。
若操作為讀數(shù)據(jù),則所述執(zhí)行單元703具體用于:
接收所述HOST的讀數(shù)據(jù)請求,并將所述待讀數(shù)據(jù)發(fā)送給所述HOST;
接收所述HOST發(fā)送的第一中斷,將操作完成標(biāo)識寫入所述HOST內(nèi)的第三隊列;所述操作完成標(biāo)識指示所述操作已完成,所述第一中斷用于指示所述NVMe設(shè)備將所述操作完成標(biāo)識寫入所述HOST內(nèi)存中 的第三隊列;
向所述HOST發(fā)送預(yù)設(shè)中斷,指示所述HOST訪問所述第三隊列,確認(rèn)所述操作已完成。
示例的,(1)NVMe Controller從SQ隊列中讀取NVMe命令。
其中,所述NVMe Controller是NVMe設(shè)備側(cè)的控制模塊,所述SQ即所述第二隊列,所述NVMe命令即所述任務(wù)指令。這里,所述NVMe命令指示的操作為所述NVMe設(shè)備從HOST側(cè)的內(nèi)存中讀數(shù)據(jù)。
(2)NVMe Controller封裝待讀數(shù)據(jù)后發(fā)送至分布式存儲軟件。
所謂封裝待讀數(shù)據(jù)即將待讀數(shù)據(jù)封裝成分布式存儲軟件可以識別的格式。
(3)分布式存儲軟件返回Response。
在此Response用于告知NVMe Controller所述待讀數(shù)據(jù)已完成接收。
(4)NVMe Controller設(shè)備側(cè)的DMA引擎在分布式存儲軟件中讀取待讀數(shù)據(jù),并將待讀數(shù)據(jù)發(fā)送至HOST。
(5)HOST完成待讀數(shù)據(jù)接收后向NVMe側(cè)返回DMA中斷。
其中,所述DMA中斷用于告知NVMe Controlle已完成數(shù)據(jù)接收。
(6)NVMe Controller接收DMA中斷后將操作完成標(biāo)識寫入第三隊列。
其中,所述第三隊列可以是CQ,所述操作完成標(biāo)識指示操作已完成(即已將待寫數(shù)據(jù)寫入NVMe設(shè)備)。
(7)NVMe Controller向HOST發(fā)送MSI-X,指示所述HOST訪問所述第三隊列,在第三隊列中獲取操作完成標(biāo)識后確認(rèn)所述操作已完成。
所述檢測單元701具體用于,設(shè)備主動輪詢所述第一隊列;
或,接收所述HOST發(fā)送的指示信息后輪詢所述第一隊列。
本發(fā)明實(shí)施例提供的NVMe設(shè)備,在主機(jī)HOST的內(nèi)存中的第一隊列中輪詢到觸發(fā)指令;所述觸發(fā)指令指示所述HOST已確認(rèn)將與所 述NVMe設(shè)備進(jìn)行交互。所述NVMe設(shè)備獲取任務(wù)指令,執(zhí)行所述任務(wù)指令指示的操作。NVMe設(shè)備在所述HOST的內(nèi)存中的第一隊列中檢測到完成指令;所述完成指令指示所述HOST已確認(rèn)與所述NVMe設(shè)備完成了交互。這樣,在HOST與NVMe設(shè)備交互的過程中,避免HOST的CPU直接操作NVMe設(shè)備的寄存器,從而避免HOST的CPU對NVMe設(shè)備側(cè)寄存器操作無響應(yīng)導(dǎo)致系統(tǒng)掛死的情況出現(xiàn)。即使出現(xiàn)NVMe設(shè)備突然被拔掉也不會導(dǎo)致HOST的CPU操作寄存器無響應(yīng)的情況,系統(tǒng)只會認(rèn)為是一次讀寫超時,從而有效的避免NVMe設(shè)備復(fù)位引起的系統(tǒng)掛死,實(shí)現(xiàn)NVMe設(shè)備的熱插拔。
實(shí)施例8:
本發(fā)明實(shí)施例提供一種HOST,如圖9所示,所述HOST包括:處理器801、系統(tǒng)總線802和存儲器803。
其中,處理器801可以為中央處理器(英文:central processing unit,縮寫:CPU)。
存儲器803,用于存儲程序代碼,并將該程序代碼傳輸給該處理器801,處理器801根據(jù)程序代碼執(zhí)行下述指令。存儲器803可以包括易失性存儲器(英文:volatile memory),例如隨機(jī)存取存儲器(英文:random-access memory,縮寫:RAM);存儲器803也可以包括非易失性存儲器(英文:non-volatile memory),例如只讀存儲器(英文:read-only memory,縮寫:ROM),快閃存儲器(英文:flash memory),硬盤(英文:hard disk drive,縮寫:HDD)或固態(tài)硬盤(英文:solid-state drive,縮寫:SSD)。存儲器803還可以包括上述種類的存儲器的組合。處理器801、存儲器803之間通過系統(tǒng)總線802連接并完成相互間的通信。
處理器801,用于將任務(wù)指令寫入所述HOST內(nèi)存中的第一隊列中,所述任務(wù)指令指示NVMe設(shè)備將執(zhí)行的操作;所述NVMe設(shè)備為與所述HOST通過快速外部組件互聯(lián)PCIe總線進(jìn)行交互的外圍設(shè)備。
其中,所述操作,可以是所述NVMe設(shè)備在所述HOST的內(nèi)存中讀取數(shù)據(jù),或者,是所述NVMe設(shè)備接收HOST讀數(shù)據(jù)的請求,將響應(yīng)數(shù)據(jù)發(fā)送給HOST。隊列是一種數(shù)據(jù)結(jié)構(gòu),用于存儲數(shù)據(jù)。
所述處理器801還用于,將觸發(fā)標(biāo)識寫入所述HOST內(nèi)存中的第二隊列;所述觸發(fā)標(biāo)識代表所述HOST已確認(rèn)將與非易失存儲快速通道NVMe設(shè)備進(jìn)行交互,所述交互為所述NVMe設(shè)備執(zhí)行所述操作需要與所述HOST進(jìn)行的交互。
其中,所謂交互,是指HOST指示NVMe設(shè)備要執(zhí)行某操作時,在NVMe設(shè)備執(zhí)行操作之前、完成操作之后,NVMe設(shè)備與HOST間要進(jìn)行的交互,以確保NVMe設(shè)備與HOST知曉進(jìn)行的某一步流程。如:HOST在步驟101中寫入任務(wù)指令,將指示NVMe設(shè)備寫數(shù)據(jù),之后在寫入觸發(fā)標(biāo)識,使得NVMe設(shè)備檢測到觸發(fā)標(biāo)識后知曉HOST已經(jīng)確認(rèn)所述NVMe設(shè)備將從HOST的內(nèi)存中寫數(shù)據(jù)。
另外,所述觸發(fā)指令可以是所述第一隊列中的一個地址位,用于指示所述HOST是否已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。示例的,地址位為“0”代表所述HOST未確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互,地址位為“1”代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。
確認(rèn)處理器801,用于確認(rèn)所述操作已完成,確認(rèn)所述操作已完成時,將完成標(biāo)識寫入所述第一隊列,所述完成標(biāo)識代表所述HOST已確認(rèn)所述交互已完成。
需要說明的是,與所述觸發(fā)標(biāo)識一樣,所述完成標(biāo)識也可以是所述第一隊列中的一個地址位,用于指示所述HOST是否已確認(rèn)所述交互已完成。
所述處理器801具體用于,所述HOST接收所述NVMe設(shè)備發(fā)送的預(yù)設(shè)中斷,訪問所述HOST內(nèi)存中的第三隊列,檢測到操作完成標(biāo)識,則確認(rèn)所述操作已完成。
其中,所述預(yù)設(shè)中斷用于指示所述HOST訪問所述第三隊列,所述操作完成標(biāo)識指示所述操作已完成。
本發(fā)明實(shí)施例提供的HOST,將觸發(fā)指令寫入內(nèi)存,使得所述NVMe設(shè)備在主機(jī)HOST的內(nèi)存中的第一隊列中輪詢到觸發(fā)指令;所述觸發(fā)指令指示所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。所述NVMe設(shè)備獲取任務(wù)指令,執(zhí)行所述任務(wù)指令指示的操作。NVMe 設(shè)備在所述HOST的內(nèi)存中的第一隊列中檢測到完成指令;所述完成指令指示所述HOST已確認(rèn)與所述NVMe設(shè)備完成了交互。這樣,在HOST與NVMe設(shè)備交互的過程中,避免HOST的CPU直接操作NVMe設(shè)備的寄存器,從而避免HOST的CPU對NVMe設(shè)備側(cè)寄存器操作無響應(yīng)導(dǎo)致系統(tǒng)掛死的情況出現(xiàn)。即使出現(xiàn)NVMe設(shè)備突然被拔掉也不會導(dǎo)致HOST的CPU操作寄存器無響應(yīng)的情況,系統(tǒng)只會認(rèn)為是一次讀寫超時,從而有效的避免NVMe設(shè)備復(fù)位引起的系統(tǒng)掛死,實(shí)現(xiàn)NVMe設(shè)備的熱插拔。
實(shí)施例9:
本發(fā)明實(shí)施例提供一種NVMe設(shè)備,如圖10所示,所述HOST包括:處理器901、系統(tǒng)總線902和存儲器903。
其中,處理器901可以為中央處理器(英文:central processing unit,縮寫:CPU)。
存儲器903,用于存儲程序代碼,并將該程序代碼傳輸給該處理器901,處理器901根據(jù)程序代碼執(zhí)行下述指令。存儲器903可以包括易失性存儲器(英文:volatile memory),例如隨機(jī)存取存儲器(英文:random-access memory,縮寫:RAM);存儲器903也可以包括非易失性存儲器(英文:non-volatile memory),例如只讀存儲器(英文:read-only memory,縮寫:ROM),快閃存儲器(英文:flash memory),硬盤(英文:hard disk drive,縮寫:HDD)或固態(tài)硬盤(英文:solid-state drive,縮寫:SSD)。存儲器903還可以包括上述種類的存儲器的組合。處理器901、存儲器903之間通過系統(tǒng)總線902連接并完成相互間的通信。
處理器901,用于輪詢第一隊列;所述第一隊列存儲在主機(jī)HOST的內(nèi)存中。在所述第一隊列中檢測到觸發(fā)標(biāo)識,所述觸發(fā)標(biāo)識代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互;所述交互為所述NVMe設(shè)備執(zhí)行操作需要與所述HOST進(jìn)行的交互。
所謂輪詢,是指NVMe設(shè)備去監(jiān)控或者不斷的去讀取HOST內(nèi)存中的第一隊列,直到讀取到所述觸發(fā)指令(如:特定地址位的數(shù)值有變化:變?yōu)椤?”),則認(rèn)為NVMe設(shè)備將與所述HOST進(jìn)行交互。
處理器901,用于獲取任務(wù)指令;所述任務(wù)指令指示所述HOST將執(zhí)行的所述操作。
其中,所述觸發(fā)指令可以是所述第一隊列中的一個地址位,用于指示所述HOST是否已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。示例的,地址位為“0”代表所述HOST未確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互,地址位為“1”代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。
另外,所述操作,可以是所述NVMe設(shè)備在所述HOST的內(nèi)存中讀取數(shù)據(jù),或者,是所述NVMe設(shè)備接收HOST讀數(shù)據(jù)的請求,將響應(yīng)數(shù)據(jù)發(fā)送給HOST。隊列是一種數(shù)據(jù)結(jié)構(gòu),用于存儲數(shù)據(jù)。
所謂交互,是指HOST指示NVMe設(shè)備要執(zhí)行某操作時,在NVMe設(shè)備執(zhí)行操作之前、完成操作之后,NVMe設(shè)備與HOST間要進(jìn)行的交互,以確保NVMe設(shè)備與HOST知曉進(jìn)行的某一步流程。如:HOST在步驟101中寫入任務(wù)指令,將指示NVMe設(shè)備寫數(shù)據(jù),之后在寫入觸發(fā)標(biāo)識,使得NVMe設(shè)備檢測到觸發(fā)標(biāo)識后知曉HOST已經(jīng)確認(rèn)所述NVMe設(shè)備將從HOST的內(nèi)存中寫數(shù)據(jù)。
處理器901還用于,執(zhí)行所述操作。
所述處理器901還用于,在所述第一隊列中檢測到完成標(biāo)識;所述完成標(biāo)識指示所述HOST已確認(rèn)與所述交互已完成,所述完成標(biāo)識是所述HOST確認(rèn)所述操作完成之后寫入所述第一隊列的。與所述觸發(fā)標(biāo)識一樣,所述完成標(biāo)識也可以是所述第一隊列中的一個地址位,用于指示所述HOST是否已確認(rèn)所述交互已完成。
所述處理器901具體用于:訪問所述HOST內(nèi)存中的第二隊列,在所述第二隊列中獲取所述任務(wù)指令。
若操作為寫數(shù)據(jù),則所述處理器901具體用于:
在所述HOST的寄存器中獲取待寫數(shù)據(jù),并將所述待寫數(shù)據(jù)存儲在所述NVMe設(shè)備的本地內(nèi)存中;
將操作完成標(biāo)識寫入所述HOST內(nèi)的第三隊列;所述操作完成標(biāo)識指示所述操作已完成;
向所述HOST發(fā)送第預(yù)設(shè)中斷,指示所述HOST訪問所述第三隊 列,確認(rèn)所述操作已完成。
示例的,1)NVMe Controller從SQ中讀取NVMe命令。
其中,所述NVMe Controller是NVMe設(shè)備側(cè)的控制模塊,所述SQ即所述第二隊列,所述NVMe命令即所述任務(wù)指令。這里,所述NVMe命令指示的操作為將待寫數(shù)據(jù)寫入到所述NVMe設(shè)備。
(2)NVMe Controller操作NVMe設(shè)備側(cè)的DMA()引擎在HOST的內(nèi)存中獲取數(shù)據(jù)。
(3)NVMe Controller封裝所述待寫數(shù)據(jù)后發(fā)送至NVMe設(shè)備側(cè)的分布式存儲軟件。
其中,所述分布式存儲軟件是所述NVMe設(shè)備側(cè)的用于存儲數(shù)據(jù)的。所謂封裝待寫數(shù)據(jù)即將待寫數(shù)據(jù)封裝成分布式存儲軟件可以識別的格式。
(4)分布式存儲軟件向NVMe Controller返回Response。
實(shí)際上,就是分布式存儲軟件在存儲完NVMe Controller發(fā)送的數(shù)據(jù)之后,向NVMe Controller返回一個信息,用于告知NVMe Controller本次交互要寫入NVMe設(shè)備的待寫數(shù)據(jù)已經(jīng)傳完。
(5)NVMe Controller將操作完成標(biāo)識寫入第三隊列。
其中,所述第三隊列可以是CQ,所述操作完成標(biāo)識指示操作已完成(即已將待寫數(shù)據(jù)寫入NVMe設(shè)備)。
(6)NVMe Controller向HOST發(fā)送MSI-X,指示所述HOST訪問所述第三隊列,在第三隊列中獲取操作完成標(biāo)識后確認(rèn)所述操作已完成。
若操作為讀數(shù)據(jù),則所述處理器901具體用于:
接收所述HOST的讀數(shù)據(jù)請求,并將所述待讀數(shù)據(jù)發(fā)送給所述HOST;
接收所述HOST發(fā)送的第一中斷,將操作完成標(biāo)識寫入所述HOST內(nèi)的第三隊列;所述操作完成標(biāo)識指示所述操作已完成,所述第一中斷用于指示所述NVMe設(shè)備將所述操作完成標(biāo)識寫入所述HOST內(nèi)存中的第三隊列;
向所述HOST發(fā)送預(yù)設(shè)中斷,指示所述HOST訪問所述第三隊列,確認(rèn)所述操作已完成。
示例的:(1)NVMe Controller從SQ隊列中讀取NVMe命令。
其中,所述NVMe Controller是NVMe設(shè)備側(cè)的控制模塊,所述SQ即所述第二隊列,所述NVMe命令即所述任務(wù)指令。這里,所述NVMe命令指示的操作為所述NVMe設(shè)備從HOST側(cè)的內(nèi)存中讀數(shù)據(jù)。
(2)NVMe Controller封裝待讀數(shù)據(jù)后發(fā)送至分布式存儲軟件。
所謂封裝待讀數(shù)據(jù)即將待讀數(shù)據(jù)封裝成分布式存儲軟件可以識別的格式。
(3)分布式存儲軟件返回Response。
在此Response用于告知NVMe Controller所述待讀數(shù)據(jù)已完成接收。
(4)NVMe Controller設(shè)備側(cè)的DMA引擎在分布式存儲軟件中讀取待讀數(shù)據(jù),并將待讀數(shù)據(jù)發(fā)送至HOST。
(5)HOST完成待讀數(shù)據(jù)接收后向NVMe側(cè)返回DMA中斷。
其中,所述DMA中斷用于告知NVMe Controlle已完成數(shù)據(jù)接收。
(6)NVMe Controller接收DMA中斷后將操作完成標(biāo)識寫入第三隊列。
其中,所述第三隊列可以是CQ,所述操作完成標(biāo)識指示操作已完成(即已將待寫數(shù)據(jù)寫入NVMe設(shè)備)。
(7)NVMe Controller向HOST發(fā)送MSI-X,指示所述HOST訪問所述第三隊列,在第三隊列中獲取操作完成標(biāo)識后確認(rèn)所述操作已完成。
這樣,在HOST與NVMe設(shè)備交互的過程中,避免HOST的CPU直接操作NVMe設(shè)備的寄存器。將HOST對NVMe設(shè)備的兩次直接寄存器操作變成NVMe設(shè)備側(cè)主動去HOST的內(nèi)存隊列輪循,從而避免HOST的CPU對NVMe設(shè)備側(cè)寄存器操作無響應(yīng)導(dǎo)致系統(tǒng)掛死的情況出現(xiàn)。Doorbell操作由原來的HOST直接寫NVMe設(shè)備寄存器修改為由NVMe 設(shè)備驅(qū)動去輪循Doorbell隊列(即本發(fā)明所述第一隊列),HOST將所述觸發(fā)指令、完成指令寫入內(nèi)存中的Doorbell隊列,即認(rèn)為是讀寫請求已經(jīng)得到響應(yīng)。這時候即使出現(xiàn)NVMe設(shè)備突然被拔掉也不會導(dǎo)致HOST的CPU操作寄存器無響應(yīng)的情況,系統(tǒng)只會認(rèn)為是一次讀寫超時,從而有效的避免系統(tǒng)掛死的情況。這樣,HOST不用去對NVMe設(shè)備的寄存器進(jìn)行寫操作,二者之間還可以進(jìn)行正常交互,還可以避免了由于NVMe設(shè)備突然拔出導(dǎo)致的系統(tǒng)掛死。另外,告知NVMe設(shè)備與HOST之間的交互完成,可以進(jìn)行NVMe設(shè)備拔出,從而實(shí)現(xiàn)NVMe設(shè)備的熱插拔。
所述處理器901具體用于,設(shè)備主動輪詢所述第一隊列;
或,接收所述HOST發(fā)送的指示信息后輪詢所述第一隊列。
本發(fā)明實(shí)施例提供的NVMe設(shè)備,在主機(jī)HOST的內(nèi)存中的第一隊列中輪詢到觸發(fā)指令;所述觸發(fā)指令指示所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。所述NVMe設(shè)備獲取任務(wù)指令,執(zhí)行所述任務(wù)指令指示的操作。NVMe設(shè)備在所述HOST的內(nèi)存中的第一隊列中檢測到完成指令;所述完成指令指示所述HOST已確認(rèn)與所述NVMe設(shè)備完成了交互。這樣,在HOST與NVMe設(shè)備交互的過程中,避免HOST的CPU直接操作NVMe設(shè)備的寄存器,從而避免HOST的CPU對NVMe設(shè)備側(cè)寄存器操作無響應(yīng)導(dǎo)致系統(tǒng)掛死的情況出現(xiàn)。即使出現(xiàn)NVMe設(shè)備突然被拔掉也不會導(dǎo)致HOST的CPU操作寄存器無響應(yīng)的情況,系統(tǒng)只會認(rèn)為是一次讀寫超時,從而有效的避免NVMe設(shè)備復(fù)位引起的系統(tǒng)掛死,實(shí)現(xiàn)NVMe設(shè)備的熱插拔。
實(shí)施例10:
本發(fā)明實(shí)施例提供一種物理機(jī)系統(tǒng),如圖11所示,所述物理機(jī)系統(tǒng)包括包括HOST和NVMe設(shè)備。
具體地,所述HOST和NVMe設(shè)備間的交互包括:
所述HOST將任務(wù)指令寫入所述HOST內(nèi)存中的第一隊列中,所述任務(wù)指令指示非易失存儲快速通道NVMe設(shè)備將執(zhí)行的操作。所述NVMe設(shè)備為與所述HOST通過快速外部組件互聯(lián)PCIe總線進(jìn)行交互的外圍設(shè)備。
所述HOST將觸發(fā)標(biāo)識寫入所述HOST內(nèi)存中的第二隊列;所述觸發(fā)標(biāo)識代表所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互,所述交互為所述NVMe設(shè)備執(zhí)行所述操作需要與所述HOST進(jìn)行的交互。
所述NVMe設(shè)備輪詢所述第二隊列。
所述NVMe設(shè)備在所述第二隊列中檢測到觸發(fā)標(biāo)識。
所述NVMe設(shè)備在所述第一隊列中獲取任務(wù)指令;行所述操作。
所述HOST獲取所述操作完成標(biāo)識,確認(rèn)所述操作已完成,則將完成標(biāo)識寫入所述第二隊列;所述操作完成標(biāo)識指示所述操作已完成;所述完成標(biāo)識代表所述HOST已確認(rèn)所述交互已完成;
所述NVMe設(shè)備在所述第二隊列中檢測到完成標(biāo)識。
需要說明的是,所述任務(wù)指令指示的操作具體可以是所述NVMe設(shè)備在所述HOST的內(nèi)存中讀取數(shù)據(jù),或者,是所述NVMe設(shè)備接收HOST讀數(shù)據(jù)的請求,將響應(yīng)數(shù)據(jù)發(fā)送給HOST。
若所述操作為寫數(shù)據(jù),則所述NVMe設(shè)備執(zhí)行所述操作具體包括:
所述NVMe設(shè)備在所述HOST的寄存器中獲取待寫數(shù)據(jù),并將所述待寫數(shù)據(jù)存儲在所述NVMe設(shè)備的本地內(nèi)存中;所述NVMe設(shè)備將操作完成標(biāo)識寫入所述HOST內(nèi)的第三隊列;所述操作完成標(biāo)識指示所述操作已完成;所述NVMe設(shè)備向所述HOST發(fā)送第預(yù)設(shè)中斷,指示所述HOST訪問所述第三隊列,確認(rèn)所述操作已完成。
若所述操作為讀數(shù)據(jù),則所述NVMe設(shè)備執(zhí)行所述操作具體包括:所述NVMe設(shè)備接收所述HOST的讀數(shù)據(jù)請求,并將所述待讀數(shù)據(jù)發(fā)送給所述HOST;所述NVMe設(shè)備接收所述HOST發(fā)送的第一中斷,將操作完成標(biāo)識寫入所述HOST內(nèi)的第三隊列;所述操作完成標(biāo)識指示所述操作已完成,所述第一中斷用于指示所述NVMe設(shè)備將所述操作完成標(biāo)識寫入所述HOST內(nèi)存中的第三隊列;所述NVMe設(shè)備向所述HOST發(fā)送預(yù)設(shè)中斷,指示所述HOST訪問所述第三隊列,確認(rèn)所述操作已完成。
這樣,HOST接收所述預(yù)設(shè)中斷后就會訪問第三隊列,獲取其中的操作完成標(biāo)識,進(jìn)而將完成標(biāo)識寫入所述第二隊列。
本實(shí)施例所述的第一隊列,可以是提交隊列SQ,本實(shí)施例所述的第 二隊列,可以是門鈴隊列DQ。所述第三隊列可以是完成隊列CQ。所述預(yù)設(shè)中斷可以是MSI-X。
本發(fā)明實(shí)施例提供的物理機(jī)系統(tǒng),NVMe設(shè)備在主機(jī)HOST的內(nèi)存中的第一隊列中輪詢到觸發(fā)指令;所述觸發(fā)指令指示所述HOST已確認(rèn)將與所述NVMe設(shè)備進(jìn)行交互。所述NVMe設(shè)備獲取任務(wù)指令,執(zhí)行所述任務(wù)指令指示的操作。NVMe設(shè)備在所述HOST的內(nèi)存中的第一隊列中檢測到完成指令;所述完成指令指示所述HOST已確認(rèn)與所述NVMe設(shè)備完成了交互。這樣,在HOST與NVMe設(shè)備交互的過程中,避免HOST的CPU直接操作NVMe設(shè)備的寄存器,從而避免HOST的CPU對NVMe設(shè)備側(cè)寄存器操作無響應(yīng)導(dǎo)致系統(tǒng)掛死的情況出現(xiàn)。即使出現(xiàn)NVMe設(shè)備突然被拔掉也不會導(dǎo)致HOST的CPU操作寄存器無響應(yīng)的情況,系統(tǒng)只會認(rèn)為是一次讀寫超時,從而有效的避免NVMe設(shè)備復(fù)位引起的系統(tǒng)掛死,實(shí)現(xiàn)NVMe設(shè)備的熱插拔。
通過以上的實(shí)施方式的描述,所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡潔,僅以上述各功能模塊的劃分進(jìn)行舉例說明,實(shí)際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將裝置的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。上述描述的裝置的具體工作過程,可以參考前述方法實(shí)施例中的對應(yīng)過程,在此不再贅述。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是一個物理單元或多個物理單元,即可以位于一個地方,或者也可以分布到多個不同地方??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部單元來實(shí)現(xiàn)本實(shí)施例方案的目的。另外,在本發(fā)明各個實(shí)施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨(dú)物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能單元的形式實(shí)現(xiàn)。
所述集成的單元如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時,可以存儲在一個可讀取存儲介質(zhì)中?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方 案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一個設(shè)備(可以是單片機(jī),芯片等)或處理器(processor)執(zhí)行本發(fā)明各個實(shí)施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:U盤、移動硬盤、只讀存儲器(ROM,Read-Only Memory)、隨機(jī)存取存儲器(RAM,Random Access Memory)、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
以上所述,僅為本發(fā)明的具體實(shí)施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)所述以權(quán)利要求的保護(hù)范圍為準(zhǔn)。