IBV_QUERY_QP(3), IBV_MODIFY_QP(3)

作成日:2014.05.11

NAME

ibv_query_qp, ibv_modify_qp - Queue Pair(QP) の属性情報を取得・変更する。

SYNOPSIS

#include <infiniband/verbs.h>

int ibv_query_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr,
                 int attr_mask,
                 struct ibv_qp_init_attr *init_attr);

int ibv_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr, int attr_mask);

DESCRIPTION

ibv_query_qp() は QP qp は属性の情報を取得する。 取得する属性は attr_mask で指定する。 結果は attrinit_attr で受け取る。

attr_maskenum ibv_qp_attr_mask 列挙子の論理和で指定する。

init_attribv_create_qp() の引数 qp_init_attr で設定した値がコピーされる(ただし QP ケーパビリティは更新後の値が返ってくる)。

ibv_modify_qp() は QP qpattr_mask で指定した属性値を attr から読み取り、その値に属性を変更する。

attr_maskenum ibv_qp_attr_mask 列挙子の論理和で指定する。 ただし qp のサービスタイプと現在のステートによって指定できる属性が変わる。 「InfiniBand の QP ステートの遷移を理解する」の 3. QP ステートの遷移 を参照のこと。

Table 1: struct ibv_qp_attr 構造体
メンバ名attr_mask制限説明
ibv_query_qpibv_modfiy_qp
qp_stateenum ibv_qp_stateIBV_QP_STATE  現在の QP ステート。 次に遷移する QP ステート。
cur_qp_stateenum ibv_qp_stateIBV_QP_CUR_STATE*1 無視される。 想定遷移元 QP ステート。
port_numuint8_tIBV_QP_PORT*2 Primary port number。QP が接続する物理ポート番号 (1からはじまる)
qkeyuint32_tIBV_QP_QKEYUD Q_Key。Q_Key はここを参照のこと。
pkey_indexuint16_tIBV_QP_PKEY_INDEXUD Primary P_Key Index。詳細は ここを参照のこと。
sq_psnuint32_tIBV_QP_SQ_PSN*3 Send Queue(SQ) の PSN。
rq_psnuint32_tIBV_QP_RQ_PSNRC/UC *3 Receive Queue(RQ) の PSN。
path_mtuenum ibv_mtuIBV_QP_PATH_MTURC/UC Path MTU。この値はポートに設定された Active MTU 以下である必要がある。
dest_qp_numuint32_tIBV_QP_DEST_QPNRC/UC Destination QP 番号。
qp_access_flagsintIBV_QP_ACCESS_FLAGSRC/UC *4 アクセス権限。この QP が受信側として RDMA 系オペレーションを受信する場合に、以下のマクロの論理和で指定する。
意味マクロ
RDMA WRITE オペレーション(with Immediate を含む)IBV_ACCESS_REMOTE_WRITE
RDMA READ オペレーションIBV_ACCESS_REMOTE_READ
Compare and Swap オペレーション、Fetch and Add オペレーションIBV_ACCESS_REMOTE_ATOMIC
capstruct ibv_qp_capIBV_QP_CAPRC/UC *5 QP ケーパビリティ。ibv_create_qpで指定した値が取得できる。HCA が QP Resizing に対応していれば変更できる。
ah_attrstruct ibv_ah_attrIBV_QP_AVRC/UC Primary path の 送信先を示す Address Vector(AH)。AV は Address Handle(AH) とほぼ同義である。struct ibv_ah_attr 構造体の詳細は ibv_create_ah() を参照のこと。
max_rd_atomicuint8_tIBV_QP_MAX_QP_RD_ATOMICRC 送信側の RDMA READ と Atomic operations の最大同時発行数。この値はリモートの QP の max_dest_rd_atomic 以下とする必要がある。またibv_query_device()max_qp_rd_atom 以下の値を指定する必要がある。 「InfiniBand の再送制御を理解する」 3.4 RDMA READ と ATOMIC Operations の同時実行数も参照のこと。
max_dest_rd_atomicuint8_tIBV_QP_MAX_DEST_RD_ATOMICRC 受信側の RDMA READ と Atomic operations の最大同時受信数。ibv_query_device()max_qp_init_rd_atom 以下の値を指定する必要がある。 「InfiniBand の再送制御を理解する」 3.4 RDMA READ と ATOMIC Operations の同時実行数も参照のこと。
min_rnr_timeruint8_tIBV_QP_MIN_RNR_TIMERRC Minimum RNR NAK Timer を 0〜31 で指定。min_rnr_timer は受信側に設定するが、この値を使うのはリモートの送信側である。 詳細は「InfiniBand の再送制御を理解する」の 2.2 RNR NAK Retryを参照のこと。
timeoutuint8_tIBV_QP_TIMEOUTRC Local ack timeout を 0〜31 で指定。0 はタイムアウト時間が無限を意味する。詳細は「InfiniBand の再送制御を理解する」の 2.1 Local ACK Timeoutを参照のこと。
retry_cntuint8_tIBV_QP_RETRY_CNTRC Retry count を 0〜7 で指定。詳細は「InfiniBand の再送制御を理解する」の 2.1 Local ACK Timeoutを参照のこと。
rnr_retryuint8_tIBV_QP_RNR_RETRYRC RNR Retry を 0〜7 で指定。7 を指定すると無限にリトライする。詳細は「InfiniBand の再送制御を理解する」の 2.2 RNR NAK Retryを参照のこと。
en_sqd_async_notifyuint8_tIBV_QP_EN_SQD_ASYNC_NOTIFY  RTR → SQD 遷移時に設定し、SQD になった後、送信中の Send WR が全て完了したタイミングで非同期イベント Send Queue Drained (IBV_EVENT_SQ_DRAINED) をあげるかどうか。 非 0 なら非同期イベントを送信し、0 なら送信しない。 詳細は「InfiniBand の QP ステートの遷移を理解する」の 2.5 Send Queue Drain (SQD)「まず InfiniBand Verbs プログラムを作成してみよう」の 8.1 Shared Receive Queue (SRQ) を使ってみる。を参照のこと。
sq_draininguint8_t無指定  (SQD ステートに遷移後)送信中の Send WR を残っている場合は 1、完了した場合は 0。 詳細は「InfiniBand の QP ステートの遷移を理解する」の 2.5 Send Queue Drain (SQD)を参照のこと。設定はできない
path_mig_stateenum ibv_mig_stateIBV_QP_PATH_MIG_STATE*6 Path Migration State (valid if HCA supports APM)。
alt_ah_attrstruct ibv_ah_attrIBV_QP_ALT_PATH*6  
alt_port_numuint8_tIBV_QP_ALT_PATH*6  
alt_pkey_indexuint16_tIBV_QP_ALT_PATH*6  
alt_timeoutuint8_tIBV_QP_ALT_PATH*6  
*1
IBV_QP_CUR_STATEibv_query_device() の取得できる device_cap_flagsIBV_DEVICE_CURR_QP_STATE_MOD のビットが立っている場合のみ実行できる。
*2
IBV_QP_PORTibv_query_device() の取得できる device_cap_flagsIBV_DEVICE_CHANGE_PHY_PORT のビットが立っている場合は、SQD → SQD の遷移でも変更できる。
*3
sq_psn は UD QP でも ibv_modify_qp で設定できるが、意味がない。rq_psn は UD QP でも ibv_query_qp で取得できるが、RQ PSN の値であるとは保証できない。
*4
qp_access_flags には IBV_ACCESS_LOCAL_WRITE を指定しなくてもよい。
*5
IBV_QP_CAPibv_query_device() の取得できる device_cap_flagsIBV_DEVICE_RESIZE_MAX_WR のビットが立っている場合のみ実行できる。
*6
IBV_QP_PATH_MIG_STATEibv_query_device() の取得できる device_cap_flagsIBV_DEVICE_AUTO_PATH_MIG のビットが立っている場合のみ実行できる。

