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