以下、本実施の形態について図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態のストレージ装置を示す図である。ストレージ装置1は、ストレージ制御装置10,20および記憶装置群30を有する。ストレージ制御装置10,20は、記憶装置群30に属する複数の記憶装置に対するデータアクセスを制御する。記憶装置群30は、HDDやSSDなどの複数の記憶装置を含む。例えば、ストレージ装置1は、情報処理装置(図1では図示を省略)に接続され、上記複数の記憶装置による大容量のデータ記憶領域を情報処理装置に提供する。
ストレージ制御装置10,20は相互に連携する。例えば、ストレージ制御装置10,20のうちの何れか一方が故障しても、他方のストレージ制御装置がデータアクセスを継続する。ストレージ制御装置10,20は、ユーザデータの二重化や連携用の制御情報を受け渡すために通信を行う。ストレージ制御装置10,20は、データが送信先のストレージ制御装置により適切に受信されたことの確認(受信状況の確認、あるいは、送達確認と称する)を行う機能を提供する。
ストレージ制御装置10は、接続ポート11、処理部12およびデータ記憶部13を有する。
接続ポート11は、ストレージ制御装置20へのデータ送信に用いられるインタフェースである。接続ポート11は、自ポートで発生したエラーの検出機能を有する。接続ポート11は、検出結果記憶部11aを有する。検出結果記憶部11aは、接続ポート11のエラー検出機能によるエラーの検出結果を記憶する。接続ポート11は、エラーの検出結果として、検出したエラーに対応する識別情報を生成し、検出結果記憶部11aに格納する。
接続ポート11の一例として、PCIe(Peripheral Component Interconnect Express)のインタフェースが挙げられる。PCIeのインタフェースを用いる場合、検出結果記憶部11aは、例えばPCIeにおけるアンコレクタブル・エラー・ステータス・レジスタ(UESTS:Uncorrectable Error Status register)である。UESTSは、アンコレクタブルエラーに関する情報を記憶する。アンコレクタブルエラーは、訂正不可能なデータ誤りの発生を示すエラーである。
ストレージ制御装置10は、接続ポート11を複数有してもよい。例えば、PCIeデバイスを複数接続する場合に、両PCIeデバイスが備える接続ポート同士を所定のケーブルで繋ぐことで、PCIeデバイス同士を接続できる。また、接続ポート11をストレージ制御装置20が備える接続ポートと所定のケーブルで接続することで、ストレージ制御装置10,20の間の通信路を形成することもできる。すなわち、ストレージ制御装置10では、複数の接続ポートが多段に接続されて、デバイス間の通信路を形成してもよい。
処理部12は、CPU(Central Processing Unit)、DSP(Digital Signal Processor)、ASIC(Application Specific Integrated Circuit)、FPGA(Field Programmable Gate Array)などを含み得る。処理部12はプログラムを実行するプロセッサでもよい。プロセッサは、複数のプロセッサの集合(マルチプロセッサ)を含む。
データ記憶部13は、処理部12の処理に用いられるデータ(前述のユーザデータや制御情報など)を記憶する主記憶装置である。データ記憶部13は、例えば、RAM(Random Access Memory)やメモリなどと呼ばれる記憶装置でもよい。
ストレージ制御装置20は、接続ポート21、処理部22およびデータ記憶部23を有する。
接続ポート21は、接続ポート11と同様に、自ポートで発生したエラーの検出機能を有する。接続ポート21は、検出結果記憶部21aを有する。検出結果記憶部21aは、接続ポート21によるエラーの検出結果を記憶する。接続ポート21は、エラーの検出結果として、検出したエラーに対応する識別情報を生成し、検出結果記憶部21aに格納する。接続ポート21は、接続ポート11と同様に、PCIeのインタフェースでもよい。検出結果記憶部21aは、UESTSでもよい。更に、ストレージ制御装置20は、ストレージ制御装置10と同様に、接続ポート21を複数有してもよい。すなわち、ストレージ制御装置20では、複数の接続ポートが多段に接続されて、デバイス間の通信路を形成してもよい。
処理部22は、CPU,DSP,ASIC,FPGAなどを含み得る。処理部22はプログラムを実行するプロセッサでもよい。プロセッサは、マルチプロセッサでもよい。データ記憶部23は、処理部22の処理に用いられるデータを記憶する主記憶装置である。データ記憶部23は、例えば、RAMやメモリなどと呼ばれる記憶装置でもよい。
ここで、ストレージ制御装置10からストレージ制御装置20へデータの送信を行う場合を考える。処理部12は、データ記憶部13に記憶されたデータをデータ記憶部23へ送信する。このデータ送信は、DMAにより実現されてもよい。そのために、ストレージ制御装置10,20は、DMAを制御するDMAコントローラを更に有してもよい。例えば、処理部12は、ストレージ制御装置10のDMAコントローラを用いて、DMAによるストレージ制御装置20へのデータ送信を実現することもできる。
処理部12は、接続ポート11,21を介して、ストレージ制御装置20にデータを送信する。このとき、接続ポート21は、自ポートで発生したエラーを検出し、エラーの検出結果を検出結果記憶部21aに格納する。処理部12は、接続ポート21による検出結果を、検出結果記憶部21aから取得する。
処理部12は、接続ポート21から取得した検出結果を、データ記憶部13に格納する。処理部12は、取得した検出結果に基づいて、ストレージ制御装置20によるデータの受信状況を確認する。ここで、ストレージ制御装置20によるデータの受信状況の確認は、「データの送達確認」ともいえる。
例えば、検出結果がエラーの識別情報を含まない場合(全てエラーなしの場合)、処理部12は、ストレージ制御装置20により適切にデータが受信されたと判断する。また、検出結果がエラーの識別情報を含む場合(少なくとも1つのエラーありの場合)、処理部12は、ストレージ制御装置20により適切にデータが受信されていないと判断する。後者の場合、処理部12は、更に、該当のデータの再送処理を行ってもよい。
このように、処理部12は、ストレージ制御装置20においてデータ送信の経路上にある接続ポート21のエラー検出機能を、データの受信状況の確認に利用する。このため、ストレージ制御装置10,20の間で、受信状況の確認用のメッセージを余計に送受信しなくてもよくなる。また、ストレージ制御装置20は受信データの確認処理を実行しなくてもよくなる。その結果、ストレージ制御装置10,20間の受信状況の確認に伴う通信量、および、処理部12,22の負荷が軽減される。そして、受信状況の確認に伴う所要時間を短縮できる。すなわち、データ送信元のストレージ制御装置10から、ストレージ制御装置20側の異常を直接検出することにより、性能劣化を抑えてデータの受信状況の確認を実現できる。こうして、データの受信状況の確認を効率化できる。
また、データ送信中に接続ポート21でエラーが検出されている場合、データ送信に悪影響を及ぼしている可能性が高いと考えられる。そこで、接続ポート21でエラーが検出されている場合には、処理部12は、ストレージ制御装置20が適切にデータを受信できていないと判断して、再送などのリカバーを行う。これにより、ストレージ装置1におけるストレージ制御装置10,20の連携を適切に行える。その結果、ストレージ装置1の信頼性の向上を図れる。特に、ストレージ制御装置10,20の冗長制御は、適切にデータを送受信できることが前提となる。例えば、ストレージ制御装置10からストレージ制御装置20へのデータ送信に失敗したまま、ストレージ制御装置10が縮退すると、正常データが喪失されることになり、データの不整合が発生してしまう。このため、データの送達保証による信頼性向上は、ストレージ制御装置10,20において特に重要であり、受信状況の確認を高速実行する意義は大きい。
更に、エラーの検出結果として、例えば、前述のPCIeにおけるUESTSの情報のようにデータに対するアンコレクタブルエラーの検出状況を利用することで、データの受信失敗の検出精度を向上できる。なぜなら、接続ポート21でアンコレクタブルエラーが発生している場合、接続ポート21においてデータ化けやデータ欠落などが生じていることになり、この現象は正常な受信データの喪失を意味するからである。一方、アンコレクタブルエラーが検出されていなければ、接続ポート21をデータが正しく通過したことを意味する。
なお、ストレージ制御装置20が、複数の接続ポートを有する場合、処理部12は、データの通信経路上にある複数の接続ポートそれぞれの検出結果記憶部から、各接続ポートによるエラーの検出結果を取得してもよい。そうすれば、処理部12は、接続ポートを備えるデバイス毎に、エラーの発生状況を確認でき、データの受信失敗の要因になった通信経路上のデバイスを特定することもできる。例えば、処理部12は、エラーの発生したデバイスに応じた再送制御を行ったり、特定したデバイスのエラーをログに出力したりしてもよい。
更に、ストレージ制御装置20からストレージ制御装置10へデータを送信する場合も、処理部22は、処理部12と同様に、データの受信状況の確認を行える。具体的には、処理部22は、接続ポート11が備える検出結果記憶部11aから、接続ポート11によるエラーの検出結果を取得し、取得したエラーの検出結果に基づいてデータの受信状況の確認を行う。これにより、ストレージ制御装置20によるデータの受信状況の確認も同様に効率化できる。
以下では、ストレージ制御装置10,20相当の機能を有するストレージ装置を更に具体的に説明する。
[第2の実施の形態]
図2は、第2の実施の形態の情報処理システムを示す図である。第2の実施の形態の情報処理システムは、ストレージ装置50およびサーバ60を含む。ストレージ装置50およびサーバ60は、ネットワーク70に接続されている。ネットワーク70は、例えば、SAN(Storage Area Network)である。
ストレージ装置50は、複数のHDD(またはSSD)を収納可能であり、複数のHDDを組み合わせて大容量の記憶領域をサーバ60に提供する。ストレージ装置50は、RAID(Redundant Arrays of Inexpensive Disks)装置、ディスクアレイ装置、または、ストレージシステムなどと呼ばれてもよい。
サーバ60は、ストレージ装置50に格納されたデータを用いて業務処理を実行するサーバコンピュータである。
図3は、ストレージ装置のハードウェア例を示す図である。ストレージ装置50は、ドライブエンクロージャ(DE:Drive Enclosure)51およびコントローラモジュール(CM:Controller Module)100,200を有する。
DE51は、複数のHDDを収納する。DE51は、HDDに代えて、あるいは、HDDと併せて複数のSSDを収納してもよい。
CM100,200は、DE51に収納された複数のHDDを組み合わせて、RAIDの技術による論理的な記憶領域をサーバ60に提供する。CM100,200は、ネットワーク70を介してサーバ60から、記憶領域に対するデータの読み出しや書き込みの要求を受け付け、DE51に収納された複数のHDDへアクセスする。CM100,200は、冗長化されている。CM100,200の何れか一方が故障しても、他方によりDE51へのアクセスを継続できる。
CM100の装置番号は“#0”である。CM200の装置番号は“#1”である。図中、例えば、CM100を指して“CM#0”や“CM(#0)”のように表記することがある。CM100,200は、第1の実施の形態のストレージ制御装置10,20の一例である。
CM100,200は、互いに連携するために、相互に通信を行う(CM間通信と称することがある)。CM間通信では、DMAの技術により、一方のCMのメモリから他方のCMのメモリに、データが転送される。転送対象のデータは、ユーザデータであることもあるし、CM間の連携用の制御情報であることもある。
CM100は、CPU110、RAM120、PCIeスイッチ130,140、SAS(Serial Attached SCSI)150およびCA(Channel Adapter)160を有する。これらの各デバイスは、PCIeのインタフェースを用いたバスにより接続される。
CPU110は、CM100全体を制御するプロセッサである。CPU110は、マルチプロセッサであってもよい。CPU110は、所定の機能を実現するASICやFPGAなどを備えてもよい。CPU110は、ルートポート(RP:Root Port)111を有する。
RP111は、PCIeスイッチ130と接続するインタフェースである。なお、CPU110は、PCIeスイッチ140と接続するRPも有している(図示を省略する)。
RAM120は、CM100の主記憶装置である。RAM120は、CPU110に接続される。RAM120は、CPU110に実行させるファームウェアのプログラムの少なくとも一部を一時的に記憶する。また、RAM120は、CPU110による処理に用いる各種データを記憶する。
PCIeスイッチ130,140は、CM100が備える各種のデバイス(CPU110,SAS150およびCA160など)を接続する中継器である。PCIeスイッチ130は、DMA制御部131、アップストリームポート(UP:Upstream Port)132およびノントランスペアレントブリッジ(NTB:Non Transparent Bridge)133を有する。
DMA制御部131は、CM100からCM200へのDMAによるデータ転送を制御する。DMA制御部131は、例えば、FPGAやASICなどのプロセッサによって実現される。
UP132は、RP111と接続するインタフェースである。
NTB133は、CM200と接続するインタフェースである。NTB133は、異なる2つのPCIeドメイン間を接続し、相互の通信を可能にする。NTB133は、所定の条件に合致する通信に限定して、他PCIeドメインへの通過を許容する。例えば、PCIeの規約では、NTB133は、メモリリクエストという種類のコマンドの通過を許容する。メモリリクエストは、相手側のCMのRAMに対するデータの読み出しや書き込み(Read/Write)を要求できる。後述するように、CM100は、メモリリクエストを用いて、CM200における各デバイスが保持する情報を読み取る。このため、メモリリクエストを、CM200の各デバイスに対するアクセス要求であるともいえる。
PCIeスイッチ140も、PCIeスイッチ130と同様のハードウェアを備える。PCIeスイッチ140は、CPU110、SAS150およびCA160と接続される。PCIeスイッチ140は、SAS150およびCA160と接続するダウンストリームポート(DW:DoWnstream port)を有するが図3では図示を省略している(PCIeスイッチ130もDWを有する)。
SAS150は、DE51と接続するインタフェースである。
CA160は、ネットワーク70と接続するインタフェースである。CA160としては、例えば、ファイバチャネル(FC:Fibre Channel)のインタフェースを用いることができる。
CM200は、CPU210、RAM220、PCIeスイッチ230,240、SAS250およびCA260を有する。これらの各デバイスは、PCIeのインタフェースを用いたバスにより接続される。
CPU210は、CM200全体を制御するプロセッサである。CPU210は、マルチプロセッサであってもよい。CPU210は、所定の機能を実現するASICやFPGAなどを備えてもよい。CPU210は、RP211を有する。
RP211は、PCIeスイッチ230と接続するインタフェースである。なお、CPU210は、PCIeスイッチ240と接続するRPも有している(図示を省略する)。
RAM220は、CM200の主記憶装置である。RAM220は、CPU210に接続される。RAM220は、CPU210に実行させるファームウェアのプログラムの少なくとも一部を一時的に記憶する。また、RAM220は、CPU210による処理に用いる各種データを記憶する。
PCIeスイッチ230,240は、CM200が備える各種のデバイスを接続する中継器である。PCIeスイッチ230は、DMA制御部231、UP232およびNTB233を有する。
DMA制御部231は、CM200からCM100へのDMAによるデータ転送を制御する。DMA制御部231は、例えば、FPGAやASICなどのプロセッサによって実現される。
UP232は、RP211と接続するインタフェースである。
NTB233は、CM200と接続するインタフェースである。NTB233は、NTB133と同様に異なる2つのPCIeドメイン間を接続し、相互の通信を可能にする。NTB233は、NTB133と接続される。
PCIeスイッチ240も、PCIeスイッチ230と同様のハードウェアを備える。PCIeスイッチ240は、CPU210、SAS250およびCA260と接続される。PCIeスイッチ240は、SAS250およびCA260と接続するDWを有するが図3では図示を省略している(PCIeスイッチ230もDWを有する)。
SAS250は、DE51と接続するインタフェースである。SAS250は、SAS150にも接続される。
CA260は、ネットワーク70と接続するインタフェースである。CA260としては、例えば、FCのインタフェースを用いることができる。
ここで、RP111,211、UP132,232およびNTB133,233は、それぞれがエラー検出機能を有する。エラー検出機能により検出可能なエラーは、転送対象のデータに対するアンコレクタブルエラーを含む。RP111,211、UP132,232およびNTB133,233は、それぞれが自身で発生したアンコレクタブルエラーの情報を格納するためのUESTSと呼ばれるレジスタを有する。
PCIeの規約では、単一のCM内部でのデバイス間の通信は保証されるが、CM100内部のデバイスとCM200内部のデバイスとの間の通信は保証されていない。すなわち、CM100は、自CMのデバイスツリーに属するデバイスにおける異常をPCIeの規約における通信保証の機能により検出できる。一方、CM100は、CM200のデバイスツリーに属するデバイスにおける異常をPCIeの規約における通信保証の機能では検出できない。そこで、CM100,200は、データの受信状況の確認を工夫して、CM100,200間の通信を保証する機能を提供する。
以下の説明では、CM100からCM200へのDMAによるデータ転送において、CM100によりデータの受信状況の確認を行うケースを例示する。その際、CM100は、CM200側に存在するUESTSの情報を用いる。そこで、以下では、RP211、UP232およびNTB233それぞれのUESTSを図示するが、RP111、UP132およびNTB133それぞれのUESTSの図示を省略する。
RP211は、UESTS211aを有する。UP232は、UESTS232aを有する。NTB233はUESTS233aを有する。
RP111、UP132およびNTB133は、第1の実施の形態の接続ポート11の一例である。RP211、UP232およびNTB233は、第1の実施の形態の接続ポート21の一例である。
図4は、デバイスツリーの例を示す図である。CM100のデバイスツリーでは、CPU110に属するルートコンプレックス(RP111に相当)を頂点とし、RP111の配下にPCIeスイッチ群SW1(PCIeスイッチ130,140)が接続される。そして、PCIeスイッチ群SW1の配下に、複数のエンドポイントが接続される。複数のエンドポイントは、NTB133、SAS150およびCA160を含む。CM100のデバイスツリーを、1つのPCIeドメインと呼ぶこともできる。
CM200のデバイスツリーもCM100と同様の構造となる。ただし、図4では、両PCIeドメインの接続関係を表すために、ルートコンプレックス(RP211に相当)を下側にして図示している。RP211の配下にPCIeスイッチ群SW2(PCIeスイッチ230,240)が接続される。そして、PCIeスイッチ群SW2の配下に、複数のエンドポイントが接続される。複数のエンドポイントは、NTB233、SAS250およびCA260を含む。
CM100のデバイスツリーおよびCM200のデバイスツリーは、NTB133,233を介して接続される。CM100,200は、NTB133,233を介して、所定のコマンドを送受信する。
NTB133,233は、次の特性により、CM100,200の通信を可能とする。
第1に、NTB133,233は、自CM側、および、他CM側の2つのバスを接続可能であり、両バスの2つのドメインを分離させつつ、電気的な接続を可能とする。
第2に、NTB133,233は、両方のバスから異なるエンドポイントとして認識される。また、NTB233は、相手側のデバイス(例えば、CPU110)に、NTB233のデバイス空間を認識させる機能をもつ。すなわち、CPU110は、CPU110が認識する論理的なアドレスを指定することで、NTB233のレジスタへアクセス可能である。NTB133も、CM200に対して同様の機能をもつ。
第3に、NTB133,233は、NTB133,233を跨ぐ(PCIeドメインを跨ぐ)パケットの送受信を可能とする。ここで、パケットは、通信対象のデータの一単位である。
第4に、NTB133,233は、NTB133,233を跨ぐパケットのアドレスを変換する機能を有する。
第5に、NTB133,233は、PCIeの標準規約で動作が定められているわけではないため、チップベンダ毎に異なった仕様にできる。
図5は、ストレージ装置の機能例を示す図である。図5では、主に、CPU110、NTB133,233、RP211およびUP232が有する機能を説明する。
CPU110は、送信制御部112を有する。
送信制御部112は、RAM120に記憶されたプログラムがCPU110により実行されることで実現されてもよいし、所定のプロセッサ(例えば、ASICやFPGAなどのハードウェア)により実現されてもよい。
送信制御部112は、DMAによるデータ転送の準備処理を行い、DMA制御部131にデータ転送を指示する。具体的には、送信制御部112は、CM200の実メモリ空間に対するデータ転送用のDMA起動情報を生成し、DMA制御部131に提供して、データ転送用のパケットを、DMA制御部131を用いて送信する。なお、送信制御部112のDMAによるデータ転送は、CM200へのデータ送信であるともいえる。
また、送信制御部112は、DMAによるデータ転送のためのDMA起動情報に加えて、UESTS211a,232a,233aに格納されたエラー情報を読み出すためのDMA起動情報を生成し、DMA制御部131に提供する。こうして、送信制御部112は、UESTS211a,232a,233aのREADコマンドを含むパケットをDMA制御部131の機能によりCM200に送信する。ここで、エラー情報は、RP211、UP232およびNTB233の各デバイスによるエラーの検出結果の情報である。送信制御部112は、UESTS211a,232a,233aから取得されたエラー情報をRAM120に格納する。
送信制御部112は、RAM120に格納されたエラー情報に基づいて、CM200によるデータの受信状況の確認(データの送達確認)を行う。送信制御部112は、CM200により適切にデータが受信されたと判定すると、今回のデータ転送を終了し、次のデータ転送に移る。送信制御部112は、CM200により適切にデータが受信されていないと判定すると、今回のデータの再送を行う。
ここで、送信制御部112は、CM100におけるメモリ空間の所定のメモリアドレス(単にアドレスと称することがある)を指定して、CM200に対するコマンドを発行する(詳細は後述される)。CM100により発行されるパケットは、アクセス先のデバイスに応じたアドレスを含む。
NTB133は、アドレス変換部133aを有する。アドレス変換部133aは、所定のプロセッサ(例えば、ASICやFPGAなどのハードウェア)により実現される。
アドレス変換部133aは、パケットのアドレス変換を行う。アドレス変換部133aは、CM100側のアドレスをCM200側のアドレスに変換することもあるし、CM200側のアドレスをCM100側のアドレスに変換することもある。アドレス変換部133aは、後述するメモリ空間におけるデバイスアドレスのレイアウトに従ってアドレスの変換を行う。
RP211は、エラー検出部211bを有する。エラー検出部211bは、所定のプロセッサ(例えば、ASICやFPGAなどのハードウェア)により実現される。
エラー検出部211bは、RP211におけるアンコレクタブルエラーを検出するエラー検出機能である。例えば、エラー検出部211bは、パケットに付加されたCRC(Cyclic Redundancy Check)の値によるデータ化けの検出や、パケットのシーケンス番号によるパケット欠落の検出などを行う。
エラー検出部211bは、検出したアンコレクタブルエラーの情報をUESTS211aに格納する。エラー検出部211bは、32ビットのエラー情報をUESTS211aに格納する。エラーが検出されていない場合、エラー検出部211bは、エラー情報を0(=0x00000000)とする。エラーが検出された場合、エラー検出部211bは、エラー情報に含まれる各ビットのうちエラーに応じたビットに1を設定する。
UP232は、エラー検出部232bを有する。エラー検出部232bは、所定のプロセッサ(例えば、ASICやFPGAなどのハードウェア)により実現される。
エラー検出部232bは、UP232におけるアンコレクタブルエラーを検出するエラー検出機能である。エラー検出部232bは、検出したアンコレクタブルエラーの情報をUESTS232aに格納する。エラー検出部232bによるエラー検出やエラー情報の設定方法は、エラー検出部211bと同様である。
NTB233は、エラー検出部233bおよびアドレス変換部233cを有する。エラー検出部233bおよびアドレス変換部233cは、所定のプロセッサ(例えば、ASICやFPGAなどのハードウェア)により実現される。
エラー検出部233bは、NTB233におけるアンコレクタブルエラーを検出するエラー検出機能である。エラー検出部233bは、検出したアンコレクタブルエラーの情報をUESTS233aに格納する。エラー検出部233bによるエラー検出やエラー情報の設定方法は、エラー検出部211bと同様である。
アドレス変換部233cは、パケットのアドレス変換を行う。アドレス変換部233cは、CM100側のアドレスをCM200側のアドレスに変換することもあるし、CM200側のアドレスをCM100側のアドレスに変換することもある。アドレス変換部233cは、後述するメモリ空間に対するデバイスアドレスのレイアウトに従ってアドレスの変換を行う。
図6は、他CM上のデバイスへのアクセス例を示す図である。前述のように、NTB233は、CPU110に対して、NTB233のデバイス空間を認識させる機能をもつ。このため、CPU110は、NTB233のデバイス空間を、CPU110が認識するアドレス空間にマッピングし、マッピングした所定のアドレスへアクセスすることで、NTB233のUESTS233aへアクセスすることができる。
また、NTB133,233は、NTB133,233を跨ぐパケットを送受信可能である。例えば、NTB133は、NTB233へパケットを送信する。また、NTB233は、NTB133へパケットを送信する。このとき、NTB133,233は、次のようにパケットのアドレスを変換する。
NTB133は、CPU110により指定されたUESTS233aに対応するアドレス(CM100側のアドレス)を、CM200側のアドレスに変換する。
NTB233は、NTB133から受信したパケットのUESTS232aに対応するアドレスを、UESTS232aに対応するCM200側のアドレスに変換する。また、NTB233は、NTB133から受信したパケットのUESTS211aに対応するアドレスを、UESTS211aに対応するCM200側のアドレスに変換する。
図7は、メモリ空間の例を示す図である。CPU110が認識するメモリ空間は、アドレスの小さい方から順に、自メモリ空間、他NTB領域、予約領域および他メモリ空間に区分される。
自メモリ空間は、RAM120の実メモリ空間およびCM100側のPCIeデバイスに対応するアドレスを含むメモリ空間である。第2の実施の形態の例では、RAM120の記憶容量は約8ギガバイト(GB:Giga Bytes)である。なお、図中“0x00000000”などの表記の単位は、バイト(B:Bytes)である。すなわち、アドレスの1単位は1バイト(B)に相当する。
他NTB領域は、CM200のNTB233に対応するアドレス空間である。CPU110は、UESTS233aに対応する他NTB領域上のアドレスを指定してReadリクエストを発行することで、UESTS233aの情報を読み出す。
予約領域は、予め確保されたオフセット領域である。
他メモリ空間は、CM200側のメモリ空間(CM200における自メモリ空間に相当するメモリ空間)がマッピングされる領域である。
図7の例では、自メモリ空間のアドレス範囲は“0x0_00000000”〜“0x2_1FFFFFFF”である。他NTB領域のアドレス範囲は“0x2_20000000”〜“0x2_20000FFF”である。予約領域のアドレス範囲は“0x2_20001000”〜“0x2_FFFFFFFF”である。他メモリ空間のアドレス範囲は“0x3_00000000”〜“0x5_20000000”(より厳密には“0x5_1FFFFFFF”まで)である。
ここで、自メモリ空間は、Extended機構による拡張領域を含む。自メモリ空間のサイズ(RAM120のサイズ)は、拡張領域以外のサイズ(8GB)に拡張領域分のサイズを加えたサイズとなる。
Extended機構とは、自CMのPCIeデバイスに対応するアドレスをマッピングした拡張領域をメモリ空間に設け、拡張領域のアドレスを指定したメモリリクエスト(Read/Write)を行うことで、PCIeデバイスにアクセスする仕組みである。
図7の例では、自メモリ空間のアドレス範囲のうち、拡張領域以外のアドレス範囲は“0x0_00000000”〜“0x0_DFFFFFFF”および“0x1_00000000”〜“0x2_1FFFFFFF”である。拡張領域のアドレス範囲は“0x0_E0000000”〜“0x0_FFFFFFFF”である。
拡張領域は、更に、Extended空間、未使用領域およびMMIO(Memory Mapped Input / Output)領域を含む。
Extended空間は、自CMのPCIeデバイスに対応するアドレスが属する領域である。例えば、Extended空間のアドレス範囲は“0x0_E0000000”〜“0x0_EFFFFFFF”である。アドレス範囲“0x0_F0000000”〜“0x1_00000000”の領域に未使用領域およびMMIO領域が属する。
ここで、PCIeデバイスへのアクセスでは、バス番号(Bと表記する)、デバイス番号(Dと表記する)およびファンクション番号(Fと表記する)の組み合わせ(B:D:F)に対応するアドレスが指定される。例えば、CPU110は、所定のB:D:Fに対応するアドレスを指定することで、RP111、UP132またはNTB133のUESTSにアクセスする。
バス番号(B)の個数は最大で256個(8ビット)である。デバイス番号(D)の個数は最大で32個(5ビット)である。ファンクション番号(F)の個数は最大で8個(3ビット)である。
また、Extended空間は、4キロバイト(KB:Kilo Bytes)単位のブロックに区切られている。1つのブロックの先頭のアドレスが、B:D:Fの1つの組に対応する。そして、(B:D:F)=(0:0:0),(0:0:1),(0:0:2),・・・,(0:31:7),(1:0:0),・・・,(255:31:6),(255:31:7)というようにB,D,Fの順に、昇順に各ブロックに対応付けられる。
この場合、CPU110は、下記のように、PCIeデバイス上のUESTSにアクセスする。
例えば、該当のPCIeデバイス(例えば、UP132)が(B:D:F)=(1:0:0)で指定されるとする。そして、このPCIeデバイスのUESTSが(B:D:F)=(1:0:0)に対応するアドレスを基準としたオフセット0x10に対応しているとする。この場合、(B:D:F)=(1:0:0)にアクセスするには、0x0_E0000000+1バス番号分のアドレスにRead/Writeすればよい。また、該当のUESTSにアクセスするには、当該アドレスに上記オフセット分を加算したアドレスにアクセスすればよい。
具体的には、CPU110は、当該UESTSをReadする場合、次のようにExtended空間におけるアクセス先のアドレスX1を計算する。
X1=0x0_E0000000+1MB*1+0x10=0x0_E0100010
ここで、1MBは1メガバイト(Mega Bytes)を示す。ただし、1MB=1024KB、1KB=1024Bとする。1MB分のオフセットを加算する理由は次の通りである。1つのバス番号には、32個のデバイス番号が属し、8*32=256個のファンクション番号が属する。1ファンクション番号当たりのブロックサイズは4KBなので、バス番号B=1に相当するオフセット(Extended空間の先頭に対するオフセット)は、256*4KB=1MBである。このため、Extended空間の先頭“0x0_E0000000”に1MBに相当するオフセット“0x100000”を加算することになる。
また、該当のPCIeデバイス(例えば、RP111)が(B:D:F)=(0:3:0)で指定されるとする。そして、このPCIeデバイスのUESTSが(B:D:F)=(0:3:0)に対応するアドレスを基準としたオフセット0x10に対応しているとする。
CPU110は、当該UESTSをReadする場合、次のようにExtended空間におけるアクセス先のアドレスX2を計算する。
X2=0x0_E0000000+32KB*3+0x0_00000010=0x0_E0018010
ここで、32KB*3=96KB分のアドレスを加算する理由は次の通りである。1つのデバイス番号には、8個のファンクション番号が属する。1ファンクション番号当たりのブロックサイズは4KBなので、デバイス番号D=3に相当するオフセット(Extended空間の先頭に対するオフセット)は、8*4KB*3=32KB*3=96KBである。このため、Extended空間の先頭“0x0_E0000000”に96KBに相当するオフセット“0x18000”を加算することになる。
拡張領域における未使用領域は、未使用の領域である。
MMIO領域は、MMIOに用いられる領域である。
上記のメモリ空間に関する情報は、CM100,200が備える所定の記憶装置(RAM120でもよいし、RAM120以外の記憶装置でもよい)に予め格納される。また、RP111,211およびUP132,232の各UESTSに対応するB:D:Fの組み合わせは、CM100,200が備える所定の記憶装置に予め格納される。
図8は、他CM上のデバイスのUESTSに対するアクセス例を示す図である。CPU110は、次のようにして、CM200(他CM)のUESTS233a,232a,211aにアクセス可能である。
まず、UESTS233aに対するReadの場合、CPU110は、メモリ空間における他NTB領域のUESTS233aに対応するアドレスを指定してメモリリクエスト(Read)のパケットを発行する。当該パケットは、RP111、UP132を経由してNTB133に到達する。NTB133は、パケットに含まれるアドレスを、CM200側で管理されるUESTS233aに対応するアドレスに変換して、NTB233に送信する。NTB233は、受信したパケットに応じて、UESTS233aからエラー情報を読み取り、エラー情報を含むパケットを生成してNTB133に応答する。NTB133は、応答として受信したパケットを、UP132およびRP111を介してCPU110に送信する。
なお、NTB233によりエラー情報を含むパケットを応答するものとしたが、CPU210により、メモリリクエストに応じたUESTS233aのReadを実行し、CPU210によりエラー情報を含むパケットをNTB133に応答してもよい。
次に、UESTS232a,211aに対するReadの場合、CPU110は、他メモリ空間に含まれるExtended空間のUESTS232a,211aに対応するアドレスを指定してメモリリクエスト(Read)のパケットを発行する。ここで、CPU110,210が認識するメモリ空間のレイアウトは共通である。
したがって、CPU110は、自身のExtended空間におけるUP132のUESTSに対応するアドレスに“0x3_00000000”のオフセットを加算することで、UESTS232aに対応するアドレスを指定できる。図7のメモリレイアウト例によれば、自メモリ空間のアドレスに対する他メモリ空間のアドレスのオフセットは、“0x3_00000000”だからである。UESTS211aについても同様である。
当該パケットは、RP111、UP132およびNTB133を経由して、NTB233に到達する。NTB233は、パケットに含まれるアドレスを、CM200側で管理されるアドレスに変換する。前述の例でいえば、NTB233は、CM100側から指定されたアドレスに対して加算されているオフセット分“0x3_00000000”を減算する変換を行えばよい。NTB233は、UP232およびRP211を介して、CPU210に当該パケットを転送する。CPU210は、受信したパケットがExtended空間に対するメモリリクエストであると判断すると、当該メモリリクエストで指定されたアドレスに対応するUESTS211aまたはUESTS232aからエラー情報を読み出す。CPU210は、読み出したエラー情報を含むパケットを発行し、NTB233,133を介して、CPU110に応答する。
次に、CM100による送達確認を含むデータ転送の手順を説明する。
図9は、CMのDMAによるデータ転送例を示すフローチャートである。以下、図9に示す処理をステップ番号に沿って説明する。
(S1)送信制御部112は、初期設定を行う。具体的には、送信制御部112は、RAM120に確保されたNTB233、UP232およびRP211用の記憶領域(各UESTSの読み出し結果を格納する領域)を所定値で初期化する。送信制御部112は、所定値を、例えば、0xEEEEEEEEとする(理由は後述される)。
(S2)送信制御部112は、DMA準備を行う。具体的には、送信制御部112は、DMAによるデータ転送の準備(データ転送用のメモリリクエストの生成など)やUESTS233a,232a,211aのRead用のメモリリクエストの生成を行う。送信制御部112は、当該Read用のメモリリクエストの生成の際に、他メモリ空間におけるUESTS233a,232a,211aに対応するアドレスの計算も行う。
(S3)送信制御部112は、DMA起動を行う。具体的には、送信制御部112は、DMA制御部131の機能によって、ステップS2で生成した各種のメモリリクエストを、NTB133を介してCM200に送信する。これにより、DMAのメモリリクエストに応じてDMAによるCM100からCM200へのデータ転送が開始されるとともに、各UESTSのReadのメモリリクエストに応じて各UESTSの読み出し結果がCM200からCM100へ応答される。送信制御部112は、各UESTSの読み出し結果を、RAM120の所定の領域に格納する。
(S4)送信制御部112は、DMA制御部131からDMAによるデータ転送が完了した旨を示す割り込みを受け付けることで、DMA完了を検出する。
(S5)送信制御部112は、RAM120を参照して、NTB233(他NTB)のUESTS233aから取得したエラー情報が0であるか否かを判定する。0である場合、処理をステップS6に進める。0でない場合、処理をステップS9に進める。
(S6)送信制御部112は、RAM120を参照して、UP232(他UP)のUESTS232aから取得したエラー情報が0であるか否かを判定する。0である場合、処理をステップS7に進める。0でない場合、処理をステップS9に進める。
(S7)送信制御部112は、RAM120を参照して、RP211(他RP)のUESTS211aから取得したエラー情報が0であるか否かを判定する。0である場合、処理をステップS8に進める。0でない場合、処理をステップS9に進める。
(S8)送信制御部112は、DMAによるデータの転送に成功したと判断する。そして、送信制御部112は、処理を終了する。
(S9)送信制御部112は、DMAによるデータの転送に失敗したと判断する。この場合、送信制御部112は、該当のデータの再送処理を行う。送信制御部112は、再送時の受信状況の確認も、ステップS1〜S9の手順を用いて行う。そして、送信制御部112は、処理を終了する。
ここで、ステップS1においてRAM120のUESTSの保持領域を0xEEEEEEEEで初期化する理由は次の通りである。例えば、0(0x00000000)で初期化すると、エラーなしと同じ値となり、該当の保持領域が更新されない場合に、正常なのか異常なのかを判断できないことになる。また、例えば、1(0x00000001)で初期化すると、所定のエラー時と同じ値となり、該当の保持領域が更新されない場合に、エラーを誤判断するおそれがある。更に、例えば、オールF(0xFFFFFFFF)で初期化すると、デバイスが無応答でタイムアウトとなった場合と同じ値となり、該当の保持領域が更新されない場合に、タイムアウトが発生したのか、保持領域が更新されなかったのかを判断できない。そこで、送信制御部112は、エラー情報として用いられない0xEEEEEEEEで、各保持領域を初期化することで、タイムアウトやエラーなどを、保持領域の無更新の場合と区別して検出可能となる。
なお、上記の手順では、通常のDMAによるデータ転送に比べて、UESTS233a,232a,211aをReadするためのDMA起動情報(メモリリクエスト)を生成する処理と、取得した各エラー情報による転送成否の判定が追加となる。これらの2つの処理の追加のデータ転送に対する影響はほぼ無いと考えてよい。理由は次の通りである。
第1に、送信制御部112は、DMA起動情報の生成を、元々行っていたデータ転送用のDMA起動情報の生成処理に組み込める。具体的には、送信制御部112は、両DMA起動情報の生成箇所をRAM120上のメモリ空間の連続領域とすることで、両情報に高速にアクセスでき(キャッシュヒットを期待でき)、当該生成処理による性能への影響はほぼ無いと考えてよい。
第2に、送信制御部112は、DMA完了後のエラー情報による判定では、UESTS233a,232a,211aから読み出したエラー情報を、DMA完了の処理で使用したRAM120上のメモリ空間の連続領域に格納する。このため、送信制御部112は、エラー情報に高速にアクセスでき(キャッシュヒットを期待でき)、当該判定処理による性能への影響はほぼ無いと考えてよい。
次に、CM100によるUP232のUESTS232aおよびRP211のUESTS211aに対するアクセスの具体例を説明する。
図10は、他UPのUESTSに対するアクセス例を示す図である。ここで、各デバイスのB:D:Fの値は、次の通りであるとする。RP111,211は、(B:D:F)=(0:3:0)である。DMA制御部131,231は、(B:D:F)=(1:0:1)である。UP132,232は、(B:D:F)=(1:0:0)である。NTB133,233は、(B:D:F)=(2:0:0)である。
また、UESTS232aのアドレスは、UP232のアドレスに対してオフセット0x10である。この場合、CM100は、次のように、UESTS232aに格納されたエラー情報を読み出す。
(1)DMA制御部131は、DMA READコマンドを含むアクセス要求のパケットを、NTB133を介してCM200に送信する。DMA制御部131は、DMA READコマンドにおいて、READ先アドレスとして、“0x3_E0100010”を指定する。
(2)NTB233は、NTB133から当該パケットを受信すると、READ先アドレスを、“0x3_E0100010”から“0x3_00000000”を減算した“0x0_E0100010”に変換して、CPU210に送信する。
(3)CPU210は、“0x0_E0100010”がRAM220のExtended領域に対応するデバイス宛であると判断し、“0x0_E0100010”に対応するデバイスであるUP232を特定する。
(4)CPU210は、該当のアドレスに対応するUESTS232aのREAD要求をUP232に送信する。
(5)UP232は、READ要求で指定されたUESTS232aのエラー情報を読み出し、エラー情報を含むREAD応答をCPU210に送信する。
(6)CPU210は、UESTS232aから読み出されたエラー情報を、NTB233,133を介して、DMA制御部131に応答する(DMA READに対する応答)。DMA制御部131は、受信したエラー情報をCPU110に通知する。DMA制御部131は、受信したエラー情報を、RAM120の所定の領域に書き込んでもよい。
図11は、他RPのUESTSに対するアクセス例を示す図である。UESTS211aのアドレスは、RP211のアドレスに対してオフセット0x10である。この場合、CM100は、次のように、UESTS211aに格納されたエラー情報を読み出す。
(1)DMA制御部131は、DMA READコマンドを含むアクセス要求のパケットを、NTB133を介してCM200に送信する。DMA制御部131は、DMA READコマンドにおいて、READ先アドレスとして、“0x3_E0018010”を指定する。
(2)NTB233は、NTB133から当該パケットを受信すると、READ先アドレスを、“0x3_E0018010”から“0x3_00000000”を減算した“0x0_E0018010”に変換して、CPU210に送信する。
(3)CPU210は、“0x0_E0018010”がRAM220のExtended領域に対応するデバイス宛であると判断し、“0x0_E0018010”に対応するデバイスであるRP211を特定する。
(4)CPU210は、該当のアドレスに対応するUESTS211aからエラー情報の読み出しを行う。
(5)CPU210は、UESTS211aから読み出されたエラー情報を、NTB233,133を介して、DMA制御部131に応答する(DMA READに対する応答)。DMA制御部131は、受信したエラー情報をCPU110に通知する。DMA制御部131は、受信したエラー情報を、RAM120の所定の領域に書き込んでもよい。
次に、送信制御部112による異常検出の具体例を説明する。
図12は、異常検出の例(その1)を示す図である。前述のように送信制御部112は、RAM120に、3つの領域121,122,123を設ける。領域121は、UESTS233aから読み出したエラー情報を格納する領域である。領域122は、UESTS232aから読み出したエラー情報を格納する領域である。領域123は、UESTS211aから読み出したエラー情報を格納する領域である。
送信制御部112は、DMAの準備処理において、領域121,122,123に“0xEEEEEEEE”を設定する(ST1)。
そして、送信制御部112は、DMAによるデータ転送と共に、UESTS233a,232a,211aから読み出したエラー情報を領域121,122,123に格納する(ST2)。図12の例では、領域121には、“0x00100000”が格納される。領域122には、“0x00000000”が格納される。領域123には、“0x00000000”が格納される。
送信制御部112は、領域121,122,123の値に基づいて、NTB233において、アンコレクタブルエラーが発生したことを検出する。領域121に、所定のエラーに対応する値“0x00100000”が格納されているからである。エラー情報では、エラーに応じた位置にビットが立つことになる。このため、送信制御部112は、エラー情報を参照して、アンコレクタブルエラーの種別を判断することもできる。
例えば、UESTSに要因が立つ(所定のビットに“1”が設定される)エラーの場合、送信制御部112は、該当のデバイスによるエラーハンドリングが可能なレベルの異常であると判断できる。また、無応答となるエラーの場合、送信制御部112は、該当のデバイスによるエラーハンドリングが不可能なレベルの異常であると判断できる。
なお、この場合、送信制御部112は、UP232およびRP211では、アンコレクタブルエラーが発生していないと判断する。領域122,123には、何れもエラーなしを示す“0x00000000”が設定されているからである。
送信制御部112は、CM200で適切にデータを受信できていないと判断し、該当のデータの再送処理を行う。
図13は、異常検出の例(その2)を示す図である。送信制御部112は、DMAの準備処理において、領域121,122,123に“0xEEEEEEEE”を設定する(ST11)。
そして、送信制御部112は、DMAによるデータ転送と共に、UESTS233a,232a,211aから読み出したエラー情報を領域121,122,123に格納する(ST12)。図13の例では、領域121には、“0x00000000”が格納される。領域122には、“0xFFFFFFFF”が格納される。領域123には、“0x00000000”が格納される。
ここで、“0xFFFFFFFF”が領域122に格納されたのは、UP232が無応答のままタイムアウトとなったからである。この場合、送信制御部112またはDMA制御部131により当該タイムアウトを検出して、“0xFFFFFFFF”を設定する。
送信制御部112は、領域121,122,123の値に基づいて、UP132において何らかのエラーが発生したことを検出する。また、送信制御部112は、領域122の値が“0xEEEEEEEE”(初期値)のまま変更されていない場合にも、同様に、UP132において何らかのエラーが発生したことを検出する。
送信制御部112は、CM200で適切にデータを受信できていないと判断し、該当のデータの再送処理を行う。また、上記のように、CM200で該当のデバイスによるエラーハンドリングが不可能な異常が発生した場合にも、CM100側の情報によって、CM200における異常の要因となった被疑デバイスを特定できる。
なお、この例では、領域121,123には、何れもエラーなしを示す“0x00000000”が設定されている。このため、送信制御部112は、NTB233,211では、アンコレクタブルエラーが発生していないと判断する。
ここで、再送処理において、送信制御部112は、アンコレクタブルエラーの種別に応じて、再送処理の方法を選択してもよい。例えば、送信制御部112は、アンコレクタブルエラーの内容から、該当のデバイスによるエラーハンドリングが可能なレベルであるか否かなどを判断して、再送処理の方法を選択することが考えられる。より具体的には、送信制御部112は、エラーハンドリングが不可能なレベルの異常の場合には、CM200により該当のデバイスを再起動またはリセットさせてから再送することが考えられる。また、送信制御部112は、エラーハンドリングが可能なレベルの異常の場合には、該当のデバイスを再起動させずに再送することが考えられる。
また、送信制御部112は、CM100が出力するログに、CM200側から取得したアンコレクタブルエラーの内容を記録してもよい。あるいは、送信制御部112は、CM100が備える表示パネルに、当該エラー内容を表示させてもよい。こうして、CM100は、CM200における異常原因のユーザによる調査を支援することもできる。
次に、データの受信状況の確認機能の比較例を説明する。
図14は、データの受信状況の確認機能の比較例を示す図である。CM100(送信元)からCM200(送信先)へDMAによるデータ送信を行った際に、次のような受信状況の確認方法も考えられる。まず、CM100は、DMA通信によりCM200にデータを送信する(ステップS101)。
CM100は、DMA通信が完了すると、データが適切に受信されたことを確認する確認要求のメッセージ(MSG:Message)をCM200に送信する(ステップS102)。
CM200は、確認要求のメッセージを受信すると、当該確認要求に応じて、DMAによるデータ受信を適切に行ったか否かを確認する(ステップS103)。例えば、CM200は、データ受信を適切に行っていない場合、どのデバイスでどのような異常が発生したかを確認することも考えられる。
CM200は、確認結果を含む確認応答のメッセージをCM100に送信する。CM100は、確認応答のメッセージを受信すると、当該確認応答により、CM200によりデータが適切に受信されたか否かを判断する(ステップS104)。
このように、DMA通信後にCM100からCM200に確認要求のメッセージを送信し、CM200からCM100に確認応答のメッセージを送信して、受信状況の確認を行うことも考えられる。しかし、この方法では、メッセージ送受信やメッセージ処理のオーバヘッドによって受信状況の確認を実現するのに時間がかかる。例えば、一連のメッセージの送受信およびCM200側での確認処理に伴う所要時間が、ミリ秒〜秒程度のオーダーに達することもある。
これに対し、CM100は、CM200においてデータ送信の経路上にあるNTB233、UP232およびRP211のエラー検出機能を、データの受信状況の確認に利用する。このため、CM100,200の間で、受信状況の確認用のメッセージを送受信しなくてもよくなる。また、CM200に受信データの確認処理を実行しなくてもよくなる。その結果、CM100,200間の受信状況の確認に伴う通信量、および、CM100,200の負荷が軽減される。そして、受信状況の確認に伴う所要時間を短縮できる。例えば、CM100による受信状況の確認の所要時間を、ナノ秒〜マイクロ秒程度のオーダーに抑えられる。すなわち、データ送信元のCM100から、CM200側の異常を直接検出することにより、性能劣化を抑えてデータの受信状況の確認を実現できる。こうして、データの受信状況の確認を効率化できる。
また、データ送信中にNTB233、UP232およびRP211でアンコレクタブルエラーが検出されている場合、データ送信が適切に行えていないと考えられる。そこで、NTB233、UP232およびRP211でアンコレクタブルエラーが検出されている場合には、CM100は、CM200が適切にデータを受信できていないと判断して、再送などのリカバーを行う。
これにより、ストレージ装置50におけるCM100,200間の連携を適切に行える。その結果、ストレージ装置50の信頼性の向上を図れる。特に、CM100,200の冗長制御は、適切にデータを送受信できることが前提となる。例えば、CM100からCM200へのデータ送信に失敗したまま、CM100が縮退すると、RAM120上のデータが揮発して正常データが喪失されることになり、データの不整合が発生してしまう。このため、データの送達保証による信頼性向上は、CM100,200において特に重要であり、受信状況の確認を高速実行する意義は大きい。
更に、前述のように、CM100は、NTB233、UP232およびRP211(複数の接続ポート)のうち、アンコレクタブルエラーを検出したデバイス(接続ポート)を、データの受信に失敗した要因と決定し、ログなどに出力することもできる。これにより、異常原因のユーザによる調査を支援することもできる。
図15は、ストレージ装置の他のハードウェア例(その1)を示す図である。これまでの説明では、PCIeスイッチ130,230を接続する例を示したが、CM100の複数のPCIeスイッチと、CM200の複数のPCIeスイッチとを接続することもできる。
例えば、CM100は、PCIeスイッチ130,140に加えて、PCIeスイッチ130a,130bを更に有してもよい。PCIeスイッチ130a,130bは、PCIeスイッチ130と同様に、DMA制御部、UPおよびNTBを備える。
また、CM200は、PCIeスイッチ230,240に加えて、PCIeスイッチ230a,230bを更に有してもよい。PCIeスイッチ230a,230bは、PCIeスイッチ230と同様に、DMA制御部、UPおよびNTBを備える。
この場合、PCIeスイッチ130a,230aを、PCIeスイッチ130a,230aそれぞれが備える2つのNTBを介して接続する。また、PCIeスイッチ130b,230bを、PCIeスイッチ130b,230bそれぞれが備える2つのNTBを介して接続する。図15の例では、CM100,200間に合計3つのパスが形成されることになる。ただし、CM100,200間のパスは2つでもよいし、4以上でもよい。CM100は1つまたは複数のパスを用いて、CM200へのデータのDMA転送を行う。この場合にも、CM100は、データ転送において、第2の実施の形態の方法による受信状況の確認をパス毎に行える。
図16は、ストレージ装置の他のハードウェア例(その2)を示す図である。更に、これまでの説明では、ストレージ装置50が2つのCM(CM100,200)を有する例を示したが、ストレージ装置50は、3以上のCMを有してもよい。例えば、CM100,200,300、および、CM100,200,300を相互に接続するPCIeスイッチ400をストレージ装置50に設けることもできる。
ここで、CM300は、CM100,200と同様に、CPU310、PCIeスイッチ330およびPCIeスイッチ340を有する。CPU310はRP311を有する。PCIeスイッチ330は、DMA制御部331、UP332およびNTB333を有する。CM300は、RAMも有するが、図16ではCM間の接続関係を主に表すため図示を省略している。
PCIeスイッチ400は、DW401,402,403を有する。DW401,402,403は、PCIeデバイスを接続するためのインタフェースである。
NTB133は、NTB233に代えて、DW401に接続される。NTB233は、NTB133に代えて、DW402に接続される。NTB333は、DW403に接続される。
PCIeスイッチ400は、DW401,402,403に接続されたCM100,200,300によるCM間のデータ通信を中継する。例えば、CM100は、NTB133およびDW401,402を介して、CM200へのDMAによるデータ転送を行える。この場合、CPU110は、NTB133およびDW401,402を介して、NTB233、UP232およびRP211の各UESTSを読み取り、データの受信状況の確認を行う。
また、CM100は、NTB133およびDW401,403を介して、CM300へのDMAによるデータ転送を行える。この場合、CPU110は、NTB133およびDW401,403を介して、NTB333、UP332およびRP311の各UESTSを読み取り、データの受信状況の確認を行う。
こうして、ストレージ装置50がCMを3以上有する場合でも、データの受信状況の確認の効率を容易に向上できる。