RETURN VALUE

ibv_query_qp() は成功した場合、0 を返す。 失敗した場合は、エラーの原因を示す値(errno と同じ)を返す。

ibv_modify_qp() は成功した場合、0 を返す。 失敗した場合は、エラーの原因を示す値(errno と同じ)を返す。

NOTES

ibv_query_qp() で取得する属性は attr_mask で指定するが、HCA によっては attr_mask を無視して全ての属性情報を取得するものもある。 Mellanox ConnectXN はそれにあたる。

ibv_query_qp() を複数回呼び出した場合は、qp_statesq_psnrq_psnpath_mig_statesq_drainingah_attr は値が変わる可能性がある。 その他の属性は ibv_modify_qp() など API で設定した値が取り出す。

ibv_modify_qp() は、無効な attr_mask を指定した場合は、全ての属性を変更しない。

SEE ALSO

InfiniBand Verbs API Referenceibv_create_qp(3)ibv_destroy_qp(3)ibv_modify_qp(3)ibv_query_qp(3)ibv_create_ah(3)

AUTHORS

原文 Dotan Barak <dotanba@gmail.com>
原文にない加筆がある。

コメント


TOP    掲示板    戻る
Written by NAKAMURA Minoru, Email: nminoru atmark nminoru dot jp, Twitter:@nminoru_jp