(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2025006189
(43)【公開日】2025-01-17
(54)【発明の名称】データ転送制御装置および情報処理装置
(51)【国際特許分類】
G06F 13/28 20060101AFI20250109BHJP
【FI】
G06F13/28 310C
【審査請求】未請求
【請求項の数】6
【出願形態】OL
(21)【出願番号】P 2023106833
(22)【出願日】2023-06-29
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110003649
【氏名又は名称】弁理士法人真田特許事務所
(74)【代理人】
【識別番号】100189201
【弁理士】
【氏名又は名称】横田 功
(72)【発明者】
【氏名】鈴木 利彦
(72)【発明者】
【氏名】木村 崇彦
(57)【要約】
【課題】DSC(ディスクリプタ)がメモリに連続して格納されていない場合においても、回路規模の増大を抑制しつつ、装置の性能を向上できるようにする。
【解決手段】DMA(Direct Memory Access)による装置間のデータ転送をDSCに基づき実行する制御装置は、メモリの第1アドレスに格納された第1DSCと、メモリに格納された1以上のDSCとを含む所定数のDSCに相当するサイズのデータを第1アドレスからバッファに書き込み、当該データに基づき、メモリにDSCが第1DSCから連続して格納されているか否かを判定し、連続していない場合、当該データのうちの、第1DSCから連続する1以上のDSCにおける最後の第2DSCに続くデータをバッファから破棄し、第2DSCが示すメモリの第2アドレスから、第2アドレスに格納された第3DSCを含む所定数のDSCに相当するサイズのデータをバッファに書き込む。
【選択図】
図6
【特許請求の範囲】
【請求項1】
DMA(Direct Memory Access)による処理装置間のデータ転送をディスクリプタに基づき実行するデータ転送制御装置であって、
第1処理装置が備える第1メモリの第1アドレスに格納された第1ディスクリプタと、前記第1メモリに格納された1以上のディスクリプタとを含む所定数のディスクリプタに相当するサイズのデータを前記第1アドレスから読み出してバッファに書き込み、
読み出された前記データに基づき、前記第1メモリにディスクリプタが前記第1ディスクリプタから連続して格納されているか否かを判定し、
前記第1メモリにディスクリプタが連続して格納されていないと判定された場合、前記データのうちの、前記第1ディスクリプタから連続する1以上のディスクリプタにおける最後の第2ディスクリプタに続くデータを前記バッファから破棄し、
前記第2ディスクリプタが示す前記第1メモリの第2アドレスから、前記第2アドレスに格納された第3ディスクリプタを含む前記所定数のディスクリプタに相当するサイズのデータを読み出して前記バッファに書き込む、
制御部を備える、データ転送制御装置。
【請求項2】
前記制御部は、
前記バッファから読み出されたディスクリプタに対応するデータを、前記DMAにより前記第1メモリから第2処理装置が備える第2メモリにデータ転送し、
前記データ転送がエラーにより失敗した場合、前記エラーの発生箇所に関する情報を含むエラー情報に基づき、前記第1メモリからの前記所定数のディスクリプタの読み出しを制御するための制御情報の巻き戻し先を決定し、
決定された前記巻き戻し先の状態に前記制御情報を巻き戻し、
前記エラーの発生箇所に関する情報を前記第1処理装置のプロセッサに通知する、
請求項1に記載のデータ転送制御装置。
【請求項3】
前記制御部は、
前記プロセッサからの再開の指示の受信に応じて、巻き戻された前記制御情報が示す前記第1メモリの第3アドレスから、前記第3アドレスに格納された第4ディスクリプタを含む前記所定数のディスクリプタに相当するサイズのデータを読み出して前記バッファに書き込む、
請求項2に記載のデータ転送制御装置。
【請求項4】
前記判定は、前記第1メモリにおける前記ディスクリプタの格納アドレスと前記ディスクリプタのデータサイズとを加算した値と、前記ディスクリプタに設定された、次のディスクリプタの格納アドレスと、が一致するか否かを、前記第1ディスクリプタから順に判定する処理を含む、
請求項1~請求項3のいずれか1項に記載のデータ転送制御装置。
【請求項5】
前記所定数は、前記第1メモリに格納されたディスクリプタの数から前記バッファに書き込まれたディスクリプタの数を減算した数、及び、予め設定された最大数であって前記第1メモリから前記バッファに一度に読み出すディスクリプタの前記最大数、のうちのいずれか小さい数である、
請求項1~請求項3のいずれか1項に記載のデータ転送制御装置。
【請求項6】
プロセッサと、
メモリと、
DMA(Direct Memory Access)による情報処理装置間のデータ転送をディスクリプタに基づき実行するデータ転送制御装置と、を備え、
前記データ転送制御装置は、
前記メモリの第1アドレスに格納された第1ディスクリプタと、前記メモリに格納された1以上のディスクリプタとを含む所定数のディスクリプタに相当するサイズのデータを前記第1アドレスから読み出してバッファに書き込み、
読み出された前記データに基づき、前記メモリにディスクリプタが前記第1ディスクリプタから連続して格納されているか否かを判定し、
前記メモリにディスクリプタが連続して格納されていないと判定された場合、前記データのうちの、前記第1ディスクリプタから連続する1以上のディスクリプタにおける最後の第2ディスクリプタに続くデータを前記バッファから破棄し、
前記第2ディスクリプタが示す前記メモリの第2アドレスから、前記第2アドレスに格納された第3ディスクリプタを含む前記所定数のディスクリプタに相当するサイズのデータを読み出して前記バッファに書き込む、
制御部を備える、情報処理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、データ転送制御装置および情報処理装置に関する。
【背景技術】
【0002】
ストレージ装置が備える複数のCM(Controller Module)間のデータ転送は、CMが備えるデータ転送制御装置、例えばDMA(Direct Memory Access)コントローラによるDMAにより実行される。DMAは、以下の(1)~(3)の処理を含む。
【0003】
(1)ディスクリプタのフェッチ
CMのCPU(Central Processing Unit)がメモリに1以上のディスクリプタ(DSC:Descriptor)を書き込み、DSCを書き込んだ先頭のメモリアドレスとDSC数とをDMAコントローラに通知することで、DMAを起動する。
【0004】
DSCは、所定のフォーマットを有する所定サイズ(例えば64バイト)のデータである。DSCには、DMAによるデータの転送元メモリアドレス及び転送先メモリアドレス,データ転送長(転送サイズ),次のディスクリプタが書き込まれたDSCメモリアドレス等が含まれる。
【0005】
DMAコントローラは、CPUから通知されたメモリアドレスからDSCをフェッチする。なお、DMAコントローラは、(2)の処理で参照したDSCにDSCメモリアドレスが含まれる場合、当該DSCメモリアドレスから次のDSCをフェッチする。
【0006】
(2)データ転送
DMAコントローラは、DSCに従い、転送元メモリアドレスからデータ転送長のデータをリードし、転送先メモリアドレスにデータをライトする。転送先メモリアドレスは、他のCMのメモリの空間である。
【0007】
(3)完了割り込み
DMAコントローラは、上記(1)及び(2)の処理をCPUから通知されたDSC数の回数実行した場合、CPUに完了の割り込みを発行する。
【0008】
ところで、DMAコントローラによる上記(2)の処理にかかる時間は、データ転送長に応じて変化する。データ転送長が小さい場合、例えばデータ転送長が4K(キロ)バイト未満である場合、データの転送には、1μs(マイクロ秒)程度の時間がかかる。当該時間は、データ転送長が大きくなるにつれて増加していく。
【0009】
一方、DMAコントローラによる上記(1)の処理にかかる時間も1μs程度である。このため、データ転送長が小さいデータの転送が連続して複数回実行される場合、複数回のデータの転送にかかる時間に対して、複数回のDSCのリードにかかる時間が無視できず、DMAコントローラを含むCMの性能低下が生じ得る。
【0010】
上記(1)の処理にかかる時間の内訳は、DSCのリードの準備やメモリとの通信にかかる時間が支配的であり、固定長(64バイト)のDSCのリード(転送)にかかる時間は僅かである。従って、1回のリード動作で複数のDSCをまとめてリードしたとしても、複数のDSCのフェッチにかかる時間を1μs程度に抑えることができ、1つあたりのDSCについて上記(1)の処理にかかる時間を短縮できる。
【0011】
しかし、複数のDSCのうち、最初のDSCのDSCメモリアドレスはCPUから通知されるが、2つ目以降のDSCのDSCメモリアドレスは、1つ前のDSCのリード完了後に、当該DSCに設定されたDSCメモリアドレスから特定される。このため、2つ目以降のDSCのDSCメモリアドレスを1つ前のDSCのリード完了前に特定できない。
【0012】
例えば、複数のDSCがメモリの連続領域に格納されていると仮定して、CPUから通知されたDSCメモリアドレスから複数のDSCを投機的にフェッチ(以下、「投機リード」と表記する場合がある)する技術が知られている。
【先行技術文献】
【特許文献】
【0013】
【発明の概要】
【発明が解決しようとする課題】
【0014】
メモリにおけるDSCの格納場所は、柔軟性を確保するため、連続領域又は非連続領域に自由に配置される。このため、DSCが非連続領域に格納されている場合、例えばCM間の緊急メッセージの転送においてDSCが離散した記憶領域(離散DSC領域)に格納されている場合、投機リードで得られたデータが適切なDSCでないこと、換言すれば投機リードに失敗することがある。
【0015】
上述した不都合は、ストレージ装置の複数のCM間におけるデータ転送に限定されるものではなく、種々の情報処理装置間におけるデータ転送においても同様に生じ得る。
【0016】
1つの側面では、本発明は、ディスクリプタがメモリに連続して格納されていない場合においても、回路規模の増大を抑制しつつ、情報処理装置の性能を向上できるようにすることを目的の1つとする。
【課題を解決するための手段】
【0017】
1つの側面では、データ転送制御装置は、DMAによる処理装置間のデータ転送をディスクリプタに基づき実行するデータ転送制御装置であって、以下の処理を行なう制御部を備えてよい。前記制御部は、第1処理装置が備える第1メモリの第1アドレスに格納された第1ディスクリプタと、前記第1メモリに格納された1以上のディスクリプタとを含む所定数のディスクリプタに相当するサイズのデータを前記第1アドレスから読み出してバッファに書き込んでよい。また、前記制御部は、読み出された前記データに基づき、前記第1メモリにディスクリプタが前記第1ディスクリプタから連続して格納されているか否かを判定してよい。さらに、前記制御部は、前記第1メモリにディスクリプタが連続して格納されていないと判定された場合、前記データのうちの、前記第1ディスクリプタから連続する1以上のディスクリプタにおける最後の第2ディスクリプタに続くデータを前記バッファから破棄してよい。また、前記制御部は、前記第2ディスクリプタが示す前記第1メモリの第2アドレスから、前記第2アドレスに格納された第3ディスクリプタを含む前記所定数のディスクリプタに相当するサイズのデータを読み出して前記バッファに書き込んでよい。
【発明の効果】
【0018】
1つの側面では、本発明は、ディスクリプタがメモリに連続して格納されていない場合においても、回路規模の増大を抑制しつつ、情報処理装置の性能を向上できる。
【図面の簡単な説明】
【0019】
【
図1】一実施形態に係るストレージ装置の構成例を示すブロック図である。
【
図2】
図1に示すDMA装置の構成例を示すブロック図である。
【
図3】DSC部による比較例に係るフェッチ処理を説明するための図である。
【
図4】DSC部による投機リード処理の一例を説明するための図である。
【
図5】投機リード処理におけるエラーの発生例を示す図である。
【
図6】一実施形態に係る制御部の構成例を示すブロック図である。
【
図7】CM間で発生する通信における各動作の一例を示す図である。
【
図8】
図7に示す通信におけるDSCのプリフェッチ例を示す図である。
【
図9】DSCのプリフェッチの他の例を示す図である。
【
図10】プリフェッチの有無による性能の測定結果の一例を示す図である。
【
図11】
図6に示す制御部の詳細な構成例を示すブロック図である。
【
図12】一実施形態に係るCMの動作例を説明するためのフローチャートである。
【
図13】一実施形態に係るCMにおけるリカバリ処理の動作例を説明するためのフローチャートである。
【
図14】一実施形態に係るストレージ装置の動作例を説明するためのシーケンス図である。
【
図15】一実施形態に係るストレージ装置の動作例を説明するためのシーケンス図である。
【
図16】一実施形態に係るストレージ装置の動作例を説明するためのシーケンス図である。
【発明を実施するための形態】
【0020】
以下、図面を参照して本発明の実施の形態を説明する。ただし、以下に説明する実施形態は、あくまでも例示であり、以下に明示しない種々の変形又は技術の適用を排除する意図はない。例えば、本実施形態を、その趣旨を逸脱しない範囲で種々変形して実施することができる。なお、以下の説明で用いる図面において、同一符号を付した部分は、特に断らない限り、同一若しくは同様の部分を表す。
【0021】
〔A〕一実施形態の構成例
図1は、一実施形態に係るストレージ装置1の構成例を示すブロック図である。ストレージ装置1は、コンピュータシステム又は情報処理システムの一例であり、例示的に、複数(
図1の例では2台)のCM2(
図1では「CM#0」,「CM#1」と表記する)を備える。
【0022】
なお、
図1では図示を省略するが、ストレージ装置1は複数の記憶装置を備えてよい。記憶装置は、種々のデータやプログラム等の情報を格納するハードウェアの一例である。記憶装置としては、HDD(Hard Disk Drive)等の磁気ディスク装置,SSD等の半導体ドライブ装置,不揮発性メモリ等の各種ストレージが挙げられる。不揮発性メモリとしては、例えば、フラッシュメモリ,SCM(Storage Class Memory),ROM(Read Only Memory)等が挙げられる。
【0023】
CM2は、ストレージ装置1の種々の制御を行なう処理装置,制御装置,コンピュータ又は情報処理装置の一例である。CM#0は第1処理装置の一例であり、CM#1は第2処理装置の一例である。CM2は、ストレージ装置1において冗長化(
図1の例では二重化)されており、ストレージ装置1の制御に用いる制御情報等のデータを共有、例えば同期するために、複数のCM2間でデータの転送を行なう。一実施形態では、当該データの転送がDMAによって実施されるものとする。
【0024】
CM2は、ハードウェア構成として、例示的に、CPU2a,メモリ2b,PCI(Peripheral Component Interconnect)スイッチ2c及びDMA装置3を備えてよい。なお、
図1では図示を省略するが、CM2は上述した記憶装置を備えてもよい。CPU2a,メモリ2b及びPCIスイッチ2c(並びに記憶装置)間は、バス2dを介して相互に通信可能に接続されてよい。
【0025】
バス2dは、1以上のチップセットと、複数種類のバスとを備えてよい。例えば、チップセットとCPU2aとの間はCPUバス,チップセットとメモリ2bとの間はメモリバス,チップセットとPCIスイッチ2cとの間はPCIe(PCI Express)バス等により相互に通信可能に接続されてよい。なお、CPU2a及びメモリをバス2dに接続する第1チップセットはCPU2aに実装されてもよい。また、PCIスイッチ2cはPCIスイッチ2cをバス2dに接続する第2チップセットに含まれてもよい。この場合、第1チップセットと第2チップセットとの間はシステムバスを介して相互に通信可能に接続されてもよい。バス2dは、その他の既知の種々の態様で実装されてもよい。
【0026】
CPU2aは、種々の制御や演算を行なうプロセッサ又は演算処理装置の一例である。なお、CPU2aは、複数のプロセッサを含むマルチプロセッサであってもよいし、複数のプロセッサコアを有するマルチコアプロセッサであってもよく、或いは、マルチコアプロセッサを複数有する構成であってもよい。
【0027】
CM2は、CPU2aに代えて又は加えて、種々のプロセッサを備えてもよい。プロセッサとしては、例えば、MPU,APU,DSP,ASIC,FPGA等の集積回路(IC)が挙げられる。MPUはMicro Processing Unitの略称である。APUはAccelerated Processing Unitの略称である。DSPはDigital Signal Processorの略称である。ASICはApplication Specific ICの略称であり、FPGAはField Programmable Gate Arrayの略称である。
【0028】
メモリ2bは、種々のデータやプログラム等の情報を格納するハードウェアの一例である。メモリ2bとしては、例えばDRAM(Dynamic Random Access Memory)を含むDIMM(Dual Inline Memory Module)等の揮発性メモリ,PM(Persistent Memory)等の不揮発性メモリ、の一方又は双方が挙げられる。
【0029】
例えば、CM2のCPU2aは、記憶装置等に格納された所定のプログラムをメモリ2bに展開して実行することにより、CM2としての機能を実現できる。
【0030】
PCIスイッチ2cは、PCIe規格に準拠したスイッチであり、CPU2a及びメモリ2bの各々とDMA装置3との間,自身のCM2と他のCM2が備えるPCIスイッチ2cとの接続及び通信の制御等を行なう通信IF(Interface)の一例である。例えば、PCIスイッチ2cは、DMA装置3と複数のPCIeバス(レーン)を介して相互に通信可能に接続されてよい。また、PCIスイッチ2cは、他のCM2が備えるPCIスイッチ2cと複数のPCIeバス(レーン)を介して相互に通信可能に接続されてよい。
【0031】
なお、
図1では図示を省略するが、CM2は、他の種々の通信規格、例えばイーサネット(登録商標),インフィニバンド,ミリネット等の種々の通信規格に準拠したアダプタを含んでもよい。当該アダプタは、無線及び有線の一方又は双方の通信方式に対応してよい。また、当該アダプタは、例えば、FC(Fibre Channel)等の光通信に準拠してもよい。
【0032】
DMA装置3は、DMAによるCM2間のデータ転送をDSCに基づき実行するデータ転送制御装置又はDMAコントローラの一例であり、メモリ2b及び他のCM2が備えるメモリ2bに対するDMAを実行する。
【0033】
DMA装置3は、例えば、DMAにおいて、CPU2aを経由せずにメモリ2bに(直接)アクセスする。CPU2aを経由しないとは、例えばCPUコアによるメモリ2bへのアクセスの制御が介在しないことを意味してよい。例えば、第1チップセットがCPU2aに実装される場合には、DMA装置3は、DMAにおいて第1チップセットを経由する経路でメモリ2bにアクセスしてよい。
【0034】
例えば、CM#0のDMA装置3は、CM#0のPCIスイッチ2c及びバス2dを経由し、CM#0のCPUコアを経由しない経路でCM#0のメモリ2bにアクセスする。
【0035】
また、例えば、CM#0のDMA装置3は、CM#0のPCIスイッチ2c,CM#1のPCIスイッチ2c,CM#1のバス2dを経由し、CM#1のCPUコアを経由しない経路でCM#1のメモリ2bにアクセスする。
【0036】
〔A-1〕DMA装置の構成例
図2は、
図1に示すDMA装置3の構成例を示すブロック図である。DMA装置3は、例示的に、複数(
図2では2つ)のIF部31,複数(
図2では2つ)のプロトコル変換部32及び複数(
図2では4つ)の制御部4(
図2では「制御部#00」,「制御部#01」,「制御部#10」,「制御部#11」と表記する)を備えてよい。
【0037】
IF部31は、DMA装置3とPCIスイッチ2cとの間を接続するIFであり、例えばシリアライザを備えてよい。
【0038】
プロトコル変換部32は、データ(例えばパケット)のプロトコル変換を行なう。プロトコル変換部32は、例えば、PCIスイッチ2c側で扱われるPCIeに準拠した形式と、制御部4で扱われる形式との間でプロトコルの変換を行なってよい。
【0039】
制御部4は、DMAに関する種々の制御を実行する回路である。制御部4の各々は、複数のプロトコル変換部32の各々と通信可能に接続されてよい。制御部4は、例示的に、DMA部41及びCH部42を備えてよい。
【0040】
DMA部41は、プロトコル変換部32を介して、DMAにおけるデータ転送,コマンドの送受信等を行なう。
【0041】
CH部42は、DMA部41を介して、DSC(ディスクリプタ)のフェッチ及び解析を行なう。CH部42は、例示的に、1つのDSC部5と、1以上(
図2では4つ)のSEQ部6とを備える。なお、SEQ部6の数は4つに限定されるものではなく、2つ,3つ又は5つ以上であってもよいし、DSC部5と同数の1つであってもよい。
【0042】
DSC部5は、DMA部41を介してメモリ2bからDSCのフェッチを行なう。
【0043】
SEQ部6は、DSC部5がフェッチしたDSCを解析する。SEQ部6は、解析結果に基づくDSCの実行(データ転送の実行)指示をDMA部41に発行し、実行結果をDSC部5に通知する。例えば、CM#0のSEQ部6は、フェッチされたDSCに対応するデータを、DMAによりCM#0が備えるメモリ2b(第1メモリ)からCM#1が備えるメモリ2b(第2メモリ)にデータ転送する。
【0044】
図3は、DSC部5による比較例に係るフェッチ処理を説明するための図である。格納ADR(STORED_ADR)はメモリ2bにおいてデータ(例えばDSC)が格納されている先頭アドレス(DSCメモリアドレス)である。以下の説明では、格納ADRとして、データが格納されているアドレスの範囲(アドレス範囲)を表記する場合がある。DSC名はDSCを識別するための情報であり、昇順の番号を含む。NEXT_ADRはDSCに含まれるフィールドであって、次のDSCの格納ADRを示すフィールドである。
【0045】
なお、DSC部5には、CPU2aが実行するファームウェア(FW:Firmware)から、DSCの実行を要求する数(DSC数)と、最初のDSCの格納ADRとが通知される。
図3の例では、「DSC0」~「DSC3」の4つ分のDSC数がFWからDSC部5に通知されたものとする。最初のDSCは、第1DSCの一例である。
【0046】
DSC部5は、複数のDSCのうちの最初のDSCを、FWから通知された格納ADR(
図3の例では「0x00」)からフェッチ(取得)し、フェッチしたDSCをSEQ部6のうちの1つに出力する。DSC部5は、2つ目以降のDSCについては、取得したDSCのNEXT_ADRフィールドから次のDSCの格納ADRを取得し、メモリ2b上の当該格納ADRから次のDSCをフェッチし、フェッチしたDSCをSEQ部6のうちの1つに出力する。
【0047】
このように、DSC部5は、比較例に係るフェッチ処理において、メモリ2bに格納された複数のDSCを、数珠つなぎとなるように1つずつリードする。
【0048】
上述したように、1つのDSC(例えば64バイト)のフェッチには1μs程度の時間がかかる。また、データ転送長が小さいデータ(例えば4Kバイト未満のデータ)のデータ転送にも1μs程度の時間がかかる。このため、データ転送長が小さいデータのデータ転送が連続して複数回実行される場合、複数回のデータ転送にかかる時間に対して、複数回のDSCのリードにかかる時間が無視できず、制御部4を含むCM2の性能低下が生じ得る。
【0049】
例えば、
図2に示すように、CH部42のDSC部5及びSEQ部6の数が不均衡である場合には、データ転送長が小さいデータのデータ転送が連続すると、DSC部5から複数のSEQ部6の各々へのDSCの供給能力がボトルネックになる。
【0050】
例えば、4Kバイト未満のデータ転送長のデータのデータ転送が連続する場合、DSC部5によるDSCのフェッチにかかる時間とSEQ部6及びDMA部41によるデータ転送にかかる時間とが同程度となる。このため、DSC部5と1つ分のSEQ部6とが動作する間、他の3つ分のSEQ部6が処理待ちとなり、SEQ部6が効率的に利用されない状態となる。すなわち、DSC部5から複数のSEQ部6の各々に十分な数のDSCを供給することが難しい。
【0051】
このように、DSC部5に対するSEQ部6の数が増加するほど、CM2の性能はより低下する。なお、当該ボトルネックを解消するためにSEQ部6に対するDSC部5の数を増加させることも考えられるが、この場合、チップサイズを大きくすることによるコストアップが発生する。
【0052】
そこで、DSC部5は、複数のDSCがメモリ2bの連続領域に(順次的に,シーケンシャルに)格納されていると仮定して、FWから通知された格納ADRから複数のDSCを投機的にフェッチ(プリフェッチ,投機リード)する。
【0053】
複数のDSCがメモリ2bの連続領域に格納されている場合とは、DSCのリード順に、各DSCのDSCメモリアドレスがDSCのデータサイズ(DSC_SIZE)の間隔置きであることを意味してよい。この場合、当該複数のDSCを「連続DSC」という。
【0054】
一方、複数のDSCがメモリ2bの非連続領域に格納されている場合とは、リード順が連続する2つのDSCのDSCメモリアドレスの間隔がDSC_SIZEよりも大きいことを意味してよい。なお、当該複数のDSCには、2以上の連続DSCが含まれることがある。
【0055】
リード順が連続する2つのDSCのDSCメモリアドレスの間隔がDSC_SIZEよりも大きい場合、当該2つのDSCのうち、リード順で前のDSCを「連続最終DSC」といい、リード順で後のDSCを「非連続先頭DSC」という。連続最終DSCは、第2DSCの一例であり、非連続先頭DSCは、第3DSCの一例である。
【0056】
非連続先頭DSCの格納ADRは、連続最終DSCのNEXT_ADRフィールドにセットされたDSCメモリアドレスである。連続最終DSCは、連続最終DSCのSTORED_ADR+DSC_SIZEが、連続最終DSCのNEXT_ADRフィールドと一致しないDSCであり、プリフェッチされたDSCのうちの、先頭からリード順で最終の有効なDSCである。
【0057】
図4は、DSC部5による投機リード処理の一例を説明するための図である。例えば、FWから格納ADR:「0x00」,DSC数:「4」が通知された場合を想定する。この場合、DSC部5は、FWから通知された格納ADRから、格納ADRに複数のDSCのサイズ、一例として4つ分のDSCのサイズ(64バイト×4)を加算して得られるアドレスまでのデータをリードする。
図4の例では、DSC部5は、破線枠で示すように、格納ADR:「0x00」~「0xff」のデータをメモリ2bからリードする。
【0058】
しかし、メモリ2bにおけるDSCの格納場所は、柔軟性を確保するため、連続領域又は非連続領域に自由に配置される。例えば、格納ADR:「0x80」~「0xBF」である「DSC2」の次の「DSC3」は、格納ADR:「0x200」~「0x23F」に格納されており、投機リード処理で4つ目のDSCとしてリードされた格納ADR:「0xC0」~「0xff」には格納されていない。すなわち、
図4の例において、「DSC0」~「DSC2」はメモリ2bに連続して格納された連続DSCであり、「DSC2」は連続最終DSCであり、「DSC3」は非連続先頭DSCである。
【0059】
このように、DSCが非連続領域に格納されている場合、投機リードで得られたデータが適切なDSCでない、換言すれば投機リードに失敗する。
【0060】
また、CM2(システム)側の種々の要因(例えばエラー)でDSCの実行に失敗する場合がある。
【0061】
図5は、投機リード処理におけるエラーの発生例を示す図である。
図5には、
図4に示す投機リード処理において、SEQ部6及びDMA部41による「DSC1」に基づくデータ転送の際にエラー(「Error」と表記)が発生した場合を示す。エラーによるDSCの実行の失敗が発生した場合、CM2の性能低下を抑制しつつ、継続して動作させるために、制御部4は投機リードの停止を含む適切な対応を行なうことが重要である。
【0062】
そこで、一実施形態では、1つの側面において、DSCがメモリ2bに連続して格納されていない(非連続に格納されている)場合であっても、回路規模の増大を抑制しつつ、CM2の性能向上を図るための手法について説明する。
【0063】
また、一実施形態では、他の側面において、エラーによりDSCの実行が失敗した場合に、CM2の性能低下を抑制しつつ、継続して動作させるための手法について説明する。
【0064】
〔A-2〕制御部の構成例
図6は、一実施形態に係る制御部4の構成例を示すブロック図である。
図6に示すように、DSC部5は、DMA部41及び複数のSEQ部6の各々と相互に通信可能に接続されてよい。また、複数のSEQ部6の各々は、DMA部41と相互に通信可能に接続されてよい。
【0065】
図6に例示するように、DSC部5は、DSC連続判断部51,非連続先頭リード部52,DSCエラー箇所特定部53,プリフェッチ巻き戻し先決定部54及び再プリフェッチ・リード部55を備えてよい。これらのブロック51~55の各々の機能は、DSC部5(制御部4)が備える1以上の回路ロジックにより実現されてよい。
【0066】
DSC連続判断部51は、FWからの通知を契機に所定数のDSCのプリフェッチ(投機リード)を行なう。換言すれば、DSC連続判断部51は、メモリ2bの第1アドレスに格納された第1DSCと、メモリ2bに格納された1以上のDSCとを含む所定数のDSCに相当するサイズのデータを当該第1アドレスから読み出してバッファ5d(
図11参照)に書き込む。
【0067】
所定数は、一度にプリフェッチするDSCの最大数(上限数:例えば「2」以上の整数)が定められている場合、当該最大数、及び、「残りDSC数」のうちの小さい数であってよい。残りDSC数は、例えば、DSC数からプリフェッチ済みのDSCの数を減算した数である。
【0068】
DSC連続判断部51は、プリフェッチした複数のDSCがメモリ2bの連続領域に格納されているか否かを判断する。換言すれば、DSC連続判断部51は、読み出されたデータに基づき、メモリ2bにDSCが第1DSCから連続して格納されているか否かを判定する。
【0069】
例えば、DSC連続判断部51は、プリフェッチした複数のDSCの各々について、STORED_ADRとDSC_SIZEとを加算した値(STORED_ADR+DSC_SIZE)と、当該DSCのNEXT_ADRフィールドとが一致するか否かを、最初のDSCから順に判定する。
【0070】
プリフェッチした複数のDSCの各々について、STORED_ADR+DSC_SIZEがNEXT_ADRと一致する場合、DSC連続判断部51は、複数のDSCがメモリ2bの連続領域に格納されていると判断する。
【0071】
一方、プリフェッチした複数のDSCのうちの少なくとも1つのDSCについて、STORED_ADR+DSC_SIZEがNEXT_ADRと一致しない場合、DSC連続判断部51は、複数のDSCが非連続領域に格納されていると判断する。
【0072】
複数のDSCが非連続領域に格納されていると判断した場合、DSC連続判断部51は、プリフェッチした複数のDSCのうち、「誤フェッチDSC」(誤フェッチデータ)以降(当該DSC及び当該DSCよりもリード順で後の1以上のDSC)を破棄する。
【0073】
誤フェッチDSCとは、連続最終DSCの次にプリフェッチされたDSC(データ)であり、連続最終DSCのSTORED_ADR+DSC_SIZEからリードされたDSC(データ)である。誤フェッチDSCは、FWからの他の命令に係るDSCである場合もあるし、DSCとは異なるデータである場合もある。
図4の例では、誤フェッチDSCは、格納ADR:「0xc0」からリードされた非DSCのデータである。
【0074】
換言すれば、DSC連続判断部51は、メモリ2bにDSCが連続して格納されていないと判定された場合、メモリ2bから読み出したデータのうちの、最初のDSCから連続する1以上のDSCにおける最後の連続最終DSCに続くデータをバッファ5dから破棄する。
【0075】
非連続先頭リード部52は、非連続先頭DSCから所定数のDSCをリード(プリフェッチ,投機リード)する。換言すれば、非連続先頭リード部52は、連続最終DSCがNEXT_ADRフィールドで示すメモリ2bの第2アドレスから、第2アドレスに格納された非連続先頭DSCを含む所定数のDSCに相当するサイズのデータを読み出してバッファ5dに書き込む。
【0076】
なお、DSC連続判断部51及び非連続先頭リード部52の各々は、プリフェッチした複数のDSCの各々を複数のSEQ部6のいずれかに出力してよい。DSCの出力先のSEQ部6は、負荷分散等の観点で既知の種々の手法により選択されてよい。
【0077】
DSC連続判断部51及び非連続先頭リード部52により、DSCが非連続領域に格納されている場合であっても、格納ADRの連続性が途切れたDSC(誤フェッチDSC)以降が破棄され、非連続先頭DSCから再度リード(投機リード)が実行される。これにより、例えばDSC部5の追加等による回路の増大を抑制しつつ、制御部4が備える限られたリソースを用いてCM2の性能向上を図ることができる。
【0078】
図7は、CM2間で発生する通信における各動作の一例を示す図である。
図7に例示するように、CM2間で或るメッセージ(Msg)が通信される場合、「PUT」,「BFILL」,「wait」,「BFILL+Shadow」,「GET」の動作が実行される。「wait」はDSCのリードが発生しないため、これらの動作が実行されるとDSCのリードが合計で「4」回発生する。
【0079】
なお、「PUT」はメッセージ本体及びメッセージヘッダを含む120バイト(可変)のデータ転送であり、「BFILL」は書込ポインタを通知するための2バイトのデータ転送である。「wait」は所定時間の待機を通知するための2バイトのデータ転送であり、「BFILL+Shadow」は通信CM2への割り込み及びシャドウレジスタ機能のための4バイトのデータ転送であり、「GET」は送達保証のリードのための8バイトのデータ転送である。
【0080】
図8は、
図7に示す通信におけるDSCのプリフェッチ例を示す図である。DSCのプリフェッチが行なわれない場合、符号A1に示すように、DSCのリードが「4」回発生する。一方、一実施形態に係る手法によれば、符号A2に示すように、[1]~[4]の各々のデータ転送に係る「4」回のDSCのリードが投機的にプリフェッチされる。
【0081】
図9は、DSCのプリフェッチの他の例を示す図である。CM2間の通信は、
図9に例示するように複数(
図9ではメッセージ#0及び#1の2つ)に分割される場合がある。この場合においても、メッセージ#0及び#1で発生するDSCの「8」回分のリード回数を、プリフェッチにより「2」回に削減できる。
【0082】
図10は、プリフェッチの有無による性能の測定結果の一例を示す図である。符号B1には2つのCM2間の通信におけるスループットの改善率を示し、符号B2には2つのCM間でのデータ転送長:「8バイト」の通信におけるIOPS(Input / Output Per Second)の改善率を示す。
【0083】
符号B1に示すように、プリフェッチ有りの場合、プリフェッチ無しの場合と比較してスループットは同等以上となり、CM2の性能低下は生じていない。また、符号B2に示すように、プリフェッチ有りの場合のIOPSは「6541.9」KIOPSであり、プリフェッチ無しの場合の「3386.0」KIOPSの2倍近くの改善効果が得られることがわかる。
【0084】
図6の説明に戻り、DSCエラー箇所特定部53は、DSCの実行の際にエラーによるデータ転送の失敗が発生した場合、エラーが発生したDSC以降の実行を停止する。
【0085】
エラーとしては、投機リードの失敗(DSCが非連続領域に格納されていること)以外の種々の障害、一例として、他のCM2の故障によるデータ転送の失敗等が挙げられる。
【0086】
また、DSCエラー箇所特定部53は、CM2(システム)側の種々の要因でDSCの実行に失敗したことを検出した場合に、エラー箇所を特定する。DSCエラー箇所特定部53は、例えば、SEQ部6から通知されるエラー情報、一例としてエラービットの値に基づき、エラー箇所を特定してよい。エラー箇所としては、例えば、他のCM2,メモリ2b,PCIスイッチ2c等が挙げられる。
【0087】
さらに、DSCエラー箇所特定部53は、FWに「エラー」の割り込みを発行する。DSCエラー箇所特定部53は、当該割り込みの発行の際に、特定したエラー箇所の情報をFWに通知してもよい。
【0088】
プリフェッチ巻き戻し先決定部54は、エラー情報に基づき、DSCのプリフェッチに関する状態の巻き戻し先を決定し、決定した巻き戻し先の状態にDSCのプリフェッチに関する状態を巻き戻す。DSCのプリフェッチに関する状態は、メモリ2bからの所定数のDSCの読み出しを制御するための制御情報の一例である。
【0089】
プリフェッチ巻き戻し先決定部54は、例えば、巻き戻し先として、エラーが発生する直前の状態を決定してよい。DSCのプリフェッチに関する状態としては、例えば、プリフェッチ済みのDSCの数(リードしたDSCの数),NEXT_ADR等が挙げられる。
【0090】
再プリフェッチ・リード部55は、割り込みを受けたFWからDSCの実行の再開を指示された場合に、プリフェッチ巻き戻し先決定部54により巻き戻された状態から1以上のDSCのプリフェッチ(リード)を再実行する。
【0091】
なお、割り込みを受けたFWは、DSCの実行の再開に代えて、別の処理の実行を指示する場合がある。この場合、DSC部5は、プリフェッチ巻き戻し先決定部54が巻き戻した状態をリセットし、FWにより新たに通知されるメモリアドレスとDSC数とに基づき、DSCのプリフェッチを実行してよい。
【0092】
このように、DSCエラー箇所特定部53,プリフェッチ巻き戻し先決定部54及び再プリフェッチ・リード部55により、エラーのリカバリ処理が実行される。
【0093】
リカバリ処理により、エラーが発生したDSCで処理が停止し、エラーの発生前にプリフェッチされたデータの破棄と、DMAに関する内部状態の巻き戻しとが行なわれる。例えば、
図5に示す「DSC1」の実行中にエラーが発生した場合、リカバリ処理により、「DSC2」以降の破棄と、「DSC0」(例えば「DSC0」の実行後)の状態への巻き戻しとが行なわれる。
【0094】
これにより、エラーによりDSCの実行が失敗した場合に、CM2の性能低下を抑制しつつ、継続してCM2を動作させることが可能となる。例えば、再プリフェッチ・リード部55による再プリフェッチが行なわれる場合、プリフェッチによるCM2の性能向上の恩恵を受けつつ、エラー発生前の状態からDSCの実行を再開することができる。
【0095】
〔A-3〕制御部の詳細な構成例
図11は、
図6に示す制御部4の詳細な構成例を示すブロック図である。なお、
図11には、便宜上、DSC部5に1つのSEQ部6が接続される例を示すが、
図6と同様に、DSC部5には4つのSEQ部6が接続されてよい。
【0096】
図11に例示するように、制御部4(例えばCH部42)は、レジスタカウント部421を備えてよい。レジスタカウント部421は、CPU2a(FW)からの指示に応じて、DSC部5の内部の種々のレジスタにアクセスする。アクセスには、種々のレジスタに対する書き込み(レジスタライト)及び読み出し(レジスタリード)が含まれてよい。
【0097】
DSC部5は、例示的に、CSM5a,セットカウンタ5b,アドレスレジスタ5c,バッファ5d,リードカウンタ5e,比較部5f,ADRチェック部5g,ポインタ制御部5h,送信制御部5i,ランカウンタ5j,巻き戻し指示レジスタ5kを備えてよい。
【0098】
CSM(Control State Machine)5aは、DMA部41と通信を行ない、DSC部5におけるDMAに関する種々の制御を行なう回路である。
【0099】
セットカウンタ5bは、FWから通知されるDSC数をカウント値(セットカウント)により示すカウンタである。セットカウントは、レジスタカウント部421によりセットされる。
【0100】
アドレスレジスタ5cは、NEXT_ADRを保持するレジスタであり、レジスタカウント部421,CSM5a又は巻き戻し指示レジスタ5kによりNEXT_ADRの値がセット(更新)される。アドレスレジスタ5cには、初回のNEXT_ADRとして、FWから通知される1つ目のDSCのメモリアドレス(格納ADR)がセットされる。また、アドレスレジスタ5cには、DMA部41からリードされ、バッファ5dに入力される又は格納されているDSCのNEXT_ADRフィールドのアドレス情報がセットされる。
【0101】
アドレスレジスタ5cに格納されたNEXT_ADRは、リード対象のアドレスとしてDMA部41に出力されるとともに、ADRチェック部5gに出力される。
【0102】
バッファ5dは、DMA部41によりメモリ2bからリードされたDSCが格納される、RAM等の記憶領域である。バッファ5dの記憶領域は、ライトポインタ及びリードポインタにより制御される。
【0103】
リードカウンタ5eは、DMA部41によりメモリ2bからリードされたDSCの個数、例えばプリフェッチ済みのDSCの数をカウント値(リードカウント)により示すカウンタである。リードカウントは、レジスタカウント部421,CSM5a又は巻き戻し指示レジスタ5kによりセット(更新)される。
【0104】
リードカウントは、DSCがリードされると、リードされたDSCの個数分だけインクリメントされてよい。なお、リードカウントは、複数のDSCが不連続領域に格納されていることによる巻き戻しが発生すると、リードされたDSCの個数から、巻き戻されるDSCの個数を減算した数だけインクリメントされてよい。
【0105】
アドレスレジスタ5c及びリードカウンタ5eは、DSCのプリフェッチを制御するための制御情報の一例である。
【0106】
比較部5fは、CSM5aによる各種判定のために、セットカウント,リードカウント,ランカウントのうちの2つのカウントを比較し、比較結果をCSM5aに出力する。比較結果は、例えば、2つのカウントとが一致するか否か、及び、2つのカウントの差分、の一方又は双方を含んでよい。
【0107】
例えば、CSM5aは、セットカウントとリードカウントとの差分を残りDSC数として取得してよい。また、CSM5aは、ランカウントとリードカウントとが一致した場合に、プリフェッチされた全てのDSCの実行(データ転送)が完了したと判定してよい。さらに、CSM5aは、セットカウントとランカウントとが一致した場合に、複数のDSCに係る全てのデータ転送が完了したと判定してよい。
【0108】
ADRチェック部5gは、アドレスレジスタ5cが保持するアドレス(1つ前にリードしたDSCのNEXT_ADR)とDSCのデータサイズ(DSC_SIZE)とを加算した値と、リードしたDSCのNEXT_ADRフィールドのアドレスとを比較する。ADRチェック部5gは、比較結果が一致するか否かに応じて、複数のDSCの連続性を判定する。
【0109】
なお、ADRチェック部5gによるチェック時点では、アドレスレジスタ5cが保持するアドレスからリードされたDSCがバッファ5dに格納され、アドレスレジスタ5cが更新されていない状態である。この場合、アドレスレジスタ5cが保持するアドレスは、リードしたDSCの格納ADR(STORED_ADR)である。すなわち、ADRチェック部5gは、リードしたDSCのSTORED_ADRとDSC_SIZEとを加算した値と、リードしたDSCのNEXT_ADRフィールドのアドレスとを比較するといえる。
【0110】
不一致の場合、複数のDSCが不連続領域に格納されているため、ADRチェック部5gは、ポインタ制御部5hに巻き戻しを指示する。当該指示は、バッファ5dに格納されているDSCのライトポインタを、連続最終DSC(有効な最後のDSC)の次のDSC(無効なDSC)を示すように巻き戻す(セットする)ことを示してよい。ライトポインタの巻き戻しにより、格納ADRの連続性が途切れたDSC以降の無効なDSCが破棄される。無効なDSCの破棄は、例えば、バッファ5dにおける無効なDSCが格納された記憶領域を書込可能に管理することを含んでよい。
【0111】
ポインタ制御部5hは、バッファ5dの記憶領域におけるDSCの書き込み位置を示すライトポインタ、バッファ5dの記憶領域からのDSCの読み出し位置を示すリードポインタを制御する。
【0112】
ポインタ制御部5hは、例えば、ライトポインタの位置からバッファ5dに1以上のDSCが書き込まれると、ライトポインタを、現在位置から、最後に書き込まれたDSCの末尾に続く書込可能位置にまで進めて(例えば値を増加させて)よい。
【0113】
また、ポインタ制御部5hは、例えば、送信制御部5iによりバッファ5dのリードポインタの位置からDSCが読み出されると、リードポインタを、現在位置から、最後に読み出されたDSCの末尾に続く読出可能位置にまで進めてよい。
【0114】
なお、ポインタ制御部5hは、ADRチェック部5gから巻き戻し指示を受信すると、指示された位置にライトポインタを巻き戻して(例えば値を減少させて)よい。また、ポインタ制御部5hは、巻き戻し指示レジスタ5kから巻き戻し指示を受信すると、指示された位置にライトポインタ及びリードポインタを巻き戻してよい。
【0115】
送信制御部5iは、バッファ5dのリードポインタからDSCを読み出し、複数のSEQ部6のうちのいずれか選択したSEQ部6にDSCを送信して、ポインタ制御部5hにリードポインタを進めることを指示する。
【0116】
また、送信制御部5iは、SEQ部6からDSCの実行結果、例えばエラー有無を含む情報を受信する。エラー有りの場合、実行結果にはエラー情報が含まれる。送信制御部5iは、エラー情報を内部情報として保持してよい。
【0117】
ランカウンタ5jは、SEQ部6によりDSCが実行された回数をカウント値(ランカウント)により示すカウンタである。ランカウントは、SEQ部6におけるDSCの実行完了に応じて、レジスタカウント部421又はSEQ部6によりセット(更新)される。
【0118】
巻き戻し指示レジスタ5kは、SEQ部6からエラー情報を通知されると、アドレスレジスタ5cに破棄指示を通知するとともに、リードカウンタ5e及びポインタ制御部5hに巻き戻し指示を通知する。
【0119】
ポインタ制御部5hへの巻き戻し指示は、エラーが発生する直前に実行されたDSC(例えば、1つ前のDSC)の位置にリードポインタを巻き戻す指示と、当該DSCの末尾に続く書込可能位置にライトポインタを巻き戻す指示と、を含んでよい。
【0120】
アドレスレジスタ5cへの破棄指示は、アドレスレジスタ5cに保持されている現在のNEXT_ADRを破棄する指示である。例えば、アドレスレジスタ5cは、破棄指示を通知されると、保持する最新のアドレス(NEXT_ADR)を破棄する。また、アドレスレジスタ5cは、NEXT_ADRの破棄後、例えば、CSM5aによる制御によって、エラーが発生する直前に実行されたDSC(例えば巻き戻し後のリードポインタの位置のDSC)のNEXT_ADRフィールドのアドレス情報をバッファ5dから読み出して保持してよい。
【0121】
リードカウンタ5eへの巻き戻し指示は、FWからのデータ転送の通知からエラーが発生する直前までの間にメモリ2bからリードされたDSCの数をセットする指示を含んでよい。当該巻き戻し指示は、例えば、リードカウントから、巻き戻すDSCの数(一例として「1」)を減算する指示を含んでもよい。
【0122】
〔B〕動作例
〔B-1〕CMの動作例
次に、一実施形態に係るストレージ装置1(CM2)の動作例を説明する。
図12は、一実施形態に係るCM2の動作例を説明するためのフローチャートである。
【0123】
図12に例示するように、CM2から他のCM2への通信を行なう場合、CPU2aは通信で発生する複数のデータ転送に係る複数のDSCをメモリ2bにセットする(ステップS1)。
【0124】
CPU2aは、レジスタカウント部421により、セットカウンタ5bにDSC数をセットし、複数のDSCのうちの1つ目のDSCの格納ADR(STORED_ADR)をNEXT_ADRとしてアドレスレジスタ5cにセットし、DSC部5に通知する(ステップS2)。当該通知には、セットしたDSC数及びNEXT_ADRの一方又は双方の情報が含まれてもよい。なお、ステップS1及びS2は逆順でもよいし、並行して実行されてもよい。
【0125】
DSC部5は、CPU2aから通知を受けると、アドレスレジスタ5cのNEXT_ADRに基づき、DMA部41を介してメモリ2bからN(Nは1以上の整数)個のDSCをリードし(ステップS3)、バッファ5dのライトポインタの位置に格納する。なお、ポインタ制御部5hは、バッファ5dのライトポインタの位置を更新する。
【0126】
Nは、例えば下記式(1)に基づき求められてよい。下記式(1)において、上限数は、一度にプリフェッチするDSCの最大数であり、例えば予め設定される。残りDSC数は、セットカウントからリードカウントを減算した数であり、比較部5fにより算出される。
N=min(上限数,残りDSC数) (1)
【0127】
ADRチェック部5gは、メモリ2bにおける複数のDSCが格納された記憶領域(DSC領域)が連続しているか否かを判定する(ステップS4)。例えば、ADRチェック部5gは、先頭のDSCからリード順に、アドレスレジスタ5cにセットされたNEXT_ADRとDSCデータサイズ(DSC_SIZE)との加算値と、DSCのNEXT_ADRフィールドのアドレス情報とが一致するか否かを判定する。
【0128】
プリフェッチした全てのDSCについて、加算値とアドレス情報とが一致する場合、ADRチェック部5gは、DSC領域が連続すると判定する(ステップS4でYES)。CSM5aは、アドレスレジスタ5cのNEXT_ADRを、プリフェッチしたDSCのうちのリード順で末尾のDSCのNEXT_ADRフィールドのアドレス情報に更新し、リードカウントをNだけインクリメントする(ステップS5)。そして、処理がステップS7に移行する。
【0129】
プリフェッチしたDSCのうちの少なくとも1つのDSCについて、加算値とアドレス情報とが一致しない場合、ADRチェック部5gは、DSC領域が連続しない(非連続である)と判定する(ステップS4でNO)。CSM5aは、アドレスレジスタ5cのNEXT_ADRを、連続最終DSCのNEXT_ADRフィールドが示すアドレス情報(非連続先頭DSCのSTORED_ADR)に更新し、リードカウントを(N-M)だけインクリメントする(ステップS6)。Mは、プリフェッチ済みのDSCのうちの、巻き戻す(破棄する)DSCの数である。そして、処理がステップS7に移行する。
【0130】
ステップS7では、送信制御部5iが、リードされたDSCを1以上のSEQ部6に出力し、各SEQ部6は、入力されたDSCを実行する。
【0131】
SEQ部6は、DSCの実行に成功した場合(ステップS8,ステップS8でYES)、ランカウントを「1」だけインクリメントする(ステップS9)。一方、DSCの実行に失敗した場合(ステップS8でNO)、エラービットをセットする(ステップS10)。
【0132】
CSM5aは、比較部5fによる比較結果から、セットカウントとランカウントとが一致したか否かを判定する(ステップS11)。
【0133】
セットカウントとランカウントとが一致した場合(ステップS11でYES)、DMA部41は、CSM5aからの制御により、CPU2aに「完了」の割り込み通知を発行し(ステップS12)、処理が終了する。
【0134】
セットカウントとランカウントとが一致しない場合(ステップS11でNO)、CSM5aは、比較部5fによる比較結果から、リードカウントとランカウントとが一致したか否かを判定する(ステップS13)。
【0135】
リードカウントとランカウントとが一致した場合(ステップS13でYES)、処理がステップS3に移行し、次のN個のDSCがプリフェッチされる。
【0136】
リードカウントとランカウントとが一致しない場合(ステップS13でNO)、CSM5aは、SEQ部6によりエラービットが有るか(セットされたか)否かを判定する(ステップS14)。
【0137】
エラービットが無い(セットされていない)場合(ステップS14でNO)、処理がステップS7に移行し、未実行のDSCがSEQ部6により実行される。
【0138】
エラービットが有る場合(ステップS14でYES)、巻き戻し指示レジスタ5kは、NEXT_ADR及びリードカウンタ5eをエラー発生直前の状態に巻き戻す(ステップS15)。
【0139】
例えば、巻き戻し指示レジスタ5kは、アドレスレジスタ5cに破棄指示を出力し、リードカウンタ5e及びポインタ制御部5hに巻き戻し指示を出力する。アドレスレジスタ5cでは、現在のNEXT_ADRが破棄され、バッファ5d上の巻き戻し後のライトポインタが示すDSCのNEXT_ADRフィールドのアドレス情報がセットされる。また、リードカウンタ5eでは、巻き戻すDSCの数だけリードカウントがデクリメントされる。なお、送信制御部5iは、エラービットの検出に応じて、SEQ部6へのDSCの出力を停止してよい。
【0140】
そして、DMA部41は、CSM5aからの制御により、CPU2aに「エラー」の割り込み通知を発行し(ステップS16)、処理が終了する。
【0141】
〔B-2〕リカバリ処理の動作例
図13は、一実施形態に係るCM2におけるリカバリ処理の動作例を説明するためのフローチャートである。
【0142】
CPU2aは、エラーの割り込み通知の受信後、リカバリ処理を行なう。なお、CPU2aは、エラーの種類,通信の内容等の種々の条件に応じて、リカバリ処理において、エラーの発生により停止した通信を再開するか、新たな通信を開始するかを決定してよい(ステップS21)。
【0143】
リカバリ処理において、処理を再開する場合(ステップS21でYES)、処理が
図12のステップS3に移行し、
図12のステップS15で巻き戻された状態から、各種レジスタ,各種カウンタの値が読み出され、処理が再開する。
【0144】
処理を再開しない場合(ステップS21でNO)、例えば新たな通信を行なう場合、CPU2aは、通信で発生する複数のデータ転送に係る複数のDSCをメモリ2bにセットする(ステップS22)。
【0145】
CPU2aは、レジスタカウント部421により、セットカウンタ5bにDSC数をセットし、複数のDSCのうちの1つ目のDSCの格納ADR(STORED_ADR)をNEXT_ADRとしてアドレスレジスタ5cにセットし、DSC部5に通知する(ステップS23)。なお、ステップS22及びS23は逆順でもよいし、並行して実行されてもよい。そして、処理が
図12のステップS3に移行する。
【0146】
なお、CPU2aは、ステップS22の前に、エラーの発生により停止した通信の状態(
図12のステップS15で巻き戻された状態)を、メモリ2b又はDMA装置3内の記憶領域に退避させてもよい。
【0147】
〔B-3〕シーケンス例
図14~
図16は、一実施形態に係るストレージ装置1の動作例を説明するためのシーケンス図である。
図14~
図16では、CM#0からCM#1への通信が発生した場合であって、DSC数:「4」,上限数:「2」である場合を例に挙げる。なお、
図14~
図16の説明において、既述の処理と同一の符号を付した処理の説明を省略する。
【0148】
(複数のDSCが連続領域に格納されている場合)
まず、
図14を参照して、複数のDSCが連続領域に格納されている場合の動作例を説明する。
【0149】
CM#0のCPU2aは、メモリ2bの特定の連続領域に4つのDSCをセットする(処理P1)。
【0150】
CPU2aは、DMA装置3のアドレスレジスタ5cのNEXT_ADRに、メモリ2bにセットした先頭のDSCの格納領域(STORED_ADR)をライトする(処理P2)。
【0151】
CPU2aは、DMA装置3のセットカウンタ5bにDSC数である「4」をライトし、DSC数をDMA装置3に通知する(処理P3)。
【0152】
DMA装置3は、DSC部5により、アドレスレジスタ5cが保持するNEXT_ADRから所定数(=上限数)である「2」つのDSCをリードする(処理P4)。
【0153】
DMA装置3は、ADRチェック部5gにより、リードした2つのDSCが連続領域に格納されていると判断する。DMA装置3は、2つ目のDSCのNEXT_ADRフィールドのアドレス情報をアドレスレジスタ5cにセット(更新)し、リードカウンタ5eに「2」をセットする(処理P5)。
【0154】
DMA装置3は、SEQ部6により、バッファ5d内のDSC(CM#0からCM#1へのデータ転送)を実行する(処理P6)。
【0155】
DMA装置3は、ランカウントをインクリメントする(処理P7)。
【0156】
処理P6及びP7は、プリフェッチされたDSCの数(
図14の例では「2」)の分だけ繰り返し実行される。
【0157】
DMA装置3は、DSC部5により、アドレスレジスタ5cが保持するNEXT_ADRから所定数(=残りDSC数)である「2」つのDSCをリードする(処理P8)。
【0158】
DMA装置3は、ADRチェック部5gにより、リードした2つのDSCが連続領域に格納されていると判断する。DMA装置3は、2つ目のDSCのNEXT_ADRフィールドのアドレス情報をアドレスレジスタ5cにセット(更新)し、リードカウントを「2」インクリメントする(処理P9)。
【0159】
DMA装置3は、SEQ部6により、バッファ5d内のDSC(CM#0からCM#1へのデータ転送)を実行し(処理P10)、ランカウントをインクリメントする(処理P11)。処理P10及びP11は、プリフェッチされたDSCの数(
図14の例では「2」)の分だけ繰り返し実行される。
【0160】
DMA装置3は、リードカウントとランカウントとが一致したため、CPU2aに完了割り込みを通知し(処理P12)、処理が終了する。
【0161】
(複数のDSCが非連続領域に格納されている場合)
次に、
図15を参照して、複数のDSCが非連続領域に格納されている場合の動作例を説明する。
【0162】
処理P22において、DMA装置3は、ADRチェック部5gにより、処理P4でリードしたDSCのうちの1つ目のDSCのSTORED_ADR+DSC_SIZEとNEXT_ADRフィールドのアドレス情報との不一致から、リードしたDSCが不連続領域に格納されていると判断する。DMA装置3は、1つ目のDSCのNEXT_ADRフィールドのアドレス情報をアドレスレジスタ5cにセット(更新)し、リードカウンタ5eに「1」をセットする。
【0163】
処理P22では、ポインタ制御部5hにより、バッファ5dのライトポインタが2つ目のDSCの次の書込可能位置から、2つ目のDSCの位置(先頭)に巻き戻される。これにより、2つ目のDSCが破棄される。
【0164】
DMA装置3は、SEQ部6により、バッファ5d内のDSC(CM#0からCM#1へのデータ転送)を実行し(処理P23)、ランカウントをインクリメントする(処理P24)。処理P23及びP24は、プリフェッチされた2つのDSCのうちの有効なDSCの数(
図15の例では「1」)の分だけ実行される。
【0165】
DMA装置3は、DSC部5により、アドレスレジスタ5cが保持するNEXT_ADRから所定数(=上限数)である「2」つのDSCをリードする(処理P25)。
【0166】
DMA装置3は、リードしたDSCのうちの末尾のDSCのNEXT_ADRフィールドのアドレス情報をアドレスレジスタ5cにセット(更新)し、リードカウントを「2」インクリメントする(処理P26)。
【0167】
DMA装置3は、SEQ部6により、バッファ5d内のDSC(CM#0からCM#1へのデータ転送)を実行し(処理P27)、ランカウントをインクリメントする(処理P28)。処理P27及びP28は、プリフェッチされたDSCの数(
図15の例では「2」)の分だけ繰り返し実行される。
【0168】
DMA装置3は、DSC部5により、アドレスレジスタ5cが保持するNEXT_ADRから所定数(=残りDSC数)である「1」つのDSCをリードする(処理P29)。
【0169】
DMA装置3は、リードしたDSCのNEXT_ADRフィールドのアドレス情報をアドレスレジスタ5cにセット(更新)し、リードカウントを「1」インクリメントする(処理P30)。
【0170】
DMA装置3は、SEQ部6により、バッファ5d内のDSC(CM#0からCM#1へのデータ転送)を実行し(処理P31)、ランカウントをインクリメントする(処理P32)。処理P31及びP32は、プリフェッチされたDSCの数(
図15の例では「1」)の分だけ実行される。
【0171】
DMA装置3は、リードカウントとランカウントとが一致したため、CPU2aに完了割り込みを通知し(処理P12)、処理が終了する。
【0172】
(エラーが発生した場合)
次に、
図16を参照して、複数のDSCが連続領域に格納されている場合において、エラーが発生した場合の動作例を説明する。
【0173】
処理P41において、DMA装置3は、SEQ部6により、バッファ5d内の1つ目のDSC(CM#0からCM#1へのデータ転送)を実行する。このとき、CM#1の故障によりデータ転送に失敗したものとする(処理P41a)。SEQ部6は、エラーの要因に応じたエラーフラグをセットする(処理P41b)。
【0174】
DMA装置3は、セットカウントとランカウントとが不一致、リードカウントとランカウントとが不一致、且つ、エラーフラグがオンであるため、アドレスレジスタ5cのNEXT_ADR及びリードカウンタ5eを1つ目のDSCの実行前の状態に戻す(処理P42)。
【0175】
DMA装置3は、CPU2aにエラー割り込みを通知する(処理P43)。
【0176】
CPU2aは、エラー割り込みの通知を受信すると、エラー情報に基づきエラー要因を判断する(処理P44)。
【0177】
CPU2aは、判断結果に基づき次処理を実行し(処理P45)、処理が終了する。次処理としては、例えば、処理P42で巻き戻した状態からの再開、新たな通信、等が挙げられる。
【0178】
〔C〕その他
上述した実施形態に係る技術は、以下のように変形、変更して実施することができる。
【0179】
例えば、
図6に示すDSC部5が備えるブロック51~55は、任意の組み合わせで併合してもよく、それぞれ分割してもよい。また、
図11に示すDSC部5が備えるブロック5a~5kは、任意の組み合わせで併合してもよく、それぞれ分割してもよい。
【0180】
〔D〕付記
以上の実施形態に関し、さらに以下の付記を開示する。
【0181】
(付記1)
DMA(Direct Memory Access)による処理装置間のデータ転送をディスクリプタに基づき実行するデータ転送制御装置であって、
第1処理装置が備える第1メモリの第1アドレスに格納された第1ディスクリプタと、前記第1メモリに格納された1以上のディスクリプタとを含む所定数のディスクリプタに相当するサイズのデータを前記第1アドレスから読み出してバッファに書き込み、
読み出された前記データに基づき、前記第1メモリにディスクリプタが前記第1ディスクリプタから連続して格納されているか否かを判定し、
前記第1メモリにディスクリプタが連続して格納されていないと判定された場合、前記データのうちの、前記第1ディスクリプタから連続する1以上のディスクリプタにおける最後の第2ディスクリプタに続くデータを前記バッファから破棄し、
前記第2ディスクリプタが示す前記第1メモリの第2アドレスから、前記第2アドレスに格納された第3ディスクリプタを含む前記所定数のディスクリプタに相当するサイズのデータを読み出して前記バッファに書き込む、
制御部を備える、データ転送制御装置。
【0182】
(付記2)
前記制御部は、
前記バッファから読み出されたディスクリプタに対応するデータを、前記DMAにより前記第1メモリから第2処理装置が備える第2メモリにデータ転送し、
前記データ転送がエラーにより失敗した場合、前記エラーの発生箇所に関する情報を含むエラー情報に基づき、前記第1メモリからの前記所定数のディスクリプタの読み出しを制御するための制御情報の巻き戻し先を決定し、
決定された前記巻き戻し先の状態に前記制御情報を巻き戻し、
前記エラーの発生箇所に関する情報を前記第1処理装置のプロセッサに通知する、
付記1に記載のデータ転送制御装置。
【0183】
(付記3)
前記制御部は、
前記プロセッサからの再開の指示の受信に応じて、巻き戻された前記制御情報が示す前記第1メモリの第3アドレスから、前記第3アドレスに格納された第4ディスクリプタを含む前記所定数のディスクリプタに相当するサイズのデータを読み出して前記バッファに書き込む、
付記2に記載のデータ転送制御装置。
【0184】
(付記4)
前記判定は、前記第1メモリにおける前記ディスクリプタの格納アドレスと前記ディスクリプタのデータサイズとを加算した値と、前記ディスクリプタに設定された、次のディスクリプタの格納アドレスと、が一致するか否かを、前記第1ディスクリプタから順に判定する処理を含む、
付記1~付記3のいずれか1項に記載のデータ転送制御装置。
【0185】
(付記5)
前記所定数は、前記第1メモリに格納されたディスクリプタの数から前記バッファに書き込まれたディスクリプタの数を減算した数、及び、予め設定された最大数であって前記第1メモリから前記バッファに一度に読み出すディスクリプタの前記最大数、のうちのいずれか小さい数である、
付記1~付記4のいずれか1項に記載のデータ転送制御装置。
【0186】
(付記6)
プロセッサと、
第1メモリと、
DMA(Direct Memory Access)による情報処理装置間のデータ転送をディスクリプタに基づき実行するデータ転送制御装置と、を備え、
前記データ転送制御装置は、
前記第1メモリの第1アドレスに格納された第1ディスクリプタと、前記第1メモリに格納された1以上のディスクリプタとを含む所定数のディスクリプタに相当するサイズのデータを前記第1アドレスから読み出してバッファに書き込み、
読み出された前記データに基づき、前記第1メモリにディスクリプタが前記第1ディスクリプタから連続して格納されているか否かを判定し、
前記第1メモリにディスクリプタが連続して格納されていないと判定された場合、前記データのうちの、前記第1ディスクリプタから連続する1以上のディスクリプタにおける最後の第2ディスクリプタに続くデータを前記バッファから破棄し、
前記第2ディスクリプタが示す前記第1メモリの第2アドレスから、前記第2アドレスに格納された第3ディスクリプタを含む前記所定数のディスクリプタに相当するサイズのデータを読み出して前記バッファに書き込む、
制御部を備える、情報処理装置。
【0187】
(付記7)
前記制御部は、
前記バッファから読み出されたディスクリプタに対応するデータを、前記DMAにより前記第1メモリから他の情報処理装置が備える第2メモリにデータ転送し、
前記データ転送がエラーにより失敗した場合、前記エラーの発生箇所に関する情報を含むエラー情報に基づき、前記第1メモリからの前記所定数のディスクリプタの読み出しを制御するための制御情報の巻き戻し先を決定し、
決定された前記巻き戻し先の状態に前記制御情報を巻き戻し、
前記エラーの発生箇所に関する情報を前記プロセッサに通知する、
付記6に記載の情報処理装置。
【0188】
(付記8)
前記プロセッサは、前記エラーの発生箇所に関する情報に基づき、前記制御部に再開の指示を発行し、
前記制御部は、
前記プロセッサからの前記再開の指示の受信に応じて、巻き戻された前記制御情報が示す前記第1メモリの第3アドレスから、前記第3アドレスに格納された第4ディスクリプタを含む前記所定数のディスクリプタに相当するサイズのデータを読み出して前記バッファに書き込む、
付記7に記載の情報処理装置。
【0189】
(付記9)
前記判定は、前記第1メモリにおける前記ディスクリプタの格納アドレスと前記ディスクリプタのデータサイズとを加算した値と、前記ディスクリプタに設定された、次のディスクリプタの格納アドレスと、が一致するか否かを、前記第1ディスクリプタから順に判定する処理を含む、
付記6~付記8のいずれか1項に記載の情報処理装置。
【0190】
(付記10)
前記所定数は、前記第1メモリに格納されたディスクリプタの数から前記バッファに書き込まれたディスクリプタの数を減算した数、及び、予め設定された最大数であって前記第1メモリから前記バッファに一度に読み出すディスクリプタの前記最大数、のうちのいずれか小さい数である、
付記6~付記9のいずれか1項に記載の情報処理装置。
【符号の説明】
【0191】
1 ストレージ装置
2 CM
2a CPU
2b メモリ
2c PCIスイッチ
2d バス
3 DMA装置
31 IF部
32 プロトコル変換部
4 制御部
41 DMA部
42 CH部
421 レジスタカウント部
5 DSC部
5a CSM
5b セットカウンタ
5c アドレスレジスタ
5d バッファ
5e リードカウンタ
5f 比較部
5g ADRチェック部
5h ポインタ制御部
5i 送信制御部
5j ランカウンタ
5k 巻き戻し指示レジスタ
51 DSC連続判断部
52 非連続先頭リード部
53 DSCエラー箇所特定部
54 プリフェッチ巻き戻し先決定部
55 再プリフェッチ・リード部
6 SEQ部