プログラミングインタフェース

エクスポート側のメモリーセグメント操作

メモリーセグメントをエクスポートするとき、アプリケーションはまず、通常のオペレーティングシステムインタフェース (System V Shared Memory Interface、mmap、または valloc など) を使用して、自分の仮想アドレス空間にメモリーを割り当てます。メモリーを割り当てたあと、アプリケーションは RSMAPI ライブラリインタフェースを呼び出し、セグメントを作成して、ラベルを付けます。セグメントにラベルを付けたあと、RSMAPI ライブラリインタフェースは割り当てた仮想アドレスの範囲に物理ページをバインドします。物理ページをバインドしたあと、RSMAPI ライブラリインタフェースはセグメントを発行して、インポートしているプロセス (インポータ) がアクセスできるようにします。


注 –

mmap を使用して仮想アドレス空間を取得した場合、マッピングは MAP_PRIVATE である必要があります。


エクスポート側のメモリーセグメント操作には、次のような操作が含まれます。

メモリーセグメントの作成と破壊

rsm_memseg_export_create を使用して新しいメモリーセグメントを確立すると、セグメントを作成するときに物理メモリーを関連付けることができます。この操作は、エクスポート側のメモリーセグメントハンドルを新しいメモリーセグメントに戻します。セグメントは作成するプロセスが動作している間、または、rsm_memseg_export_destroy を使用して破壊するまで存在します。


注 –

インポート側が切断する前に破壊操作が行われた場合、切断が強制的に行われます。


セグメントの作成

int rsm_memseg_export_create(rsmapi_controller_handle_t controller, rsm_memseg_export_handle_t *memseg, void *vaddr, size_t size, uint_t flags);

この関数はセグメントハンドルを作成します。セグメントハンドルを作成したあと、この関数はセグメントハンドルを指定された仮想アドレス範囲 [vaddr..vaddr+size] にバインドします。この範囲は有効であり、コントローラの alignment プロパティー上に整列している必要があります。flags 引数はビットマスクで、次の操作を有効にします。


注 –

RSM_LOCK_OPS フラグは RSMAPI の初期リリースには含まれません。


戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。

RSMERR_BAD_CTLR_HNDL

コントローラハンドルが無効です

RSMERR_CTLR_NOT_PRESENT

コントローラが存在しません

RSMERR_BAD_SEG_HNDL

セグメントハンドルが無効です

RSMERR_BAD_LENGTH

コントローラの長さが 0 あるいは、制限を超えています

RSMERR_BAD_ADDR

アドレスが無効です

RSMERR_PERM_DENIED

Permission denied

RSMERR_INSUFFICIENT_MEM

メモリーが不足しています

RSMERR_INSUFFICIENT_RESOURCES

資源が不足しています

RSMERR_BAD_MEM_ALIGNMENT

アドレスがページ境界に整列されていません

RSMERR_INTERRUPTED

シグナルによって操作が割り込まれました

セグメントの破壊

int rsm_memseg_export_destroy(rsm_memseg_export_handle_t memseg);

この関数はセグメントとその空き資源の割り当てを解除します。インポートしているプロセス (インポータ) はすべて強制的に切断されます。

戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。

RSMERR_BAD_SEG_HNDL

セグメントハンドルが無効です

RSMERR_POLLFD_IN_USE

pollfd は使用中です

メモリーセグメントの発行、再発行、および発行解除

発行操作によって、相互接続上にあるほかのノードがメモリーセグメントをインポートできます。エクスポートセグメントは複数の相互接続アダプタ上で発行できます。

セグメント ID は承認された範囲または 0 を指定した場合、有効なセグメント ID が RSMAPI フレームワークによって生成され、返されます。

セグメントアクセス制御リストはノード ID とアクセス権のペアから構成されます。リストでは、指定したノード ID ごとに、Solaris のファイルアクセス権とともに所有者、グループ、およびその他のユーザーの 3 つの 8 進数によって関連する読み取り権と書き込み権が示されます。アクセス制御リストでは、各 8 進数は次の値を持ちます。

2

書き込みアクセス。

4

読み取り専用アクセス。

6

読み取りおよび書き込みアクセス。

たとえば、0624 というアクセス権は次のことを意味します。

アクセス制御リストが提供される場合、リストに含まれないノードはセグメントをインポートできません。ただし、アクセス制御リストが NULL の場合は、すべてのノードがセグメントをインポートできます。すべてのノードのアクセス権は、エクスポートするプロセス (エクスポータ) の所有者、グループ、およびその他のファイル作成権と同じになります。


注 –

ノードアプリケーションはセグメント識別子の割り当てを管理し、エクスポートするノード上で一意性を保証する義務があります。


セグメントの発行

