1. 程式人生 > 其它 >NVME學習筆記六—Controller Architecture

NVME學習筆記六—Controller Architecture

 Controller架構

  NVMe over Fabrics使用與NVMe基礎規格說明書中定義相同的controller架構。這包括主機和controller之間使用SQ提交佇列和CQ完成佇列來執行命令。

1、 Identify Controller資料結構增強

  這一章節定義NVMe over Fabrics專用的Identify Controller欄位。

            

2、Controller模型

  NVM subsystem可以支援動態的或靜態的controller模型。同一個NVM subsystem中所有controller必須遵循相同的controller模型。Discovery Controller必須支援動態的controller模型。

  在動態的controller模型中,controller是NVM subsystem按需分配的。這種模型,所有的為特定主機分配的controller在建立關聯的時候都具有相同的狀態,包括掛載的namespace和功能特性設定。對於建立關聯之後的controller發生改變不能影響其他動態的controller。NVM subsystem使用動態controller模型的情況下,當主機使用Fabrics Connect命令建立關聯時主機必須指定Controller ID為0xFFFF

  在靜態的controller模型中,與特定主機建立關聯時分配的controller,它們可能處於不同狀態。NVM subsystem中的controller們通過Controller ID來辨別。【The state that persists across associations is any state that persists across a Controller Level Reset. 】。對於一個靜態的controller模型,不同的controller可能對同一主機呈現不同的功能特性設定或namespace掛載。NVM subsystem可以分為具體的主機配特定的controller。

  為主機們靜態的controller分配期望它持久(以便主機能夠期望反覆多次的(例如主機重啟之後)通過關聯連線到同一個controller),但在controller沒有被使用的任意時刻,為了執行某些特定原因(例如:controller資源回收,subsystem重新配置),NVM subsystem可以刪除controller的主機配置。

 返回的Discovery Log Entries中有controller ID值,指出這個NVM subsystem是支援動態的還是靜態的controller模型。0xFFFF表示的controller ID值是一個特殊值,用於支援動態的controller模型的NVM subsystem來表明可能返回任意可用的controller。0xFFFE也是一個特殊的controller ID值,用於支援靜態的controller模型的NVM subsystem來表明可能返回任意可用的controller。如果Discovery Log entries使用Controller ID值為0xFFFF那麼這個NVM subsystem支援動態的controller模型。如果Discovery Log entries使用Controller ID值小於0xFFFF那麼這個NVM subsystem支援靜態的controller模型。Identify Controller資料結構也標示這個NVM subsystem是動態的還是靜態的。

  如果一個NVM subsystem是動態的,對於這個NVM subsystem,那麼可能Discovery Log中許多Discovery Log Page entries(參考Figure 34)的Controller ID設定為0xFFFF被返回(例如,表示多個NVM subsystem埠)。如果NVM subsystem是靜態的,那麼Discovery Log中多個Discovery Log Page entries設定不同的Controller ID值被返回。如果一個靜態的NVM subsystem的包含Controller ID為0xFFFE值的Discovery Log entries任何條目,主機都應該記下從Fabrics Connect命令返回的Controller ID,並且將來與此controller關聯時再使用這個分配的Controller ID。

3、 佇列初始化和佇列狀態

  當一個Connect命令成功完成,相應的Admin提交佇列和Admin完成佇列或者I/O提交佇列和I/O完成佇列就被建立了。如果主機發送一個Connect命令指定了佇列的佇列ID並且這個佇列ID已經存在,那麼返回Command Sequence Error狀態值。

  Connect應答中的Authentication Requirement(AUTHREQ)欄位指示是否要求帶內認證。如果AUTHREQ欄位為0,剛建立的這個佇列在Connect命令成功完成之後就準備好可以被使用了。如果AUTHREQ欄位設定的非0值,建立的這個佇列需要利用Authentication Send和Authentication Receive命令在NVMe帶內認證被成功地執行之後才可以使用。

  如果controller要求或正在進行NVMe帶內認證,controller應該中止除了認證命令之外的所有其他命令,狀態為Authentication Required。NVMe帶內認證成功執行之後,controller應該中止所有的認證命令,狀態為Command Sequence Error。

  Admin佇列是第一個被建立的,關聯的controller是禁用狀態(即,CC.EN初始為0)。禁用的controller必須中止除了Admin佇列上Fabrics命令之外的所有命令,狀態為Command Sequence Error。controller被使能之後,它應該接收除了Fabrics命令之外的所有支援的Admin命令。

  如果關聯的controller被禁用,建立好的I/O佇列必須中止所有命令,狀態為Command Sequence Error。

4、 初始化

  主機選擇一個NVM subsystem來建立主機到controller的關聯。主機首先與這個NVM subsystem建立一個NVMe Transport連線。然後主機與controller形成關聯並用Fabrics Connect命令建立Admin佇列。最後,主機配置controller並建立I/O佇列。Figure 29是一個梯形圖,描述了一個Admin佇列或一個I/O佇列的佇列建立過程。

                

  如下描述了建立關聯之後controller初始化的步驟。對於測定功能能力或配置properties,主機分別使用Property Get和Property Set命令。

1、根據要求執行NVMe帶內認證(參考第6.2章節);

2、主機測定controller功能能力;

3、主機配置controller的設定。具體的設定包括:

  a、在CC.AMS中選擇仲裁機制;

  b、在CC.MPS中初始化記憶體頁大小;

  c、在CC.CSS中選擇將被使用的I/O命令集。

4、通過設定CC.EN為1使能controller;

5、主機需要等待controller直到表明準備好處理命令,當CSTS.RDY為1表明controller準備好可以處理命令了;

6、主機應該通過傳送Identify命令來確定controller的配置,具體說明Controller資料結構。然後主機應該通過對每一個namespace傳送Identify命令來確定每一個namespace的配置,  具體說明Namespace資料結構;

7、主機應該使用Set Feature命令帶著佇列特性標識數來確定支援的I/O提交佇列和I/O完成佇列數量。

8、如果主機期望可選的非同步通知事件,主機應該下發Set Feature命令指定此事件使能。如果主機需要非同步通知事件,主機應該提交一個恰當的Asynchronous Event Request命令數。這一步驟可以在controller就緒之後(即,CSTS.RDY為1)的任意點都可以做。

  建立關聯之後如果第4步(設定CC.EN為1)在2分鐘之內未完成,那麼關聯關係可能被拆掉。

5、 關閉

  關閉controller,主機應該用Property Set命令設定Shutdown Notification(CC.SHN)欄位為01b來表明是一個正常的關閉操作。在主機指定關閉之後,主機要麼在NVMe Transport級別斷開連線要麼可以選擇對CSTS.SHST進行輪詢來判斷關閉何時完成(controller不應該在NVMe Transport級別發起一個斷開連線)。不論主機是否中止關閉之前的未處理的命令都是一種可選的實現。

  CC.EN欄位不是用於關閉controller的(它是用於Controller Reset)。作為關閉的一部分,CC.EN欄位會被清零。關閉之後如下會被髮起:

  • 關閉之後CC.EN欄位被清零;
  • 關閉之後CSTS.RDY欄位被清零,

  只有Fabrics命令可以被controller處理,Keep Alive定時器(如果支援的話)被禁用。

  CC.EN轉換成0之後(由於關閉或重置),主機和controller之間的關聯必須被保持至少2分鐘。超過這個時間之後,如果controller沒有被重新使能關聯可以被拆除。