(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2022076620
(43)【公開日】2022-05-20
(54)【発明の名称】メモリシステムおよび制御方法
(51)【国際特許分類】
G06F 3/06 20060101AFI20220513BHJP
G06F 12/00 20060101ALI20220513BHJP
G06F 13/16 20060101ALI20220513BHJP
G06F 3/08 20060101ALI20220513BHJP
G06F 13/38 20060101ALI20220513BHJP
G06F 13/10 20060101ALI20220513BHJP
G06F 13/12 20060101ALI20220513BHJP
【FI】
G06F3/06 301F
G06F12/00 597U
G06F13/16 520B
G06F12/00 571A
G06F3/08 H
G06F13/38 350
G06F13/10 340A
G06F13/12 340B
G06F13/38 310A
【審査請求】未請求
【請求項の数】12
【出願形態】OL
(21)【出願番号】P 2020187076
(22)【出願日】2020-11-10
(71)【出願人】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110001737
【氏名又は名称】特許業務法人スズエ国際特許事務所
(72)【発明者】
【氏名】渡邊 秀一
【テーマコード(参考)】
5B077
5B160
【Fターム(参考)】
5B077DD21
5B077NN02
5B160CD01
(57)【要約】
【課題】ホストからのコマンドの処理をスムーズに実行することができるメモリシステムを実現する。
【解決手段】メモリシステムのコントローラは、ホストとの通信をNVM express規格に準拠して実行する。メモリシステムのコントローラは、第1のサブミッションキューからコマンドをフェッチすべき場合、第1のコンプリーションキューに含まれる複数のスロットのうちのフリースロットの数を上限として、フェッチすべきコマンドの個数を決定する。コントローラは、決定された個数のコマンドを、第1のサブミッションキューからフェッチする。
【選択図】
図1
【特許請求の範囲】
【請求項1】
不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記不揮発性メモリを制御するように構成され、ホストとの通信をNVM express規格に準拠して実行するように構成されたコントローラとを具備し、
前記コントローラは、
第1のサブミッションキューからコマンドをフェッチすべき場合、前記第1のサブミッションキューに関連付けられた第1のコンプリーションキューに含まれる複数のスロットのうちのフリースロットの数を上限として、フェッチすべきコマンドの個数を決定し、
前記決定された個数のコマンドを、前記第1のサブミッションキューからフェッチするように構成されている、メモリシステム。
【請求項2】
前記第1のコンプリーションキューに含まれる前記複数のスロットのうちの前記フリースロットの数は、(1)前記第1のサブミッションキューから既にフェッチされ、かつ、コマンド完了が前記第1のコンプリーションキューに格納されていないコマンドの個数と同数のコマンド完了が、前記第1のコンプリーションキューに格納された場合における前記第1のコンプリーションキューの次のフリースロットを示す第1のポインタと、(2)前記ホストによって処理されるべき次のコマンド完了を格納している前記第1のコンプリーションキュー内のスロットを示す第1のコンプリーションキューヘッドポインタと、(3)前記第1のコンプリーションキューに含まれる前記複数のスロットの数と、に基づいて得られる請求項1に記載のメモリシステム。
【請求項3】
前記第1のコンプリーションキューに含まれる前記複数のスロットのうちの前記フリースロットの数は、前記第1のコンプリーションキューに含まれる前記複数のスロットの数よりも1だけ少ない値から、前記第1のポインタの値と前記第1のコンプリーションキューヘッドポインタの値との間の差分を減算することによって得られる請求項2に記載のメモリシステム。
【請求項4】
前記コントローラは、
前記第1のサブミッションキューからコマンドをフェッチすべき場合、(1)前記第1のサブミッションキューから既にフェッチされ、かつ、コマンド完了が前記第1のコンプリーションキューに格納されていないコマンドの個数と同数のコマンド完了が、前記第1のコンプリーションキューに格納された場合における前記第1のコンプリーションキューの次のフリースロットを示す第1のポインタと、(2)前記ホストによって処理されるべき次のコマンド完了を格納している前記第1のコンプリーションキュー内のスロットを示す第1のコンプリーションキューヘッドポインタと、(3)前記第1のコンプリーションキューに含まれる前記複数のスロットの数と、に基づいて、前記第1のコンプリーションキューに含まれる前記複数のスロットのうちの前記フリースロットの数を算出し、
前記算出したフリースロットの数を上限として、前記フェッチすべきコマンドの個数を決定するように構成されている請求項1に記載のメモリシステム。
【請求項5】
前記コントローラは、前記第1のコンプリーションキューに含まれる前記複数のスロットの数よりも1だけ少ない値から、前記第1のポインタの値と前記第1のコンプリーションキューヘッドポインタの値との間の差分を減算することによって、前記第1のコンプリーションキューに含まれる前記複数のスロットのうちの前記フリースロットの数を算出するように構成されている請求項4に記載のメモリシステム。
【請求項6】
前記コントローラは、
前記第1のコンプリーションキューと同じサイズを有し、前記第1のコンプリーションキューの将来の状態を表す仮想的なコンプリーションキューであるシャドウコンプリーションキューを使用して、前記第1のポインタを管理し、前記第1のポインタは前記シャドウコンプリーションキュー内の次のフリースロットを示し、
前記決定された個数のコマンドをフェッチする場合に、前記決定されたコマンドの個数と同数の前記シャドウコンプリーションキュー内のスロットが、前記決定されたコマンドの個数と同数のコマンド完了の格納のために予約されるように、前記決定されたコマンドの個数だけ前記第1のポインタをインクリメントし、
前記第1のコンプリーションキューヘッドポインタの値が前記ホストによって更新された場合、前記第1のコンプリーションキューヘッドポインタの更新前の値によって示される前記シャドウコンプリーションキュー内のスロットを解放し、
前記第1のポインタと、前記第1のコンプリーションキューヘッドポインタと、前記シャドウコンプリーションキューのサイズとに基づいて得られる前記シャドウコンプリーションキュー内のフリースロットの数を、前記第1のコンプリーションキューに含まれる前記複数のスロットのうちの前記フリースロットの数として算出するように構成されている請求項4に記載のメモリシステム。
【請求項7】
前記コントローラは、
前記第1のサブミッションキューとは異なる第2のサブミッションキューからコマンドをフェッチすべき場合、前記第2のサブミッションキューに関連付けられた第2のコンプリーションキューに含まれる複数のスロットのうちのフリースロットの数を上限として、フェッチすべきコマンドの個数を決定し、
前記決定された個数のコマンドを、前記第2のサブミッションキューからフェッチするようにさらに構成されている請求項1に記載のメモリシステム。
【請求項8】
前記第2のコンプリーションキューに含まれる前記複数のスロットのうちの前記フリースロットの数は、(1)前記第2のサブミッションキューから既にフェッチされ、かつ、コマンド完了が前記第2のコンプリーションキューに格納されていないコマンドの個数と同数のコマンド完了が、前記第2のコンプリーションキューに格納された場合における前記第2のコンプリーションキューの次のフリースロットを示す第2のポインタと、(2)前記ホストによって処理されるべき次のコマンド完了を格納している前記第2のコンプリーションキュー内のスロットを示す第2のコンプリーションキューヘッドポインタと、(3)前記第2のコンプリーションキューに含まれる前記複数のスロットの数、とに基づいて得られる請求項7に記載のメモリシステム。
【請求項9】
前記第2のコンプリーションキューに含まれる前記複数のスロットのうちの前記フリースロットの数は、前記第2のコンプリーションキューに含まれる前記複数のスロットの数よりも1だけ少ない値から、前記第2のポインタの値と前記第2のコンプリーションキューヘッドポインタの値との間の差分を減算することによって得られる請求項8に記載のメモリシステム。
【請求項10】
前記コントローラは、
前記第1のコンプリーションキューに一つ以上のフリースロットが存在している間は、前記第1のサブミッションキューからコマンドをフェッチすべき場合に、最大で前記第1のコンプリーションキューの前記フリースロットの数と同数のコマンドを前記第1のコンプリーションキューからフェッチし、
前記第1のコンプリーションキューにフリースロットが存在しない場合は、前記第1のサブミッションキューからコマンドをフェッチしないように構成されている請求項1に記載のメモリシステム。
【請求項11】
NVM express規格に準拠したホストとの通信を制御する方法であって、
第1のサブミッションキューからコマンドをフェッチすべき場合、前記第1のサブミッションキューに関連付けられた第1のコンプリーションキューに含まれる複数のスロットのうちのフリースロットの数を上限として、フェッチすべきコマンドの個数を決定することと、
前記決定された個数のコマンドを、前記第1のサブミッションキューからフェッチすることとを具備する制御方法。
【請求項12】
前記第1のコンプリーションキューに含まれる前記複数のスロットのうちの前記フリースロットの数は、(1)前記第1のサブミッションキューから既にフェッチされ、かつ、コマンド完了が前記第1のコンプリーションキューに格納されていないコマンドの個数と同数のコマンド完了が、前記第1のコンプリーションキューに格納された場合における前記第1のコンプリーションキューの次のフリースロットを示す第1のポインタと、(2)前記ホストによって処理されるべき次のコマンド完了を格納している前記第1のコンプリーションキュー内のスロットを示す第1のコンプリーションキューヘッドポインタと、(3)前記第1のコンプリーションキューに含まれる前記複数のスロットの数と、に基づいて得られる請求項11に記載の制御方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、不揮発性メモリを制御する技術に関する。
【背景技術】
【0002】
近年、不揮発性メモリを備えるメモリシステムが広く普及している。このようなメモリシステムの一つとして、NAND型フラッシュメモリを備えるソリッドステートドライブ(SSD)が知られている。
【0003】
SSDのようなメモリシステムとホストとの間の通信のための論理的なインタフェース用の規格としては、NVM ExpressTM(NVMeTM)が知られている。NVMe規格のインタフェースにおいては、ホストは、各コマンドをホスト内の任意のサブミッションキューに格納する。NVMe規格のインタフェースにおいては、メモリシステムに含まれるコントローラは、完了したコマンドのステータスをホスト内のコンプリーションキューに格納する。
【0004】
このようなメモリシステムにおいては、コンプリーションキュー内のコマンド完了に対するホストによる処理の遅滞によってコンプリーションキューがフルになると、次のコマンド完了がコンプリーションキューに格納できなくなる。この結果、コンプリーションキューに格納されるべき幾つかのコマンド完了がコントローラ内に滞留する場合がある。このようなコマンド完了の滞留は、コントローラによるコマンドの処理が停止される要因となり得る。
【0005】
したがって、メモリシステムにおいては、ホストからのコマンドの処理をスムーズに実行するための新たな機能の実現が要求されている。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2020-091554号公報
【特許文献2】米国特許出願公開第2020/0225879号明細書
【特許文献3】米国特許第10,235,102号明細書
【発明の概要】
【発明が解決しようとする課題】
【0007】
本発明の一実施形態が解決しようとする課題は、ホストからのコマンドの処理をスムーズに実行することができるメモリシステムおよび制御方法を提供することである。
【課題を解決するための手段】
【0008】
実施形態によれば、メモリシステムは、不揮発性メモリと、不揮発性メモリに電気的に接続され、不揮発性メモリを制御するように構成され、ホストとの通信をNVM express規格に準拠して実行するように構成されたコントローラとを具備する。コントローラは、第1のサブミッションキューからコマンドをフェッチすべき場合、第1のサブミッションキューに関連付けられた第1のコンプリーションキューに含まれる複数のスロットのうちのフリースロットの数を上限として、フェッチすべきコマンドの個数を決定する。コントローラは、決定された個数のコマンドを、第1のサブミッションキューからフェッチする。
【図面の簡単な説明】
【0009】
【
図1】実施形態に係るメモリシステムを含む情報処理システムの構成例を示すブロック図。
【
図2】実施形態に係るメモリシステムが接続されるホストのメモリ内に割り当てられたキューがエンプティである場合におけるヘッドポインタとテールポインタとの関係を示す図。
【
図3】キューのスロット#3~#5に新たな三つのキューエントリが格納された場合のテールポインタの更新動作を示す図。
【
図4】キューのスロット#3内に格納されているコマンドまたはコマンド完了が消費された場合のヘッドポインタの更新動作を示す図。
【
図5】キューがフルである場合におけるヘッドポインタとテールポインタとの関係を示す図。
【
図7A】比較例に係るコマンド処理の一つ目の処理を示す図。
【
図7B】比較例に係るコマンド処理の二つ目の処理を示す図。
【
図7C】比較例に係るコマンド処理の三つ目の処理を示す図。
【
図7D】比較例に係るコマンド処理の四つ目の処理を示す図。
【
図7E】比較例に係るコマンド処理の五つ目の処理を示す図。
【
図7F】比較例に係るコマンド処理の六つ目の処理を示す図。
【
図7G】比較例に係るコマンド処理の七つ目の処理を示す図。
【
図8】実施形態に係るメモリシステムにおいて実行されるコマンド処理の手順を示す図。
【
図9A】実施形態に係るメモリシステムにおいて実行されるコマンド処理の一つ目の処理を示す図。
【
図9B】実施形態に係るメモリシステムにおいて実行されるコマンド処理の二つ目の処理を示す図。
【
図9C】実施形態に係るメモリシステムにおいて実行されるコマンド処理の三つ目の処理を示す図。
【
図9D】実施形態に係るメモリシステムにおいて実行されるコマンド処理の四つ目の処理を示す図。
【
図9E】実施形態に係るメモリシステムにおいて実行されるコマンド処理の五つ目の処理を示す図。
【
図9F】実施形態に係るメモリシステムにおいて実行されるコマンド処理の六つ目の処理を示す図。
【
図9G】実施形態に係るメモリシステムにおいて実行されるコマンド処理の七つ目の処理を示す図。
【
図9H】実施形態に係るメモリシステムにおいて実行されるコマンド処理の八つ目の処理を示す図。
【
図10】実施形態に係るメモリシステムにおいて実行される、二つのSQ/CQペアに対するコマンド処理を示す図。
【
図11】実施形態に係るメモリシステムにおいて実行されるコマンド処理の手順を示すフローチャート。
【発明を実施するための形態】
【0010】
以下、図面を参照して、実施形態を説明する。
図1は、実施形態に係るメモリシステムを含む情報処理システム1の構成例を示すブロック図である。情報処理システム1は、ホスト(ホストデバイス)2と、SSD3とを含む。
【0011】
メモリシステムは、不揮発性メモリにデータを書き込み、不揮発性メモリからデータを読み出すように構成された半導体ストレージデバイスである。メモリシステムは、例えば、NAND型フラッシュメモリ5を含むSSD3として実現され得る。
【0012】
SSD3は、ホスト2にケーブルまたはネットワークを介して接続されてもよい。あるいは、SSD3は、ホスト2に内蔵されてもよい。ホスト2とSSD3とを接続するための論理インタフェースの規格としては、NVMe規格が使用され得る。NVMe規格のインタフェースでは、少なくとも一つのサブミッションキュー(SQ)とこの少なくとも一つのサブミッションキュー(SQ)に関連付けられたコンプリーションキュー(CQ)とを含む対のキューを用いて、ホスト2とSSD3との間の通信が行われる。この対のキューは、サブミッション/コンプリーションキューペア(SQ/CQペア)と称される。
【0013】
ホスト2は、SSD3を制御するように構成された情報処理装置である。ホスト2の例には、パーソナルコンピュータ、サーバコンピュータ、携帯端末、車載機器、が含まれる。
【0014】
ホスト2は、プロセッサ101と、メモリ102を含む。メモリ102は、ホスト2に設けられたメインメモリである。メモリ102は、例えば、DRAMのようなランダムアクセスメモリによって実現される。メモリ102の記憶領域の一部は、一つ以上のSQ/CQペアを格納するために使用される。
図1においては、メモリ102の記憶領域の一部に複数のSQ/CQペアが格納されている場合が例示されている。
【0015】
あるSQ/CQペアは、一つのサブミッションキュー(SQ)と一つのコンプリーションキュー(CQ)のみを含んでいてもよい。この場合、サブミッションキュー(SQ)とコンプリーションキュー(CQ)とは、一対一でマッピングされる。別のSQ/CQペアは、n個(n≧2)のサブミッションキュー(SQ)と一つのコンプリーションキュー(CQ)とを含んでいてもよい。この場合、これらサブミッションキュー(SQ)が同じコンプリーションキュー(CQ)にn対1でマッピングされる。すなわち、SQ/CQペアの各々は、一つのコンプリーションキュー(CQ)と、少なくとも一つのサブミッションキュー(SQ)とを含む
NVMe規格のインタフェースでは、少なくとも一つのSQ/CQペアを使用して、ホスト2からSSD3への各コマンドの発行、およびSSD3からホスト2への各コマンド完了の通知が行われる。
【0016】
この場合、各コマンドは、ホスト2によってホスト2内の一つ以上のサブミッションキュー(SQ)のうちの任意のサブミッションキュー(SQ)に格納される。完了したコマンドのステータスを示すコマンド完了(「コマンド完了応答」、「完了」、「コマンド完了ステータス」とも称される)は、このコマンドの発行に使用されたサブミッションキュー(SQ)に関連付けられているコンプリーションキュー(CQ)に、SSD3のコントローラ4によって格納される。
【0017】
SSD3は、少なくとも一つのサブミッションキュー(SQ)とこの少なくとも一つのサブミッションキュー(SQ)に関連付けられたコンプリーションキュー(CQ)とを含むホスト2との通信を、NVMe規格に準拠して実行するように構成されている。
【0018】
このNVMe規格のインタフェースには、PCI expressTM(PCIeTM)バスを経由したインタフェース(NVMe over PCIe)と、イーサネットTMのようなネットワークを経由したインタフェース(NVMe over Fabrics:NVMe-OF)とが含まれる。SSD3が準拠するインタフェース規格は、NVMe over PCIeであってもよいし、NVMe-OFであってもよい。
【0019】
SSD3は、コントローラ4と、不揮発性メモリ(例えば、NAND型フラッシュメモリ5)とを備える。SSD3は、ランダムアクセスメモリ、例えば、DRAM6も備えていてもよい。
【0020】
NAND型フラッシュメモリ5は、マトリクス状に配置された複数のメモリセルを含むメモリセルアレイを含む。NAND型フラッシュメモリ5は、2次元構造のフラッシュメモリであってもよいし、3次元構造のフラッシュメモリであってもよい。
【0021】
NAND型フラッシュメモリ5のメモリセルアレイは、複数のブロックBLK0~BLKx-1を含む。ブロックBLK0~BLKx-1の各々は、複数のページ(ここではページP0~Py-1)を含む。各ページは、同一ワード線に接続された複数のメモリセルを含む。ブロックBLK0~BLKx-1の各々は、データを消去するデータ消去動作の単位である。ページP0~Py-1の各々は、データ書き込み動作およびデータ読み出し動作の単位である。
【0022】
コントローラ4は、NAND型フラッシュメモリ5を制御することによって、ホスト2から受信したデータをNAND型フラッシュメモリ5に書き込むデータ書き込み動作と、ホスト2へ送信するデータをNAND型フラッシュメモリ5から読み出すデータ読み出し動作とを制御する。
【0023】
コントローラ4は、System-on-a-chip(SoC)のような回路によって実現されてもよい。コントローラ4は、これに限定されないが、Toggle NANDフラッシュインタフェースまたはオープンNANDフラッシュインタフェース(ONFI)に準拠するNANDインタフェース13を介して、NAND型フラッシュメモリ5に電気的に接続されている。コントローラ4は、NAND型フラッシュメモリ5を制御するように構成されたメモリコントローラとして動作する。
【0024】
コントローラ4は、上述したNANDインタフェース13の他、ホストインタフェース11と、CPU12と、DRAMインタフェース14と、直接メモリアクセスコントローラ(DMAC)15と、スタティックRAM(SRAM)16と、ECCエンコード/デコード部17とを含む。これらホストインタフェース11と、CPU12と、NANDインタフェース13と、DRAMインタフェース14と、DMAC15と、SRAM16と、ECCエンコード/デコード部17とは、バス10を介して相互接続される。
【0025】
ホストインタフェース11は、ホスト2との通信を実行するように構成されたホストインタフェース回路である。ホストインタフェース11は、例えば、PCIeコントローラである。あるいは、SSD3がネットワークインタフェースコントローラを内蔵する構成である場合には、ホストインタフェース11は、ネットワークインタフェースコントローラの一部として実現されてもよい。
【0026】
ホストインタフェース11は、NVMe規格に準拠してホスト2との通信を実行する。ホストインタフェース11は、アービトレーション機構を含む。このアービトレーション機構は、コマンドがフェッチされるべきサブミッションキューを、ホスト2のメモリ102上に存在する複数のサブミッションキューから選択するための機構である。アービトレーション機構は、ラウンドロビンアービトレーション機構であってもよいし、重み付きラウンドロビンアービトレーション機構であってもよい。そして、ホストインタフェース11は、CPU12の制御の下、アービトレーション機構によって選択されたサブミッションキューから一つ以上のコマンドをフェッチする。
【0027】
ホストインタフェース11は、サブミッションキュー(SQ)毎に、サブミッションキューテールポインタ(SQTP)とサブミッションキューヘッドポインタ(SQHP)とを管理する。さらに、ホストインタフェース11は、コンプリーションキュー(CQ)毎に、コンプリーションキューテールポインタ(CQTP)とコンプリーションキューヘッドポインタ(CQHP)とを管理する。
【0028】
サブミッションキュー(SQ)およびコンプリーションキュー(CQ)の各々は循環バッファとして実現され得る。サブミッションキュー(SQ)およびコンプリーションキュー(CQ)の各々は、複数のスロットを含む。複数のスロットの各々は、一つのキューエントリ(一つのコマンドまたは一つのコマンド完了)を格納するために使用される。
【0029】
サブミッションキュー(SQ)の状態は、このサブミッションキュー(SQ)に対応するサブミッションキューテールポインタ(SQTP)と、このサブミッションキュー(SQ)に対応するサブミッションキューヘッドポインタ(SQHP)とを使用して管理される。同様に、コンプリーションキュー(CQ)の状態は、このコンプリーションキュー(CQ)に対応するコンプリーションキューテールポインタ(CQTP)と、このコンプリーションキュー(CQ)に対応するコンプリーションキューヘッドポインタ(CQHP)とを使用して管理される。
【0030】
サブミッションキューテールポインタ(SQTP)は、ホスト2がコマンドをサブミッションキュー(SQ)に格納する時にホスト2によって更新されるポインタである。サブミッションキューテールポインタ(SQTP)は、サブミッションキュー(SQ)内の次のフリースロットを示す。サブミッションキューテールポインタ(SQTP)が示すフリースロットは、新たなサブミッションキューエントリ、つまり新たなコマンドの格納に使用可能なスロット、を意味する。サブミッションキュー(SQ)内の次のフリースロットは、次のフリーSQスロットとも称される。ホスト2は、サブミッションキューテールポインタ(SQTP)によって示される次のフリーSQスロットに新たなコマンドを格納する。
【0031】
サブミッションキューテールポインタ(SQTP)は、ホストインタフェース11内のサブミッションキューテールドアベルレジスタに格納されている。ホスト2は、あるサブミッションキュー(SQ)に新たな一つ以上のコマンドを格納すると、このサブミッションキュー(SQ)に対応するサブミッションキューテールドアベルレジスタにサブミッションキューテールポインタ(SQTP)の新たな値を書き込み、これによってサブミッションキュー(SQ)に新たなコマンドが格納されたことをSSD3に通知する。サブミッションキューテールポインタ(SQTP)の新たな値とこのサブミッションキューテールポインタ(SQTP)の以前の値との間の差分は、このサブミッションキュー(SQ)にホスト2によって格納された新たなコマンドの個数を示す。
【0032】
サブミッションキューヘッドポインタ(SQHP)は、コントローラ4がコマンドをフェッチする時にコントローラ4によって更新されるポインタである。サブミッションキューヘッドポインタ(SQHP)は、フェッチされるべき次のコマンドを格納している、サブミッションキュー(SQ)内のスロットを示す。コントローラ4は、サブミッションキューヘッドポインタ(SQHP)の値に基づいて、サブミッションキュー(SQ)から一つ以上の新たなコマンドをフェッチする。
【0033】
コントローラ4は、あるサブミッションキュー(SQ)から一つ以上の新たなコマンドをフェッチすると、これらコマンドがフェッチされたサブミッションキュー(SQ)内の各スロットを解放するためにサブミッションキューヘッドポインタ(SQHP)の値を更新する。解放された各スロットは、有効なコマンドが格納されていないスロットであるエンプティスロットになる。
【0034】
コンプリーションキューヘッドポインタ(CQHP)は、ホスト2がコマンド完了を処理する時にホスト2によって更新されるポインタである。コンプリーションキューヘッドポインタ(CQHP)は、処理されるべき次のコマンド完了を格納しているコンプリーションキュー(CQ)内のスロットを示す。コンプリーションキュー(CQ)内のスロットはCQスロットとも称される。ホスト2は、コンプリーションキューヘッドポインタ(CQHP)によって示されるCQスロットに格納されているコマンド完了を処理する。
【0035】
コンプリーションキューヘッドポインタ(CQHP)は、ホストインタフェース11内のコンプリーションキューヘッドドアベルレジスタに格納されている。ホスト2は、あるコンプリーションキュー(CQ)内の一つ以上のコマンド完了を処理すると、このコンプリーションキュー(CQ)に対応するコンプリーションキューヘッドドアベルレジスタにコンプリーションキューヘッドポインタ(CQHP)の新たな値を書き込み、これによって処理された一つ以上のコマンド完了が格納されている一つ以上のCQスロットの各々を解放する。解放された各スロットは、有効なコマンド完了が格納されていないスロットであるエンプティスロットになる。
【0036】
コンプリーションキューテールポインタ(CQTP)は、コントローラ4がコマンド完了をコンプリーションキュー(CQ)に格納する時にコントローラ4によって更新されるポインタである。コンプリーションキューテールポインタ(CQTP)は、コンプリーションキュー(CQ)内の次のフリースロット(次のフリーCQスロット)を示す。フリーCQスロットは、新たなコンプリーションキューエントリ、つまり新たなコマンド完了の格納のために使用可能なCQスロット、を意味する。コントローラ4は、コンプリーションキューテールポインタ(CQTP)に基づいて、コンプリーションキュー(CQ)に一つ以上の新たなコマンド完了を格納する。
【0037】
ホストインタフェース11は、SQ/CQペア毎に、つまりコンプリーションキュー(CQ)毎に、コンプリーションキューアローケートポインタ(CQAP)も管理する。あるコンプリーションキュー(CQ)に対応するコンプリーションキューアローケートポインタ(CQAP)は、このコンプリーションキュー(CQ)内のフリースロットの数を得るために使用されるポインタである。コンプリーションキューアローケートポインタ(CQAP)の詳細については、
図8を参照して後述する。
【0038】
NANDインタフェース13は、CPU12の制御の下、NAND型フラッシュメモリ5を制御するように構成されたNANDコントローラである。NAND型フラッシュメモリ5が複数のNAND型フラッシュメモリチップ(NAND型フラッシュメモリダイ)から構成されている場合、NANDインタフェース13は、複数のチャンネル(Ch)を介してこれらNAND型フラッシュメモリチップそれぞれと接続されていてもよい。
【0039】
DRAMインタフェース14は、CPU12の制御の下、DRAM6を制御するように構成されたDRAMコントローラである。
【0040】
DRAM6の記憶領域の一部は、L2Pテーブル31およびブロック管理テーブル32を記憶する領域として利用されてもよい。ブロック管理テーブル32は、NAND型フラッシュメモリ5に含まれる複数のブロックの各々の状態を示す情報を管理するために使用される。各ブロックの状態を示す情報には、例えば、各ブロックの消去回数を示す情報、各ブロックがアクティブブロックまたはフリーブロックのいずれであるかを示す情報、等が含まれる。
【0041】
内部バッファ161は、ホスト2から受信したコマンドおよびデータと、ホスト2に送信すべきコマンド完了およびデータとを一時的に記憶する記憶領域として使用される。内部バッファ161は、例えば、SRAM16の記憶領域内に割り当てられている。あるいは、内部バッファ161は、DRAM6の記憶領域内に割り当てられてもよい。
【0042】
DMAC15は、CPU12の制御の下、ホスト2のメモリ102と内部バッファ161との間のデータ転送を実行する。
【0043】
ECCエンコード/デコード部17は、NAND型フラッシュメモリ5にデータをライトすべき時、データ(書き込むべきデータ)をエンコードすることによってこのデータにエラー訂正コード(ECC)を冗長コードとして付加する。NAND型フラッシュメモリ5からデータがリードされた時、ECCエンコード/デコード部17は、リードされたデータに付加されたECCを使用して、このデータのエラー訂正を行う。
【0044】
CPU12は、ホストインタフェース11と、NANDインタフェース13と、DRAMインタフェース14と、DMAC15と、SRAM16と、ECCエンコード/デコード部17を制御するように構成されたプロセッサである。CPU12は、NAND型フラッシュメモリ5または図示しないROMに格納されている制御プログラム(ファームウェア)をDRAM6にロードし、そしてこのファームウェアを実行することによって様々な処理を行う。なお、ファームウェアはSRAM16上にロードされてもよい。
【0045】
CPU12は、NAND型フラッシュメモリ5内のデータの管理およびNAND型フラッシュメモリ5内のブロックの管理を実行するように構成されたフラッシュトランスレーション層(FTL)として機能し得る。FTLによって実行されるデータ管理には、論理アドレスそれぞれと物理アドレスそれぞれとの間のマッピングを示すマッピング情報の管理が含まれる。論理アドレスは、SSD3の論理アドレス空間内の位置を指すアドレスである。ある論理アドレスに対応する物理アドレスは、この論理アドレスに対応するデータが書き込まれたNAND型フラッシュメモリ5内の物理的な記憶位置を示す。論理アドレスとしては、一般に、LBA(logical block address)が使用され得る。CPU12は、論理物理アドレス変換テーブル(logical-to-physical address translation table:L2Pテーブル)31を使用して、論理アドレスそれぞれと物理アドレスそれぞれとの間のマッピングを管理する。
【0046】
CPU12は、フリーCQスロット数取得部21、コマンドフェッチ部22、およびコマンド処理部23として機能することができる。これらフリーCQスロット数取得部21、コマンドフェッチ部22、およびコマンド処理部23の各々の一部または全部は、コントローラ4内の専用ハードウェアによって実現されてもよい。例えば、コマンドフェッチ部22は、ホストインタフェース11によって実現されてもよい。
【0047】
コマンドがフェッチされるべきサブミッションキュー(SQ)がホストインタフェース11のアービトレーション機構によって選択された場合、フリーCQスロット数取得部21は、このサブミッションキュー(SQ)に関連付けられたコンプリーションキュー(CQ)に含まれる複数のスロットのうちのフリースロット(フリーCQスロット)の数、つまり新たなコマンド完了の格納のために利用可能なコンプリーションキュー(CQ)内のスロットの数を算出する。
【0048】
算出されたフリーCQスロットの数は、選択されたサブミッションキュー(SQ)から一度にフェッチ可能なコマンドの個数の上限を規定するために使用される。つまり、選択されたサブミッションキュー(SQ)から一度にフェッチ可能なコマンドの個数は、最大で、算出されたフリーCQスロットの数である。
【0049】
コマンドフェッチ部22は、算出されたフリーCQスロットの数を上限として、選択されたサブミッションキュー(SQ)からフェッチすべきコマンドの個数を決定する。換言すれば、コマンドフェッチ部22は、最大でフリーCQスロットの数と同数のコマンドを、選択されたサブミッションキュー(SQ)からフェッチする。
【0050】
例えば、算出されたフリーCQスロットの数が4である場合には、コマンドフェッチ部22は、最大で4個のコマンドを、選択されたサブミッションキュー(SQ)からフェッチすることが許可される。また、例えば、算出されたフリーCQスロットの数が1である場合には、コマンドフェッチ部22は、最大で1個のコマンドを、選択されたサブミッションキュー(SQ)からフェッチすることが許可される。また、例えば、算出されたフリーCQスロットの数が0である場合には、コマンドフェッチ部22は、選択されたサブミッションキュー(SQ)からコマンドをフェッチしない。
【0051】
ホスト2の理不尽な振る舞いおよび/またはホスト2の貧弱な性能によって、あるコンプリーションキュー(CQ)内のコマンド完了の処理が遅滞する場合がある。ホスト2の理不尽な振る舞いとは、ホスト2があるコンプリーションキュー(CQ)内のコマンド完了を長い間処理しないといった動作を意味する。ホスト2の貧弱な性能は、ホスト2の性能不足を意味する。あるコンプリーションキュー(CQ)内のコマンド完了の処理が遅滞すると、このコンプリーションキュー(CQ)がフルの状態が長い間維持されてしまう可能性がある。この場合、たとえこのSQ/CQペアのサブミッションキュー(SQ)から既にフェッチされているコマンドそれぞれの実行が完了しても、これらコマンドの各々に対応するコマンド完了はこのコンプリーションキュー(CQ)に格納できない。このため、これらコマンド完了は内部バッファ161内に滞留する。
【0052】
内部バッファ161がこれら滞留しているコマンド完了で占有されると、このSQ/CQペアのサブミッションキュー(SQ)から新たなコマンドをフェッチできなくなるばかりでなく、別のSQ/CQペアのサブミッションキュー(SQ)からも新たなコマンドをフェッチできなくなる。このような負の連鎖は、全てのSQ/CQペアに対するコマンド処理を停止させる要因となる。この結果、最悪の場合には、SSD3とホスト2とを含む情報処理システム1全体のハングアップ(またはストール)が引き起こされる可能性がある。
【0053】
本実施形態では、任意のサブミッションキュー(SQ)からコマンドをフェッチすべき時に、コントローラ4は、このサブミッションキュー(SQ)に関連付けられたコンプリーションキュー(CQ)に新たなコマンド完了を格納可能なスロットの数、つまりフリーCQスロットの数を算出する。そして、コントローラ4は、算出したフリーCQスロットの数以下の個数のコマンドを、このサブミッションキュー(SQ)からフェッチする。このように、本実施形態では、コンプリーションキュー(CQ)に一つ以上のフリーCQスロットが存在している間は、任意のサブミッションキュー(SQ)からコマンドをフェッチすべき場合に、コントローラ4は、最大でフリーCQスロットの個数と同数のコマンドをこのサブミッションキュー(SQ)からフェッチする。そして、コンプリーションキュー(CQ)にフリーCQスロットが存在しない場合には、コントローラ4は、サブミッションキュー(SQ)からコマンドをフェッチしない。
【0054】
したがって、例えば、ホスト2によるコマンド完了の処理の遅滞によってあるコンプリーションキュー(CQ)のフリーCQスロットの数が減少するに連れて、このコンプリーションキュー(CQ)に関連付けられたサブミッションキュー(SQ)からフェッチされるコマンドの数も自動的に減少される。よって、コンプリーションキュー(CQ)に一つ以上のフリーCQスロットが存在している間は、このコンプリーションキュー(CQ)に関連付けられた任意のサブミッションキュー(SQ)からフェッチされるコマンドの数を、このコンプリーションキュー(CQ)に格納されているコマンド完了の処理の進行度合いに基づいて、適応的に制御することが可能となる。
【0055】
この結果、どのコンプリーションキュー(CQ)がフルになった場合であっても、コマンド完了が内部バッファ161内に滞留してしまうことを防止することが可能となり、SSD3の信頼性、ひいては情報処理システム1全体の信頼性の向上を図ることができる。
【0056】
フリーCQスロットの数を算出する方法には、第1の算出方法と第2の算出方法とがある。第1の算出方法は、コンプリーションキュー(CQ)に実際に格納されているコンプリーションエントリ(コマンド完了)の数を考慮して、フリーCQスロットの数を算出する方法である。
【0057】
第1の算出方法を使用するケースにおいては、フリーCQスロット数取得部21は、コンプリーションキュー(CQ)のサイズと、コンプリーションキュー(CQ)に格納されているコマンド完了の数とに基づいて、コンプリーションキュー(CQ)のフリーCQスロットの数を算出することができる。
【0058】
コンプリーションキュー(CQ)のサイズは、コンプリーションキュー(CQ)に含まれるスロットの総数によって表され得る。コンプリーションキュー(CQ)に格納されているコマンド完了の数は、このコンプリーションキュー(CQ)に対応するCQTPとこのコンプリーションキュー(CQ)に対応するCQHPとの間の差分によって表される。
【0059】
ただし、第1の算出方法を使用するケースにおいては、算出されたフリーCQスロットの数と、利用可能な実際のフリーCQスロットの数と、が一致することを確実にするための対処が必要となる場合がある。
【0060】
この対処の一例としては、コマンド完了をコンプリーションキュー(CQ)に格納する処理と、コマンドをサブミッションキュー(SQ)からフェッチする処理とを、並列に実行するのではなく、これら処理を排他的に実行することが挙げられる。
【0061】
例えば、コントローラ4は、あるSQ/CQペアの任意のサブミッションキュー(SQ)から既にフェッチされたコマンドそれぞれに対応するコマンド完了の全てがこのSQ/CQペアのコンプリーションキュー(CQ)に格納されるまでは、このSQ/CQペアのサブミッションキューからの新たなコマンドのフェッチを開始しないようにしてもよい。
【0062】
第2の算出方法は、コマンド完了をコンプリーションキュー(CQ)に格納する処理とコマンドをサブミッションキュー(SQ)からフェッチする処理とを並列に実行することを許容可能な算出方法である。
【0063】
第2の算出方法は、あるサブミッションキュー(SQ)から既にフェッチされた全てのコマンドの個数、つまり、このサブミッションキュー(SQ)に関連付けられたコンプリーションキュー(CQ)に将来格納されることが確定されているコマンド完了の数を考慮して、このコンプリーションキュー(CQ)のフリーCQスロットの数を算出する方法である。
【0064】
例えば、あるSQ/CQペアのコンプリーションキュー(CQ)のフリーCQスロットを第2の算出方法を使用して算出するケースにおいては、フリーCQスロット数取得部21は、第1のポインタを使用して、このコンプリーションキュー(CQ)のフリーCQスロットの数を算出する。第1のポインタは、このSQ/CQペアの任意のサブミッションキュー(SQ)から既にフェッチされ、かつ、コマンド完了がこのSQ/CQペアのコンプリーションキュー(CQ)に格納されていないコマンドの個数と同数のコマンド完了が、このSQ/CQペアのコンプリーションキュー(CQ)に格納された場合におけるこのコンプリーションキュー(CQ)の次のフリースロットを示す。このSQ/CQペアのコンプリーションキュー(CQ)のCQAPの値が、第1のポインタとして使用され得る。
【0065】
例えば、あるSQ/CQペアのコンプリーションキュー(CQ)のフリーCQスロットを算出する場合には、フリーCQスロット数取得部21は、このコンプリーションキュー(CQ)のCQAPの値と、このコンプリーションキュー(CQ)のCQHPの値と、このコンプリーションキュー(CQ)のサイズとに基づいて、このコンプリーションキュー(CQ)のフリーCQスロットの数を算出する。
【0066】
第2の算出方法を使用した場合には、コンプリーションキュー(CQ)に将来格納されることが確定されているコマンド完了の数を考慮して、このコンプリーションキュー(CQ)のフリーCQスロットの数を得ることができる。
【0067】
したがって、算出されたフリーCQスロットの数が、利用可能な実際のフリーCQスロットの数を下回らないことを確実にすることができる。この結果、コマンド完了をコンプリーションキュー(CQ)に格納する処理と、コマンドをサブミッションキュー(SQ)からフェッチする処理とを、並列に実行することを許容することが可能となる。
【0068】
コマンド処理部23は、フェッチされたコマンドの各々を解釈および実行して、各コマンドによって要求された処理、例えば、NAND型フラッシュメモリ5にデータを書き込むデータ書き込み動作、NAND型フラッシュメモリ5からデータを読み出すデータ読み出し動作、を実行する。また、コマンド処理部23は、完了したコマンドのステータスを含むコマンド完了を生成する。ステータスは、コマンドの実行が成功したか失敗したかの情報を含む。そして、コマンド処理部23は、生成したコマンド完了を、このコマンドがフェッチされたサブミッションキュー(SQ)に関連付けられたコンプリーションキュー(CQ)に格納する。
【0069】
次に、ホスト2の構成例を説明する。
【0070】
プロセッサ101は、ホスト2内の各コンポーネントの動作を制御するように構成されたCPUである。プロセッサ101は、SSD3またはホスト2に接続される他のストレージデバイスからメモリ102にロードされる様々なソフトウェア(ホストソフトウェア)を実行する。ホストソフトウェアには、オペレーティングシステム、ファイルシステム、デバイスドライバ、アプリケーションプログラム等が含まれる。
【0071】
サブミッションキュー(SQ)は、SSD3にコマンドを発行するために使用されるキューである。コンプリーションキュー(CQ)は、完了したコマンドのステータスを示すコマンド完了をSSD3から受信するために使用されるキューである。
【0072】
ホスト2は、各SQ/CQペアに含まれるサブミッションキュー(SQ)を経由してSSD3に様々なコマンドを送信する。SSD3に送信されるコマンドの種類は、NVMe規格で規定されたNVMeコマンド(I/Oコマンド)と、NVMe規格で規定されたadministrativeコマンド(管理コマンド)とに大別される。
【0073】
I/Oコマンドには、ライトコマンド、リードコマンド等が含まれる。ライトコマンドは、SSD3に対してNAND型フラッシュメモリ5へデータを書き込むことを要求するコマンドである。リードコマンドは、SSD3に対してNAND型フラッシュメモリ5からデータを読み出すことを要求するコマンドである。
【0074】
administrativeコマンドには、SSD3の制御および管理のための様々なコマンドが含まれる。これらコマンドには、I/Oコンプリーションキュー・クリエイト・コマンド、I/Oサブミッションキュー・クリエイト・コマンドも含まれる。
【0075】
I/Oサブミッションキュー・クリエイト・コマンドは、I/Oサブミッションキューを作成するためのコマンドである。I/Oサブミッションキューは、SSD3にI/Oコマンドを発行するために使用されるサブミッションキューである。I/Oサブミッションキュー・クリエイト・コマンドは、作成すべきI/Oサブミッションキューの識別子、作成すべきI/Oサブミッションキューのサイズ、作成すべきI/Oサブミッションキューが関連付けられるべきI/Oコンプリーションキューの識別子、作成すべきI/Oサブミッションキューの優先度、および作成すべきI/Oサブミッションキューが割り当てられたホスト2のメモリ102上のメモリ領域、等を指定する。
【0076】
I/Oコンプリーションキュー・クリエイト・コマンドは、I/Oコンプリーションキューを作成するためのコマンドである。I/Oコンプリーションキューは、完了したI/Oコマンドのステータスを示すコマンド完了をSSD3から受信するために使用されるコンプリーションキューである。I/Oコンプリーションキュー・クリエイト・コマンドは、作成すべきI/Oコンプリーションキューの識別子、作成すべきI/Oコンプリーションキューのサイズ、作成すべきI/Oコンプリーションキューの優先度、および作成すべきI/Oコンプリーションキューが割り当てられたホスト2のメモリ102上のメモリ領域、等を指定する。
【0077】
I/OサブミッションキューおよびI/Oコンプリーションキューの各々の最大サイズは65,535スロットであり、I/OサブミッションキューおよびI/Oコンプリーションキューの各々の最小サイズは2スロットである。ホスト2は、作成すべきI/Oサブミッションキューまたは作成すべきI/Oコンプリーションキュー毎に、最小サイズから最大サイズまでの範囲内の任意のサイズを指定することができる。コントローラ4は、ホスト2によって指定された個々のI/Oサブミッションキューのサイズ、およびホスト2によって指定された個々のI/Oコンプリーションキューのサイズを管理する。
【0078】
以下では、各SQ/CQペアに含まれるサブミッションキューおよびコンプリーションキューがI/OサブミッションキューおよびI/Oコンプリーションキューである場合を想定する。ただし、本実施形態のコマンド処理は、I/OサブミッションキューおよびI/Oコンプリーションキューに適用されるだけでなく、administrativeサブミッションキュー、およびdministrativeコンプリーションキューにも適用できる。administrativeサブミッションキューは、SSD3に送信すべきadministrativeコマンドを格納するために使用される。administrativeコンプリーションキューは、administrativeコマンドに対応するコマンド完了を格納するために使用される。
【0079】
次に、
図2、
図3、
図4および
図5を参照して、キュー(サブミッションキューまたはコンプリーションキュー)の状態遷移について説明する。
【0080】
図2は、キュー(サブミッションキューまたはコンプリーションキュー)がエンプティである場合におけるヘッドポインタとテールポインタとの関係を示す。
【0081】
キューは、複数のスロットを含む。複数のスロットの各々は、一つのコマンドまたは一つのコマンド完了を格納可能である。コマンドまたはコマンド完了は、「キューエントリ」または「エントリ」とも称される。キューが割り当てられているメモリ102上の位置は、このキューに対応するキューベースアドレスによって示される。キューのサイズは、キューに含まれるスロットの総数で表され得る。ここでは、キューのサイズが8スロットである場合が例示されている。
【0082】
キューは、このキューに対応するヘッドポインタと、このキューに対応するテールポインタとを使用して管理される。テールポインタは、キュー内の次のフリースロットを示す。テールポインタは、キューにエントリ(コマンドまたはコマンド完了)を格納するプロデューサによって更新される。プロデューサは、テールポインタによって示される次のフリースロットにコマンドまたはコマンド完了を格納し、そしてテールポインタの値が1だけ増えるようにテールポインタをインクリメントする。インクリメントされたテールポインタの値がキューの最終スロット(ここでは、#7)を超えた場合、テールポインタはゼロに戻される。
【0083】
ヘッドポインタは、消費されるべき次のエントリ(次のコマンドまたは次のコマンド完了)を格納しているスロットを示す。ヘッドポインタは、キューからエントリ(コマンドまたはコマンド完了)を取得するコンシューマによって更新される。コンシューマは、ヘッドポインタによって示されるスロットからコマンドまたはコマンド完了を取得し、そして、ヘッドポインタの値が1だけ増えるようにヘッドポインタをインクリメントする。インクリメントされたヘッドポインタの値がキューの最終スロット(ここでは、#7)を超えた場合、ヘッドポインタはゼロに戻される。
【0084】
ここで、キューがエンプティであるとは、キュー内の全てのスロットがエンプティであることを意味する。また、スロットがエンプティであるとは、そのスロットに有効なキューエントリが格納されていないことを意味する。
【0085】
ヘッドポインタの値がテールポインタの値に等しい場合、キューはエンプティである。
図2では、ヘッドポインタおよびテールポインタの双方が同じスロット#3を示している場合が例示されている。
【0086】
図3は、キューのスロット#3~#5に三つのキューエントリ(三つのコマンドまたは三つのコマンド完了)が格納された場合のテールポインタの更新動作を示す。プロデューサは、スロット#3~#5に三つのコマンドまたは三つのコマンド完了を格納した場合、テールポインタの新しい値がスロット#6を示すようにテールポインタを更新(インクリメント)する。
【0087】
図4は、キューのスロット#3内に格納されている一つのコマンドまたは一つのコマンド完了が消費された場合のヘッドポインタの更新動作を示す。コンシューマがヘッドポインタの現在の値によって示されるスロット#3からコマンドまたはコマンド完了を取得した場合、コンシューマは、ヘッドポインタの新しい値がスロット#4を示すように、ヘッドポインタを更新(インクリメント)する。
【0088】
図5は、キューがフルである場合におけるヘッドポインタとテールポインタとの関係を示す。キューがフルである場合、追加のコマンドまたはコマンド完了をこのキューに格納することはできない。テールポインタの値がヘッドポインタの値よりも1小さい場合、キューはフルである。したがって、フル状態のキューに格納されているコマンドまたはコマンド完了の総数は、キューのサイズ(ここでは、8)よりも1小さい数(ここでは、7)と等しい。つまり、キューに含まれる八つのスロットのうちのいずれか一つのスロットは、常にエンプティに維持される。このように、NVMe規格においては、新たなコマンド(または新たなコマンド完了)の格納のために利用可能なスロットであるフリースロットの数は、キューに含まれるスロットの数よりも1少ない数と等しい。例えば、8個のスロットを含むキューがエンプティである場合、各々がエンプティであるこれら8個のスロットのうち、新たなコマンド(または新たなコマンド完了)の格納のために利用可能なスロット(フリースロット)の数は、7である。
【0089】
次に、本実施形態のコマンド処理について説明する。本実施形態のコマンド処理の説明に先立ち、まず、比較例に係るコマンド処理の手順を説明する。比較例に係るコマンド処理の手順は、関連付けられたコンプリーションキュー(CQ)の状態を考慮せずに、サブミッションキュー(SQ)から任意の数のコマンドをフェッチする。
【0090】
図6は、比較例に係るコマンド処理の手順を示す図である。
図6では、ホスト2によってコマンドが発行されてから、このコマンドに対応するコマンド完了がホスト2によって処理されるまでの手順が示されている。
【0091】
ステップ1: まず、ホスト2は、SSD3に送信すべき新たな一つ以上のコマンドをサブミッションキュー(SQ)の一つ以上のフリーSQスロットに格納する。これら一つ以上の新たなコマンドは、サブミッションキューテールポインタ(SQTP)の現在の値によって示されるスロットから始まる一つ以上のフリーSQスロットに格納される。サブミッションキュー(SQ)に格納される新たなコマンドは、ライトコマンドであってもよいし、リードコマンドであってもよいし、他のコマンドであってもよい。
図6では、サブミッションキュー(SQ)に格納されている各コマンドは「CMD」として表記されている。
【0092】
ステップ2: サブミッションキュー(SQ)に新たな一つ以上のコマンドが格納されたことをSSD3のコントローラ4に通知するために、ホスト2は、このサブミッションキュー(SQ)に対応するSSD3内のサブミッションキューテールドアベルレジスタにライトアクセスして、このサブミッションキュー(SQ)に対応するサブミッションキューテールポインタ(SQTP)の値を更新する。サブミッションキューテールポインタ(SQTP)の値は、サブミッションキュー(SQ)に格納された新たなコマンドの数だけインクリメントされる。このようなサブミッションキューテールポインタ(SQTP)の更新は、サブミッションキュー(SQ)に格納されたコマンドそれぞれの処理をコントローラ4に開始させるトリガーとなる。
【0093】
ステップ3: コントローラ4は、サブミッションキューテールポインタ(SQTP)の新たな値とサブミッションキューテールポインタ(SQTP)の以前の値との間の差分から、サブミッションキュー(SQ)に格納された新たなコマンドの数を認識することができる。コントローラ4は、サブミッションキュー(SQ)から一つ以上の任意の数のコマンドをフェッチする。フェッチされた各コマンドは、コントローラ4内の内部バッファ161に一時的に格納される。
【0094】
ステップ4: コントローラ4は、このサブミッションキュー(SQ)に対応するサブミッションキューヘッドポインタ(SQHP)の値がステップ3でフェッチしたコマンドの数だけ増えるように、このサブミッションキュー(SQ)に対応するサブミッションキューヘッドポインタ(SQHP)の値を更新する。
【0095】
ステップ5: コントローラ4は、フェッチしたコマンドそれぞれを実行する。これらコマンドが実行される順序は制限されず、これらコマンドは、これらコマンドがフェッチされた順序と異なる順序で実行されてもよい。各コマンドを実行する処理においては、コントローラ4は、必要に応じて、ホスト2のメモリ102からコントローラ4の内部バッファ161へのデータの転送、または内部バッファ161からホスト2のメモリ102へのデータの転送を行う。
【0096】
ステップ6: あるコマンドの実行が完了すると、コントローラ4は、まず、この完了したコマンドがフェッチされたサブミッションキュー(SQ)に関連付けられたコンプリーションキュー(CQ)に対応するコンプリーションキューテールポインタ(CQTP)を更新して、このコンプリーションキューテールポインタ(CQTP)の値を1増やす。
【0097】
ステップ7: コントローラ4は、この完了したコマンドのステータスを示す新たなコマンド完了を、このコンプリーションキュー(CQ)の次のフリーCQスロットに格納する。
図6では、コンプリーションキュー(CQ)に格納されているコマンド完了の各々は「CPL」として表記されている。
【0098】
ステップ8: コントローラ4は、ホスト2への割り込み信号を発生させて、新たなコマンド完了がコンプリーションキュー(CQ)に格納されたことをホスト2に通知する。
【0099】
ステップ9: ホスト2は、コンプリーションキューヘッドポインタ(CQHP)の現在の値によって示されるCQスロットからコマンド完了を取得し、取得したコマンド完了を処理する。
【0100】
ステップ10: ホスト2は、このコンプリーションキュー(CQ)に対応するSSD3内のコンプリーションキューヘッドドアベルレジスタにライトアクセスして、コンプリーションキューヘッドポインタ(CQHP)の値を更新する。コンプリーションキューヘッドポインタ(CQHP)の値は、ステップ9で処理されたコマンド完了の数だけインクリメントされる。
【0101】
比較例に係るコマンド処理では、コントローラ4は、内部バッファ161に利用可能な記憶領域が残っている限り、ホスト2の任意のサブミッションキュー(SQ)からコマンドをフェッチし続け得る。そのため、ホスト2によるコマンド完了の処理が遅滞すると、あるコンプリーションキュー(CQ)に格納されるべき新たな幾つかのコマンド完了が内部バッファ161内に滞留してしまう場合がある。以下、
図7A~
図7Gを参照して、比較例に係るコマンド処理の例を説明する。
【0102】
図7Aは、比較例に係るコマンド処理の一つ目の処理を示す図である。ホスト2は、例えば、メモリ102内に2つのSQ/CQペア、つまりSQ/CQペアXおよびSQ/CQペアY、を作成する。
【0103】
SQ/CQペアXは、一つのサブミッションキュー(SQ)と、このサブミッションキュー(SQ)に関連付けられた一つのコンプリーションキュー(CQ)とを含む。これらサブミッションキュー(SQ)およびコンプリーションキュー(CQ)の各々のサイズは、例えば、8スロットである。
【0104】
SQ/CQペアXの作成直後は、SQ/CQペアXに含まれるサブミッションキュー(SQ)およびコンプリーションキュー(CQ)の各々はエンプティである。したがって、SQ/CQペアXのサブミッションキュー(SQ)に対応するSQHPおよびSQTPは、同じスロット(ここでは、スロット#0)を示す。同様に、SQ/CQペアXのコンプリーションキュー(CQ)に対応するCQHPおよびCQTPも、同じスロット(ここではスロット#0)を示す。
【0105】
SQ/CQペアYは、一つのサブミッションキュー(SQ)と、このサブミッションキュー(SQ)に関連付けられた一つのコンプリーションキュー(CQ)とを含む。サブミッションキュー(SQ)サイズは、例えば、8スロットである。一方、コンプリーションキュー(CQ)のサイズは、例えば、NVMe規格で規定された最小サイズである2スロットである。SQ/CQペアYの作成直後は、SQ/CQペアYに含まれるサブミッションキュー(SQ)およびコンプリーションキュー(CQ)の各々はエンプティである。したがって、SQ/CQペアYのサブミッションキュー(SQ)に対応するSQHPおよびSQTPは、同じスロット(ここでは、スロット#0)を示す。同様に、SQ/CQペアYのコンプリーションキュー(CQ)に対応するCQHPおよびCQTPも、同じスロット(ここではスロット#0)を示す。
【0106】
コントローラ4は、フェッチされたコマンドそれぞれを一時的に格納するための受信バッファと、生成されたコマンド完了を一時的に格納するための送信バッファとを含む。これら受信バッファおよび送信バッファは、例えば
図1を参照して説明した内部バッファ161に割り当てられる。
【0107】
図7Bは、二つのSQ/CQペアに対する比較例に係るコマンド処理の二つ目の処理を示す図である。
【0108】
ホスト2は、SQ/CQペアXのサブミッションキュー(SQ)およびSQ/CQペアYのサブミッションキュー(SQ)の各々に一つ以上のコマンドを格納する。SQ/CQペアXのサブミッションキュー(SQ)には、例えば、コマンド0~コマンド6の七つのコマンドが格納される。この場合、ホスト2は、SQ/CQペアXのサブミッションキュー(SQ)に対応するSQTPの値を、スロット#0を示す値からスロット#7を示す値に更新する。これにより、SQ/CQペアXのサブミッションキュー(SQ)はフルになる。
【0109】
SQ/CQペアYのサブミッションキュー(SQ)には、例えば、コマンド0’~コマンド3’の四つのコマンドが格納される。この場合、ホスト2は、SQ/CQペアYのサブミッションキュー(SQ)に対応するSQTPの値を、スロット#0を示す値からスロット#4を示す値に更新する。
【0110】
図7Cは、二つのSQ/CQペアに対する比較例に係るコマンド処理の三つ目の処理を示す図である。
【0111】
コントローラ4は、アービトレーション機構を用いて、SQ/CQペアXのサブミッションキュー(SQ)とSQ/CQペアYのサブミッションキュー(SQ)のうちから、コマンドがフェッチされるべきサブミッションキュー(SQ)を選択する。そして、コントローラ4は、選択したサブミッションキュー(SQ)から一つ以上のコマンドをフェッチする。以下では、SQ/CQペアXのサブミッションキュー(SQ)およびSQ/CQペアYのサブミッションキュー(SQ)から交互に一個ずつコマンドをフェッチする場合を想定する。
【0112】
コントローラ4は、SQ/CQペアXのサブミッションキュー(SQ)からコマンド0をフェッチし、コマンド0を受信バッファに格納する。また、コントローラ4は、SQ/CQペアYのサブミッションキュー(SQ)からコマンド0’をフェッチし、コマンド0’を受信バッファに格納する。
【0113】
そして、コントローラ4は、SQ/CQペアXのサブミッションキュー(SQ)に対応するSQHPの値を、スロット#0を示す値からスロット#1を示す値に更新する。同様に、コントローラ4は、SQ/CQペアYのサブミッションキュー(SQ)に対応するSQHPの値を、スロット#0を示す値からスロット#1を示す値に更新する。
【0114】
以降、コントローラ4は、受信バッファに利用可能なフリー記憶領域がある限り、2つのサブミッションキュー(SQ)の各々からコマンドをフェッチし続ける。
【0115】
図7Dは、二つのSQ/CQペアに対する比較例に係るコマンド処理の四つ目の処理を示す図である。
【0116】
コントローラ4は、受信バッファに格納されているコマンド0およびコマンド0’を実行する。コマンド0の実行が完了すると、コントローラ4は、完了したコマンド0のステータスを示すコマンド完了0を作成し、作成したコマンド完了0を送信バッファに格納する。同様に、コマンド0’の実行が完了すると、コントローラ4は、完了したコマンド0’のステータスを示すコマンド完了0’を作成し、作成したコマンド完了0’を送信バッファに格納する。
【0117】
コマンド0およびコマンド0’の実行が完了することにより、受信バッファ内の2つの記憶領域の双方は、新たなコマンドの格納に利用可能なフリー記憶領域となる。
【0118】
したがって、コントローラ4は、SQ/CQペアXのサブミッションキュー(SQ)からコマンド1をフェッチし、フェッチしたコマンド1を受信バッファに格納する。また、コントローラ4は、SQ/CQペアYのサブミッションキュー(SQ)からコマンド1’をフェッチし、フェッチしたコマンド1’を受信バッファに格納する。そして、コントローラ4は、SQ/CQペアXのサブミッションキュー(SQ)に対応するSQHPの値を、スロット#1を示す値からスロット#2を示す値に更新する。同様に、コントローラ4は、SQ/CQペアYのサブミッションキュー(SQ)に対応するSQHPの値を、スロット#1を示す値からスロット#2を示す値に更新する。
【0119】
図7Eは、二つのSQ/CQペアに対する比較例に係るコマンド処理の五つ目の処理を示す図の図である。
【0120】
コントローラ4は、送信バッファに格納されているコマンド完了0を、SQ/CQペアXのコンプリーションキュー(CQ)のスロット#0に格納する。そして、コントローラ4は、SQ/CQペアXのコンプリーションキュー(CQ)に対応するCQTPを、スロット#0を示す値からスロット#1を示す値に更新する。なお、コントローラ4は、先に、CQTPを、スロット#0を示す値からスロット#1を示す値に更新してもよく、次いで、送信バッファに格納されているコマンド完了0を、SQ/CQペアXのコンプリーションキュー(CQ)のスロット#0に格納してもよい。
【0121】
また、コントローラ4は、送信バッファに格納されているコマンド完了0’を、SQ/CQペアYのコンプリーションキュー(CQ)のスロット#0に格納する。そして、コントローラ4は、SQ/CQペアYのコンプリーションキュー(CQ)に対応するCQTPを、スロット#0を示す値からスロット#1を示す値に更新する。これにより、SQ/CQペアYのコンプリーションキュー(CQ)はフルになる。なお、コントローラ4は、先に、CQTPを、スロット#0を示す値からスロット#1を示す値に更新してもよく、次いで、送信バッファに格納されているコマンド完了0’を、SQ/CQペアYのコンプリーションキュー(CQ)のスロット#0に格納してもよい。
【0122】
コマンド完了0およびコマンド完了0’がSQ/CQペアXのコンプリーションキュー(CQ)およびSQ/CQペアYのコンプリーションキュー(CQ)にそれぞれ格納されたため、送信バッファ内の二つの記憶領域は、新たなコマンド完了の格納に利用可能なフリー記憶領域となる。
【0123】
コントローラ4は、受信バッファに格納されているコマンド1およびコマンド1’を実行する。コマンド1の実行が完了すると、コントローラ4は、完了したコマンド1のステータスを示すコマンド完了1を作成し、作成したコマンド完了1を送信バッファに格納する。同様に、コマンド1’の実行が完了すると、コントローラ4は、完了したコマンド1’のステータスを示すコマンド完了1’を作成し、作成したコマンド完了1’を送信バッファに格納する。
【0124】
コマンド1およびコマンド1’の実行が完了することにより、受信バッファ内の2つの記憶領域はフリー記憶領域となる。
【0125】
したがって、コントローラ4は、SQ/CQペアXのサブミッションキュー(SQ)からコマンド2をフェッチし、コマンド2を受信バッファに格納する。また、コントローラ4は、SQ/CQペアYのサブミッションキュー(SQ)からコマンド2’をフェッチし、コマンド2’を受信バッファに格納する。
【0126】
そして、コントローラ4は、SQ/CQペアXのサブミッションキュー(SQ)に対応するSQHPの値を、スロット#2を示す値からスロット#3を示す値に更新する。同様に、コントローラ4は、SQ/CQペアYのサブミッションキュー(SQ)に対応するSQHPの値を、スロット#2を示す値からスロット#3を示す値に更新する。
【0127】
図7Fは、二つのSQ/CQペアに対する比較例に係るコマンド処理の六つ目の処理を示す図である。
【0128】
コントローラ4は、送信バッファに格納されているコマンド完了1を、SQ/CQペアXのコンプリーションキュー(CQ)のスロット#1に格納する。そして、コントローラ4は、SQ/CQペアXのコンプリーションキュー(CQ)に対応するCQTPを、スロット#1を示す値からスロット#2を示す値に更新する。なお、コントローラ4は、先に、CQTPを、スロット#1を示す値からスロット#2を示す値に更新してもよく、次いで、送信バッファに格納されているコマンド完了1を、SQ/CQペアXのコンプリーションキュー(CQ)のスロット#1に格納してもよい。
【0129】
一方、コマンド完了1’が格納されるべきSQ/CQペアYのコンプリーションキュー(CQ)は、フルである。したがって、コントローラ4は、コマンド完了1’をSQ/CQペアYのコンプリーションキュー(CQ)に格納できない。SQ/CQペアYのコンプリーションキュー(CQ)内のコマンド完了0’がホスト2によって処理されない限り、コマンド完了1’は、送信バッファ内に滞留し続ける。
【0130】
SQ/CQペアXのコンプリーションキュー(CQ)にコマンド完了1が格納されると、新たな一つのコマンド完了を送信バッファに格納することが可能となる。
【0131】
したがって、コントローラ4は、受信バッファに格納されているコマンド2を実行する。コマンド2の実行が完了すると、コントローラ4は、完了したコマンド2のステータスを示すコマンド完了2を作成し、作成したコマンド完了2を送信バッファに格納する。
【0132】
コマンド2の実行が完了することにより、新たな一つのコマンドを受信バッファに格納することが可能となる。したがって、コントローラ4は、SQ/CQペアXのサブミッションキュー(SQ)からコマンド3をフェッチし、コマンド3を受信バッファに格納する。そして、コントローラ4は、SQ/CQペアXのサブミッションキュー(SQ)に対応するSQHPの値を、スロット#3を示す値からスロット#4を示す値に更新する。
【0133】
図7Gは、二つのSQ/CQペアに対する比較例に係るコマンド処理の七つ目の処理を示す図である。
【0134】
コントローラ4は、送信バッファに格納されているコマンド完了2を、SQ/CQペアXのコンプリーションキュー(CQ)のスロット#2に格納する。そして、コントローラ4は、SQ/CQペアXのコンプリーションキュー(CQ)に対応するCQTPを、スロット#2を示す値からスロット#3を示す値に更新する。なお、コントローラ4は、先に、CQTPを、スロット#2を示す値からスロット#3を示す値に更新してもよく、次いで、送信バッファに格納されているコマンド完了2を、SQ/CQペアXのコンプリーションキュー(CQ)のスロット#2に格納してもよい。
【0135】
SQ/CQペアXのコンプリーションキュー(CQ)にコマンド完了2が格納されると、新たな一つのコマンド完了を送信バッファに格納することが可能となる。したがって、コントローラ4は、受信バッファに格納されているコマンド2’を実行する。コマンド2’の実行が完了すると、コントローラ4は、完了したコマンド2’のステータスを示すコマンド完了2’を作成し、作成したコマンド完了2’を送信バッファに格納する。
【0136】
コマンド2’の実行が完了することにより、新たな一つのコマンドを受信バッファに格納することが可能となる。したがって、コントローラ4は、SQ/CQペアYのサブミッションキュー(SQ)からコマンド3’をフェッチし、コマンド3’を受信バッファに格納する。そして、コントローラ4は、SQ/CQペアYのサブミッションキュー(SQ)に対応するSQHPの値を、スロット#3を示す値からスロット#4を示す値に更新する。
【0137】
SQ/CQペアYのコンプリーションキュー(CQ)はフル状態であるため、コントローラ4は、送信バッファに格納されているコマンド完了1’およびコマンド完了2’を、SQ/CQペアYのコンプリーションキュー(CQ)に格納できない。そのため、送信バッファ内にコマンド完了1’およびコマンド完了2’の双方が滞留する。すなわち、送信バッファは、SQ/CQペアYのコンプリーションキュー(CQ)に格納できないコマンド完了1’およびコマンド完了2’によって占有されてしまう。
【0138】
送信バッファにフリー記憶領域が存在しないため、SQ/CQペアYのサブミッションキュー(SQ)からフェッチ済みのコマンド3’を実行することができなくなる。
【0139】
一方、SQ/CQペアXのコンプリーションキュー(CQ)においては、複数のフリースロットが存在している。しかしながら、送信バッファは、SQ/CQペアYのコンプリーションキュー(CQ)に格納できないコマンド完了1’およびコマンド完了2’によって既に占有されてしまっている。したがって、SQ/CQペアXのコンプリーションキュー(CQ)はフルではないにもかかわらず、SQ/CQペアXからフェッチ済みのコマンド3を実行することができなくなる。さらに、受信バッファも、実行を開始できないコマンド3’およびコマンド3によって占有されているため、SQ/CQペアXのサブミッションキュー(SQ)から新たなコマンドをフェッチすることもできなくなる。
【0140】
このように、SQ/CQペアYのコンプリーションキュー(CQ)に格納されるべきコマンド完了1’およびコマンド完了2’が送信バッファに滞留すると、SQ/CQペアYのコマンド処理が停止されるだけでなく、他の全てのSQ/CQペアのコマンド処理が停止されてしまう。
【0141】
次に、実施形態に係るコマンド処理について説明する。
図8は、実施形態に係るコマンド処理の手順を示す図である。
【0142】
実施形態に係るコマンド処理においては、まず、
図8のステップ1~ステップ2の処理がホスト2によって実行される。
図8のステップ1~ステップ2の処理は、
図6を参照して説明した比較例に係るコマンド処理のステップ1~ステップ2の処理と同じであるので、ここでは説明を省略する。次いで、
図8のステップ3-1およびステップ3-2の処理が以下のように実行される。
【0143】
ステップ3-1: コントローラ4がサブミッションキュー(SQ)からコマンドをフェッチすべき場合、コントローラ4は、このサブミッションキュー(SQ)に関連付けられたコンプリーションキュー(CQ)の状態に基づいて、サブミッションキュー(SQ)からフェッチすべきコマンドの個数の上限を決める。この場合、コントローラ4は、まず、コマンド完了の格納に利用可能なこのコンプリーションキュー(CQ)内のスロットの数、つまりこのコンプリーションキュー(CQ)のフリーCQスロットの数、を算出する。
【0144】
ステップ3-2: コントローラ4は、算出したフリーCQスロットの数を上限として、フェッチすべきコマンドの個数を決定する。例えば、サブミッションキュー(SQ)に格納されているコマンドの数が4で、算出したフリーCQスロットの数が3である場合には、フェッチすべきコマンドの個数は3であると決定されてもよい。また、例えば、サブミッションキュー(SQ)に格納されているコマンドの数が2で、算出したフリーCQスロットの数が3である場合には、フェッチすべきコマンドの個数は2であると決定されてもよい。そして、コントローラ4は、決定した個数のコマンドをサブミッションキュー(SQ)からフェッチする。
【0145】
次いで、コントローラ4は、
図8のステップ4~ステップ10の処理を実行する。
図8のステップ4~ステップ10の処理は、
図6を参照して説明した比較例に係るコマンド処理のステップ4~ステップ10の処理と同じであるので、ここでは説明を省略する。
【0146】
次に、
図9A~
図9Hを参照して、実施形態に係るコマンド処理の例を説明する。以下では、上述の第2の算出方法を使用してフリーCQスロットの数を算出する場合を例示して、実施形態に係るコマンド処理の例について説明する。また、複数のSQ/CQペアのうちのどのペアに対しても同じ手順でコマンド処理が実行されるため、以下では、ある一つのSQ/CQペアに着目して、実施形態に係るコマンド処理の例を説明する。
【0147】
図9Aは、あるSQ/CQペアに対するコマンド処理の一つ目の処理を示す図である。
【0148】
このSQ/CQペアは、一つのサブミッションキュー(SQ)と、このサブミッションキュー(SQ)に関連付けられた一つのコンプリーションキュー(CQ)とを含む。サブミッションキュー(SQ)のサイズは、例えば、8スロットである。コンプリーションキュー(CQ)のサイズは、例えば、4スロットである。4つのスロットを含むコンプリーションキュー(CQ)がエンプティである場合、新たなコマンド完了の格納のために使用可能なフリーCQスロットの数は、3である。
図3を参照して説明したように、NVMe規格では、キュー(CQ)内のいずれか一つのスロットは、常にエンプティに維持されるからである。
【0149】
コントローラ4は、上述の第2の算出方法を使用してフリーCQスロットの数を算出するために、コンプリーションキューアローケートポインタ(CQAP)を管理する。CQAPは、このコンプリーションキュー(CQ)内のフリーCQスロットの数を得るために使用される。CQAPは、サブミッションキュー(SQ)から既にフェッチされ、かつ、コマンド完了がこのコンプリーションキュー(CQ)に格納されていないコマンドの個数と同数のコマンド完了が、このコンプリーションキュー(CQ)に格納された場合におけるこのコンプリーションキュー(CQ)内の次のフリースロット(次のフリーCQスロット)を示す第1のポインタとして使用される。
【0150】
コントローラ4は、コンプリーションキュー(CQ)と同じサイズを有するシャドウコンプリーションキュー(シャドウCQ)を使用して、CQAPの値を管理する。シャドウコンプリーションキューとコンプリーションキュー(CQ)とは、一対一で対応している。コンプリーションキュー(CQ)に含まれるスロットの総数が4である場合、シャドウコンプリーションキュー(CQ)に含まれるスロットの総数も4である。4スロットを含むシャドウコンプリーションキュー(CQ)がエンプティである場合、新たなコマンド完了のために予約可能なシャドウコンプリーションキュー(CQ)内のフリースロットの数は、3である。
【0151】
サブミッションキュー(SQ)およびコンプリーションキュー(CQ)はホスト2のメモリ102に存在するが、シャドウコンプリーションキューは、ホスト2のメモリ102およびコントローラ4のどちらにも存在しない仮想的なキューである。
【0152】
シャドウコンプリーションキューは、コンプリーションキュー(CQ)の将来の状態を表すために使用される。CQAPは、シャドウコンプリーションキュー内の次のフリースロットを示すポインタとして使用される。
【0153】
また、コンプリーションキュー(CQ)に対応するCQHPは、処理されるべき次のコマンド完了を格納しているコンプリーションキュー(CQ)内のスロットを示すために使用されるだけでなく、処理されるべき次のコマンド完了の格納のために予約されているシャドウコンプリーションキュー内のスロットを示すためにも使用される。つまり、CQHPは、コンプリーションキュー(CQ)とシャドウコンプリーションキューとによって共有される。
【0154】
まず、コントローラ4は、シャドウコンプリーションキューのフリースロットの数を、コンプリーションキュー(CQ)のフリーCQスロットの数として算出する。
【0155】
シャドウコンプリーションキューのフリースロットの数は、コンプリーションキューヘッドポインタ(CQHP)と、コンプリーションキューアローケートポインタ(CQAP)と、コンプリーションキュー(CQ)のサイズとから、以下の式で求められる。
【0156】
シャドウCQのフリースロットの数=(CQサイズ-1)-(CQAP-CQHP)
このように、シャドウコンプリーションキューのフリースロットの数は、コンプリーションキュー(CQ)に含まれるスロットの数よりも1だけ少ない値から、CQAPとCQHPとの間の差分を減算することによって得られる。
【0157】
図9Aでは、シャドウコンプリーションキューはエンプティであるので、シャドウコンプリーションキューのフリースロットの数は3である。これにより、コントローラ4は、サブミッションキュー(SQ)から最大三つのコマンドをフェッチすることが可能であると判定する。
【0158】
ホスト2は、サブミッションキュー(SQ)に7つのコマンド(コマンド0~コマンド6)を格納する。ホスト2は、サブミッションキューテールポインタ(SQTP)の値を、スロット#0を示す値からスロット#7を示す値に更新する。
【0159】
図9Bは、SQ/CQペアに対するコマンド処理の二つ目の処理を示す図である。
【0160】
コントローラ4は、実際にフェッチするコマンドの個数だけCQAPの値が増えるようにCQAPを更新する。実際にフェッチするコマンドの個数が3である場合、つまりサブミッションキュー(SQ)から三つのコマンド(コマンド0、コマンド1、コマンド2)をフェッチすることが決定された場合、コントローラ4は、シャドウコンプリーションキューの三つのスロット(スロット#0、#1、#2)がコマンド0、コマンド1、コマンド2に対応する三つのコマンド完了の格納のためにそれぞれ予約されるように、CQAPの値を3だけインクリメントする。
【0161】
図9Bにおいて、「allocation 0」は、コマンド0に対応するコマンド完了の格納のためにシャドウコンプリーションキュー内の一つのスロットが予約された状態を示している。同様に、「allocation 1」は、コマンド1に対応するコマンド完了の格納のためにシャドウコンプリーションキュー内の一つのスロットが予約された状態を示す。「allocation 2」は、コマンド2に対応するコマンド完了の格納のためにシャドウコンプリーションキュー内の一つのスロットが予約された状態を示している。
【0162】
三つのスロットが予約されることにより、シャドウコンプリーションキュー内に含まれるエンプティのスロットの数は一つになる。つまり、新たに予約可能なフリースロットの数はゼロとなるので、シャドウコンプリーションキューはフルになる。このように、コンプリーションキュー(CQ)と同様に、シャドウコンプリーションキュー内のいずれか一つのスロットは、常にエンプティに維持される。シャドウコンプリーションキューがフル、つまり、シャドウコンプリーションキューのフリースロットの数がゼロになると、コントローラ4は、サブミッションキュー(SQ)から追加のコマンド(ここでは、コマンド3~コマンド6)をフェッチしない。
【0163】
図9Cは、SQ/CQペアに対するコマンド処理の三つ目の処理を示す図である。コントローラ4は、サブミッションキュー(SQ)からコマンド0~コマンド2の三つのコマンドをフェッチする。コントローラ4は、フェッチしたコマンドの数に応じて、サブミッションキューヘッドポインタ(SQHP)の値を、スロット#0を示す値からスロット#3を示す値に更新する。
【0164】
図9Dは、SQ/CQペアに対するコマンド処理の四つ目の処理を示す図である。コントローラ4は、フェッチしたコマンド0~コマンド2を実行する。コマンド0~コマンド2の実行が完了すると、コントローラ4は、完了したコマンド0~コマンド2に対応するコマンド完了0~コマンド完了2を作成する。コントローラ4は、コマンド完了0~コマンド完了2をコンプリーションキュー(CQ)に格納する。
【0165】
コントローラ4は、コンプリーションキュー(CQ)に格納したコマンド完了の数に応じて、コンプリーションキューテールポインタ(CQTP)の値を、スロット#0を示す値からスロット#3を示す値に更新する。この結果、コンプリーションキュー(CQ)とシャドウコンプリーションキューとは、同じ状態、つまりフルになる。
【0166】
図9Eは、SQ/CQペアに対するコマンド処理の五つ目の処理を示す図である。ホスト2は、コマンド完了0を処理し、コンプリーションキューヘッドポインタ(CQHP)の値を、スロット#0を示す値からスロット#1を示す値に更新する。コンプリーションキューヘッドポインタ(CQHP)がホスト2によって更新された場合、コントローラ4は、CQHPの更新前の値によって示されるコンプリーションキュー(CQ)のスロット#0とシャドウコンプリーションキューのスロット#0を解放する。解放されたコンプリーションキュー(CQ)のスロット#0と解放されたシャドウコンプリーションキューのスロット#0は、エンプティになる。
【0167】
コントローラ4は、CQHPと、CQAPと、コンプリーションキュー(CQ)のサイズとに基づいて、シャドウコンプリーションキューのフリースロットの数(ここでは、1)を算出する。シャドウコンプリーションキューのフリースロットの数はゼロから1になるので、コントローラ4は、サブミッションキュー(SQ)からコマンドをフェッチする処理を再開することができる。
【0168】
図9Fは、SQ/CQペアに対するコマンド処理の六つ目の処理を示す図である。
【0169】
コントローラ4は、実際にフェッチするコマンドの数(=1)だけCQAPの値をインクリメントする。これにより、CQAPの値は、スロット#3を示す値からスロット#0を示す値に更新される。
図9Fの「allocation 3」は、コマンド3に対応するコマンド完了の格納のためにシャドウコンプリーションキュー内の一つのスロットが予約された状態を示している。
【0170】
CQAPの更新後、シャドウコンプリーションキューがフル、つまり、シャドウコンプリーションキューのフリースロットの数がゼロになるので、コントローラ4は、サブミッションキュー(SQ)から追加のコマンド(コマンド4~コマンド6)をフェッチしない。
【0171】
図9Gは、SQ/CQペアに対するコマンド処理の七つ目の処理を示す図である。コントローラ4は、サブミッションキュー(SQ)からコマンド3をフェッチする。コントローラ4は、フェッチしたコマンドの数(ここでは、1)に応じて、サブミッションキューヘッドポインタ(SQHP)の値を、スロット#3を示す値からスロット#4を示す値に更新する。
【0172】
図9Hは、SQ/CQペアに対するコマンド処理の八つ目の処理を示す図である。コントローラ4は、フェッチしたコマンド3を実行する。フェッチしたコマンド3の実行が完了すると、コントローラ4は、コマンド3に対応するコマンド完了3を作成する。コントローラ4は、コマンド完了3をコンプリーションキュー(CQ)のスロット#3に格納する。
【0173】
コントローラ4は、コンプリーションキュー(CQ)に格納したコマンド完了の数(ここでは、1)に応じて、コンプリーションキューテールポインタ(CQTP)の値を更新する。コンプリーションキュー(CQ)とシャドウコンプリーションキューとは、同じ状態、つまりフルになる。
【0174】
このようにして、サブミッションキュー(SQ)から一つ以上のコマンドをフェッチする前に、コマンド完了を格納することができるコンプリーションキュー(CQ)内のフリーCQスロットの数が算出される。そして、サブミッションキュー(SQ)からフェッチ可能なコマンドの個数は、最大でフリーCQスロットの数に制限される。
【0175】
したがって、例えば、ホスト2によるコマンド完了の処理の遅滞によってコンプリーションキュー(CQ)のフリースロットの数が減少した場合には、コンプリーションキュー(CQ)に関連付けられたサブミッションキュー(SQ)からフェッチされるコマンドの数が自動的に減少される。よって、サブミッションキュー(SQ)からフェッチされるコマンドの数を、ホスト2によるコマンド完了の処理の進行度合いに基づいて、適応的に制御することが可能となる。
【0176】
よって、コンプリーションキュー(CQ)に格納できないコマンド完了が内部バッファ161内に滞留してしまうことを防ぐことができる。この結果、特定のSQ/CQペアのコマンド処理が停止してしまうことを防止することができ、さらには、この特定のSQ/CQペアのコマンド処理の停止に起因して他の全てのSQ/CQペアのコマンド処理が停止されてしまうことも防止することができる。
【0177】
図10は、実施形態に係るSSD3において実行される二つのSQ/CQペアに対するコマンド処理を示す図である。
【0178】
ここでは、ホスト2のメモリ102に二つのSQ/CQペア(SQ/CQペアX、SQ/CQペアY)が割り当てられている場合について説明する。各SQ/CQペアには、一つのサブミッションキュー(SQ)と、このサブミッションキュー(SQ)に関連付けられたコンプリーションキュー(CQ)とが含まれている。さらに、SQ/CQペア毎に、シャドウコンプリーションキューとCQAPとが管理される。
【0179】
SQ/CQペアXのおよびSQ/CQペアYの各々について、
図9A~
図9Hで説明したコマンド処理が実行される。
【0180】
つまり、SQ/CQペアXのサブミッションキュー(SQ)からコマンドをフェッチすべき場合には、コントローラ4は、SQ/CQペアXのコンプリーションキュー(CQ)のサイズと、SQ/CQペアXに対応するCQAP1と、SQ/CQペアXのコンプリーションキュー(CQ)に対応するCQHPとに基づいて、SQ/CQペアXのシャドウコンプリーションキューのフリースロットの数を、SQ/CQペアXのコンプリーションキュー(CQ)のフリーCQスロットの数として算出する。そして、SQ/CQペアXのサブミッションキュー(SQ)からフェッチ可能なコマンドの個数は、算出されたフリーCQスロットの数までに制限される。
【0181】
SQ/CQペアYのサブミッションキュー(SQ)からコマンドをフェッチすべき場合には、コントローラ4は、SQ/CQペアYのコンプリーションキュー(CQ)のサイズと、SQ/CQペアYに対応するCQAP2と、SQ/CQペアYのコンプリーションキュー(CQ)に対応するCQHPとに基づいて、SQ/CQペアYのシャドウコンプリーションキューのフリースロットの数を、SQ/CQペアYのコンプリーションキュー(CQ)のフリーCQスロットの数として算出する。そして、SQ/CQペアYのサブミッションキュー(SQ)からフェッチ可能なコマンドの個数は、算出されたフリーCQスロットの数までに制限される。
【0182】
図11は、SSD3において実行されるコマンド処理の手順を示すフローチャートである。
【0183】
コントローラ4は、アービトレーション機構によって、コマンドがフェッチされるべきサブミッションキュー(SQ)を決定する(ステップS101)。
【0184】
コントローラ4は、ステップS101において決定されたサブミッションキュー(SQ)に関連付けられたコンプリーションキュー(CQ)のフリーCQスロットの数を、このコンプリーションキュー(CQ)のサイズと、このコンプリーションキュー(CQ)の現在のCQHPと、このコンプリーションキュー(CQ)の現在のコンプリーションキューアローケートポインタ(CQAP)とに基づいて算出する(ステップS102)。このとき、現在のコンプリーションキューアローケートポインタ(CQAP)は、ステップS101において決定されたサブミッションキュー(SQ)から既にフェッチされ、かつ、コマンド完了がこのコンプリーションキュー(CQ)に格納されていないコマンドの個数と同数のコマンド完了が、このコンプリーションキュー(CQ)に格納された場合における次のフリーCQスロットを示す。
【0185】
コントローラ4は、ステップS102で算出したフリーCQスロットの数が0と等しいか否かを判定する(ステップS103)。
【0186】
算出したフリーCQスロットの数が0と等しい場合(ステップS103のYES)、コントローラ4は、コマンドフェッチ部22がサブミッションキュー(SQ)からコマンドをフェッチすることを一時的に禁止する(ステップS104)。
【0187】
算出したフリーCQスロットの数が1以上である場合(ステップS103のNO)、コントローラ4は、算出したフリーCQスロットの数の範囲内で、サブミッションキュー(SQ)からフェッチすべきコマンドの個数を決定する(ステップS105)。
【0188】
コントローラ4は、CQAPの新たな値が、ステップS105で決定したフェッチすべきコマンドの個数と同数のコマンド完了がコンプリーションキュー(CQ)に将来格納された場合における次のフリーCQスロットを示すように、CQAPを更新する(ステップS106)。
【0189】
コントローラ4は、ステップS105で決定した個数分のコマンドを、サブミッションキュー(SQ)からフェッチする(ステップS107)。
【0190】
以上説明したように、本実施形態によれば、サブミッションキュー(SQ)からフェッチ可能なコマンドの個数の上限は、算出されたフリーCQスロットの数に制限される。したがって、例えば、ホスト2によるコマンド完了の処理の遅滞によってあるコンプリーションキュー(CQ)のフリーCQスロットの数が減少した場合には、このコンプリーションキュー(CQ)に関連付けられたサブミッションキュー(SQ)からフェッチされるコマンドの数も自動的に減少される。よって、このサブミッションキュー(SQ)からフェッチされるコマンドの数を、このサブミッションキュー(SQ)に関連付けられたコンプリーションキュー(CQ)に格納されているコマンド完了の処理の進行度合いに基づいて、適応的に制御することが可能となる。
【0191】
この結果、ある特定のコンプリーションキュー(CQ)に格納できない複数のコマンド完了が内部バッファ161内に滞留してしまうことを防止することが可能となり、SSD3の信頼性、ひいては情報処理システム1全体の信頼性の向上を図ることができる。
【0192】
また、CQAPを使用してフリーCQスロットの数を算出することにより、算出されたフリーCQスロットの数が、利用可能な実際のフリーCQスロットの数を下回らないことを確実にすることができる。この結果、コマンド完了をコンプリーションキュー(CQ)に格納する処理と、コマンドをサブミッションキュー(SQ)からフェッチする処理と、を並列に実行することを許容することが可能となる。
【0193】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0194】
1…情報処理システム、2…ホスト、3…SSD、4…コントローラ、5…NAND型フラッシュメモリ、6…DRAM、10…バス、11…ホストインタフェース、12…メモリインタフェース、13…CPU、14…DRAMインタフェース、15…DMAC、16…SRAM、17…ECCエンコード/デコード部、21…フリーCQスロット数取得部、22…コマンドフェッチ部、23…コマンド処理部、31…L2Pテーブル、32…ブロック管理テーブル、161…内部バッファ。