int rsm_memseg_export_publish(rsm_memseg_export_handle_t memseg, rsm_memseg_id_t *segment_id, rsmapi_access_entry_t ACCESS_list[], uint_t access_list_length);
typedef struct {
    rsm_node_id_t       ae_node;    /* remote node id allowed to access resource */
    rsm_permission_t    ae_permissions;    /* mode of access allowed */
} rsmapi_access_entry_t;.

戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。

RSMERR_BAD_SEG_HNDL

セグメントハンドルが無効です

RSMERR_SEG_ALREADY_PUBLISHED

セグメントはすでに発行されています

RSMERR_BAD_ACL

アクセス制御リストが無効です

RSMERR_BAD_SEGID

セグメント ID が無効です

RSMERR_SEGID_IN_USE

セグメント ID は使用中です

RSMERR_RESERVED_SEGID

セグメント ID は予約されています

RSMERR_NOT_CREATOR

セグメントの作成者ではありません

RSMERR_BAD_ADDR

アドレスが不正です

RSMERR_INSUFFICIENT_MEM

メモリーが不足しています

RSMERR_INSUFFICIENT_RESOURCES

資源が不足しています

認可されたセグメント ID の範囲:

#define RSM_DRIVER_PRIVATE_ID_BASE

0

#define RSM_DRIVER_PRIVATE_ID_END

0x0FFFFF

#define RSM_CLUSTER_TRANSPORT_ID_BASE

0x100000

#define RSM_CLUSTER_TRANSPORT_ID_END

0x1FFFFF

#define RSM_RSMLIB_ID_BASE

0x200000

#define RSM_RSMLIB_ID_END

0x2FFFFF

#define RSM_DLPI_ID_BASE

0x300000

#define RSM_DLPI_ID_END

0x3FFFFF

#define RSM_HPC_ID_BASE

0x400000

#define RSM_HPC_ID_END

0x4FFFFF

次に示す範囲は、公開値が 0 の場合、システムによる割り当て用に予約されています。

#define RSM_USER_APP_ID_BASE

0x80000000

#define RSM_USER_APP_ID_END

0xFFFFFFF

セグメントの再発行

int rsm_memseg_export_republish(rsm_memseg_export_handle_t memseg, rsmapi_access_entry_t access_list[], uint_t access_list_length);

この関数は、ノードのアクセス (制御) リストとセグメントのアクセスモードを新たに確立します。これらの変更は将来のインポート呼び出しだけに影響し、すでに許可されているインポート要求は取り消しません。

戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。

RSMERR_BAD_SEG_HNDL

セグメントハンドルが無効です

RSMERR_SEG_NOT_PUBLISHED

セグメントが発行されていません

RSMERR_BAD_ACL

アクセス制御リストが無効です

RSMERR_NOT_CREATOR

セグメントの作成者ではありません

RSMERR_INSUFFICIENT_MEMF

メモリーが不足しています

RSMERR_INSUFFICIENT_RESOURCES

資源が不足しています

RSMERR_INTERRUPTED

シグナルによって操作が割り込まれました

セグメントの発行解除

int rsm_memseg_export_unpublish(rsm_memseg_export_handle_t memseg);

戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。

RSMERR_BAD_SEG_HNDL

セグメントハンドルが無効です

RSMERR_SEG_NOT_PUBLISHED

セグメントが発行されていません

RSMERR_NOT_CREATOR

セグメントの作成者ではありません

RSMERR_INTERRUPTED

シグナルによって操作が割り込まれました

メモリーセグメントの再バインド

再バインド操作は、エクスポートセグメントの現在のバッキングストアを解放します。現在のバッキングストアを解放したあと、再バインド操作は、新しいバッキングストアを割り当てます。まず始めにアプリケーションは、セグメント用の新しい仮想メモリー割り当てを取得する必要があります。この操作はセグメントのインポータに透過的です。


注 –

アプリケーションは、再バインド操作が完了するまで、セグメントデータへアクセスしてはいけません。再バインド中にセグメントからデータを取得しようとしてもシステムエラーにはなりませんが、このような操作の結果は定義されていません。


セグメントの再バインド

int rsm_memseg_export_rebind(rsm_memseg_export_handle_t memseg, void *vaddr, offset_t off, size_t size);

戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。

RSMERR_BAD_SEG_HNDL

セグメントハンドルが無効です

RSMERR_BAD_LENGTH

長さが無効です

RSMERR_BAD_ADDR

アドレスが無効です

RSMERR_REBIND_NOT_ALLOWED

再バインドは許可されていません

RSMERR_NOT_CREATOR

セグメントの作成者ではありません

RSMERR_PERM_DENIED

Permission denied

RSMERR_INSUFFICIENT_MEM

メモリーが不足しています

RSMERR_INSUFFICIENT_RESOURCES

資源が不足しています

RSMERR_INTERRUPTED

シグナルによって操作が割り込まれました