rsm_memseg_import_putv() と rsm_memseg_import_getv() 関数を使用すると、単一の読み取り元アドレスや単一の書き込み先アドレスではなく、入出力要求のリストを使用できます。
関数のプロトタイプ:
int rsm_memseg_import_putv(rsm_scat_gath_t *sg_io);Scatter-Gather リスト (sg_io) の入出力ベクトル構成要素を使用すると、ローカル仮想アドレスまたは local_memory_handles を指定できます。ハンドルはローカルアドレス範囲を繰り返して使用するための効率的な方法です。割り当てられたシステム資源 (ロックダウンされたローカルメモリーなど) はハンドルが解放されるまで保持されます。ハンドルをサポートする関数は rsm_create_localmemory_handle() と rsm_free_localmemory_handle() です。
仮想アドレスやハンドルは、ベクトルに集めて、単一のリモートセグメントに書き込むことができます。この結果はまた、単一のリモートセグメントから読み取って、仮想アドレスまたはハンドルのベクトルに分散できます。
ベクトル全体の入出力は関数が返る前に初期化されます。インポートセグメントのバリアモード属性は、関数が返る前に入出力が完了しているかどうかを判断します。バリアモード属性を implicit (暗黙的) に設定すると、ベクトルに入った順番でデータ転送が完了することが保証されます。リストの各エントリは、暗黙的なバリアの開く操作と閉じる操作によって囲まれます。エラーが検出された場合、ベクトルの入出力は中断され、関数はすぐに返ります。残りのカウントは、入出力が完了または初期化されなかったエントリの数を示します。
putv 操作または getv 操作が正常に完了した場合に通知イベントをターゲットセグメントに送信することを指定できます。通知イベントの送信を指定するには、rsm_scat_gath_t 構造体の flags エントリに RSM_IMPLICIT_SIGPOST 値を指定します。また、flags エントリに RSM_SIGPOST_NO_ACCUMULATE を指定しておくと、RSM_IMPLICIT_SIGPOST が設定されたときに、この値がシグナルポスト操作に渡されます。
戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。
Scatter-Gather 構造体ポインタが無効です
セグメントハンドルが無効です
コントローラハンドルが無効です
アドレスが不正です
オフセットが無効です
長さが無効です
Permission denied
入出力完了エラー
接続が中断されました
資源が不足しています
シグナルによって操作が割り込まれました
この関数は、後続の putv または getv への呼び出しの入出力ベクトルで使用するためのローカルハンドルを取得します。ロックダウンの可能性があるので、メモリーがローカルハンドルによってスパンされている場合は特に、可能な限りハンドルを解放して、システム資源を節約してください。
戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。
コントローラハンドルが無効です
ローカルメモリーハンドルが無効です
長さが無効です
アドレスが無効です
メモリーが不足しています
この関数は、ローカルハンドルに関連するシステム資源を解放します。プロセスが終了するときにはプロセスに属するすべてのハンドルが解放されますが、この関数を呼び出すことでシステム資源を節約できます。
戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。
コントローラハンドルが無効です
ローカルメモリーハンドルが無効です
次の例に、プライマリデータ構造体の定義を示します。
typedef void *rsm_localmemory_handle_t typedef struct { ulong_t io_request_count; /* number of rsm_iovec_t entries */ ulong_t io_residual_count; /* rsm_iovec_t entries not completed */ int flags; rsm_memseg_import_handle_t remote_handle; /* opaque handle for import segment */ rsm_iovec_t *iovec; /* pointer to array of io_vec_t */ } rsm_scat_gath_t; typedef struct { int io_type; /* HANDLE or VA_IMMEDIATE */ union { rsm_localmemory_handle_t handle; /* used with HANDLE */ caddr_t virtual_addr; /* used with VA_IMMEDIATE */ } local; size_t local_offset; /* offset from handle base vaddr */ size_t import_segment_offset; /* offset from segment base vaddr */ size_t transfer_length; } rsm_iovec_t;