《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(4)-- Controller Architecture
4 Controller架構(gòu)
NVMe over Fabrics使用與NVMe基礎(chǔ)規(guī)格說明書中定義相同的controller架構(gòu)。這包括主機(jī)和controller之間使用SQ提交隊列和CQ完成隊列來執(zhí)行命令。
4.1 Identify Controller數(shù)據(jù)結(jié)構(gòu)增強(qiáng)
這一章節(jié)定義NVMe over Fabrics專用的Identify Controller字段。
4.2 Controller模型
NVM subsystem可以支持動態(tài)的或靜態(tài)的controller模型。同一個NVM subsystem中所有controller必須遵循相同的controller模型。Discovery Controller必須支持動態(tài)的controller模型。
在動態(tài)的controller模型中,controller是NVM subsystem按需分配的。這種模型,所有的為特定主機(jī)分配的controller在建立關(guān)聯(lián)的時候都具有相同的狀態(tài),包括掛載的namespace和功能特性設(shè)置。對于建立關(guān)聯(lián)之后的controller發(fā)生改變不能影響其他動態(tài)的controller。NVM subsystem使用動態(tài)controller模型的情況下,當(dāng)主機(jī)使用Fabrics Connect命令建立關(guān)聯(lián)時主機(jī)必須指定Controller ID為0xFFFF。
在靜態(tài)的controller模型中,與特定主機(jī)建立關(guān)聯(lián)時分配的controller,它們可能處于不同狀態(tài)。NVM subsystem中的controller們通過Controller ID來辨別。【The state that persists across associations is any state that persists across a Controller Level Reset. 】。對于一個靜態(tài)的controller模型,不同的controller可能對同一主機(jī)呈現(xiàn)不同的功能特性設(shè)置或namespace掛載。NVM subsystem可以分為具體的主機(jī)配特定的controller。
為主機(jī)們靜態(tài)的controller分配期望它持久(以便主機(jī)能夠期望反復(fù)多次的(例如主機(jī)重啟之后)通過關(guān)聯(lián)連接到同一個controller),但在controller沒有被使用的任意時刻,為了執(zhí)行某些特定原因(例如:controller資源回收,subsystem重新配置),NVM subsystem可以刪除controller的主機(jī)配置。
返回的Discovery Log Entries中有controller ID值,指出這個NVM subsystem是支持動態(tài)的還是靜態(tài)的controller模型。0xFFFF表示的controller ID值是一個特殊值,用于支持動態(tài)的controller模型的NVM subsystem來表明可能返回任意可用的controller。0xFFFE也是一個特殊的controller ID值,用于支持靜態(tài)的controller模型的NVM subsystem來表明可能返回任意可用的controller。如果Discovery Log entries使用Controller ID值為0xFFFF那么這個NVM subsystem支持動態(tài)的controller模型。如果Discovery Log entries使用Controller ID值小于0xFFFF那么這個NVM subsystem支持靜態(tài)的controller模型。Identify Controller數(shù)據(jù)結(jié)構(gòu)也標(biāo)示這個NVM subsystem是動態(tài)的還是靜態(tài)的。
如果一個NVM subsystem是動態(tài)的,對于這個NVM subsystem,那么可能Discovery Log中許多Discovery Log Page entries(參考Figure 34)的Controller ID設(shè)置為0xFFFF被返回(例如,表示多個NVM subsystem端口)。如果NVM subsystem是靜態(tài)的,那么Discovery Log中多個Discovery Log Page entries設(shè)置不同的Controller ID值被返回。如果一個靜態(tài)的NVM subsystem的包含Controller ID為0xFFFE值的Discovery Log entries任何條目,主機(jī)都應(yīng)該記下從Fabrics Connect命令返回的Controller ID,并且將來與此controller關(guān)聯(lián)時再使用這個分配的Controller ID。
4.3 隊列初始化和隊列狀態(tài)
當(dāng)一個Connect命令成功完成,相應(yīng)的Admin提交隊列和Admin完成隊列或者I/O提交隊列和I/O完成隊列就被創(chuàng)建了。如果主機(jī)發(fā)送一個Connect命令指定了隊列的隊列ID并且這個隊列ID已經(jīng)存在,那么返回Command Sequence Error狀態(tài)值。
Connect應(yīng)答中的Authentication Requirement(AUTHREQ)字段指示是否要求帶內(nèi)認(rèn)證。如果AUTHREQ字段為0,剛創(chuàng)建的這個隊列在Connect命令成功完成之后就準(zhǔn)備好可以被使用了。如果AUTHREQ字段設(shè)置的非0值,創(chuàng)建的這個隊列需要利用Authentication Send和Authentication Receive命令在NVMe帶內(nèi)認(rèn)證被成功地執(zhí)行之后才可以使用。
如果controller要求或正在進(jìn)行NVMe帶內(nèi)認(rèn)證,controller應(yīng)該中止除了認(rèn)證命令之外的所有其他命令,狀態(tài)為Authentication Required。NVMe帶內(nèi)認(rèn)證成功執(zhí)行之后,controller應(yīng)該中止所有的認(rèn)證命令,狀態(tài)為Command Sequence Error。
Admin隊列是第一個被創(chuàng)建的,關(guān)聯(lián)的controller是禁用狀態(tài)(即,CC.EN初始為0)。禁用的controller必須中止除了Admin隊列上Fabrics命令之外的所有命令,狀態(tài)為Command Sequence Error。controller被使能之后,它應(yīng)該接收除了Fabrics命令之外的所有支持的Admin命令。
如果關(guān)聯(lián)的controller被禁用,創(chuàng)建好的I/O隊列必須中止所有命令,狀態(tài)為Command Sequence Error。
4.4 初始化
主機(jī)選擇一個NVM subsystem來創(chuàng)建主機(jī)到controller的關(guān)聯(lián)。主機(jī)首先與這個NVM subsystem建立一個NVMe Transport連接。然后主機(jī)與controller形成關(guān)聯(lián)并用Fabrics Connect命令創(chuàng)建Admin隊列。最后,主機(jī)配置controller并創(chuàng)建I/O隊列。Figure 29是一個梯形圖,描述了一個Admin隊列或一個I/O隊列的隊列創(chuàng)建過程。
如下描述了建立關(guān)聯(lián)之后controller初始化的步驟。對于測定功能能力或配置properties,主機(jī)分別使用Property Get和Property Set命令。
1、根據(jù)要求執(zhí)行NVMe帶內(nèi)認(rèn)證(參考第6.2章節(jié));
2、主機(jī)測定controller功能能力;
3、主機(jī)配置controller的設(shè)置。具體的設(shè)置包括:
a、在CC.AMS中選擇仲裁機(jī)制;
b、在CC.MPS中初始化內(nèi)存頁大小;
c、在CC.CSS中選擇將被使用的I/O命令集。
4、通過設(shè)置CC.EN為1使能controller;
5、主機(jī)需要等待controller直到表明準(zhǔn)備好處理命令,當(dāng)CSTS.RDY為1表明controller準(zhǔn)備好可以處理命令了;
6、主機(jī)應(yīng)該通過發(fā)送Identify命令來確定controller的配置,具體說明Controller數(shù)據(jù)結(jié)構(gòu)。然后主機(jī)應(yīng)該通過對每一個namespace發(fā)送Identify命令來確定每一個namespace的配置,具體說明Namespace數(shù)據(jù)結(jié)構(gòu);
7、主機(jī)應(yīng)該使用Set Feature命令帶著隊列特性標(biāo)識數(shù)來確定支持的I/O提交隊列和I/O完成隊列數(shù)量。
8、如果主機(jī)期望可選的異步通知事件,主機(jī)應(yīng)該下發(fā)Set Feature命令指定此事件使能。如果主機(jī)需要異步通知事件,主機(jī)應(yīng)該提交一個恰當(dāng)?shù)腁synchronous Event Request命令數(shù)。這一步驟可以在controller就緒之后(即,CSTS.RDY為1)的任意點都可以做。
建立關(guān)聯(lián)之后如果第4步(設(shè)置CC.EN為1)在2分鐘之內(nèi)未完成,那么關(guān)聯(lián)關(guān)系可能被拆掉。
4.5 關(guān)閉
關(guān)閉controller,主機(jī)應(yīng)該用Property Set命令設(shè)置Shutdown Notification(CC.SHN)字段為01b來表明是一個正常的關(guān)閉操作。在主機(jī)指定關(guān)閉之后,主機(jī)要么在NVMe Transport級別斷開連接要么可以選擇對CSTS.SHST進(jìn)行輪詢來判斷關(guān)閉何時完成(controller不應(yīng)該在NVMe Transport級別發(fā)起一個斷開連接)。不論主機(jī)是否中止關(guān)閉之前的未處理的命令都是一種可選的實現(xiàn)。
CC.EN字段不是用于關(guān)閉controller的(它是用于Controller Reset)。作為關(guān)閉的一部分,CC.EN字段會被清零。關(guān)閉之后如下會被發(fā)起:
- 關(guān)閉之后CC.EN字段被清零;
- 關(guān)閉之后CSTS.RDY字段被清零,
只有Fabrics命令可以被controller處理,Keep Alive定時器(如果支持的話)被禁用。
CC.EN轉(zhuǎn)換成0之后(由于關(guān)閉或重置),主機(jī)和controller之間的關(guān)聯(lián)必須被保持至少2分鐘。超過這個時間之后,如果controller沒有被重新使能關(guān)聯(lián)可以被拆除。
總結(jié)
以上是生活随笔為你收集整理的《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(4)-- Controller Architecture的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 营养探秘:被低估的藻类食物你了解吗?
- 下一篇: 一条简单的 SQL 查询语句到底经历了什