ibv_modify_qp
修改佇列配對 (QP) 的屬性。
語法
#include <rdma/verbs.h>
int ibv_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr, int ibv_qp_attr_mask attr_mask)
在使用 QP 進行通訊之前,佇列配對 (QP) 必須經過漸進式的狀態序列。
下表指出 QP 狀態:
項目 | 描述子 |
---|---|
重設 | 新建的佇列是空的。 |
INIT | 已設定佇列所需的基本資訊,且佇列已備妥可公佈至接收佇列。 |
RTR | 佇列已備妥可接收。 遠端位址資訊是針對連接的 QP 所設定,且 QP 可以接收封包。 |
RTS | 佇列已備妥可傳送。 已設定逾時及重試參數。 QP 可以傳送封包。 |
狀態轉移與 ibv_modify_qp 函數搭配使用。
說明
ibv_modify_qp () 函數會根據 attr_mask 遮罩,以 attr 參數中的屬性來修改 QP qp 的屬性。 attr 參數是 ibv_qp_attr 結構,如<rdma/verbs.h> 檔案中所定義。
struct ibv_qp_attr {
enum ibv_qp_state qp_state; /* Move the QP to this state */
enum ibv_qp_state cur_qp_state; /* Assume this is the current QP state */
enum ibv_mtu path_mtu; /* Path MTU (valid only for RC/UC QPs) */
enum ibv_mig_state path_mig_state; /* Path migration state (valid if HCA supports APM) */
uint32_t qkey; /* Q_Key for the QP (valid only for UD QPs) */
uint32_t rq_psn; /* PSN for receive queue (valid only for RC/UC QPs) */
uint32_t sq_psn; /* PSN for send queue (valid only for RC/UC QPs) */
uint32_t dest_qp_num; /* Destination QP number (valid only for RC/UC QPs) */
int qp_access_flags; /* Mask of enabled remote access operations (valid only
for RC/UC QPs) */
struct ibv_qp_cap cap; /* QP capabilities (valid if HCA supports QP resizing) */
struct ibv_ah_attr ah_attr; /* Primary path address vector (valid only
for RC/UC QPs) */
struct ibv_ah_attr alt_ah_attr; /* Alternate path address vector (valid only
for RC/UC QPs) */
uint16_t pkey_index; /* Primary P_Key index */
uint16_t alt_pkey_index; /* Alternate P_Key index */
uint8_t en_sqd_async_notify; /* Enable SQD.drained async notification (Valid only
if qp_state is SQD) */
uint8_t sq_draining; /* Is the QP draining? Irrelevant for ibv_modify_qp() */
uint8_t max_rd_atomic; /* Number of outstanding RDMA reads & atomic operations
on the destination QP (valid only for RC QPs) */
uint8_t max_dest_rd_atomic; /* Number of responder resources for handling incoming
RDMA reads & atomic operations (valid only
for RC QPs)*/
uint8_t min_rnr_timer; /* Minimum RNR NAK timer (valid only for RC QPs) */
uint8_t port_num; /* Primary port number */
uint8_t timeout; /* Local ack timeout for primary path (valid only
for RC QPs) */
uint8_t retry_cnt; /* Retry count (valid only for RC QPs) */
uint8_t rnr_retry; /* RNR retry (valid only for RC QPs) */
uint8_t alt_port_num; /* Alternate port number */
uint8_t alt_timeout; /* Local ack timeout for alternate path (valid only
for RC QPs) */
};
attr_mask 參數會指定要修改的 QP 屬性。 引數是下列一個以上旗標的 0 或位元 OR:
- IBV_QP_STATE
- 修改 qp_state
- IBV_QP_CUR_STATE
- 設定 cur_qp_state
- IBV_QP_EN_SQD_ASYNC_NOTIFY
- 設定 en_sqd_async_notify
- IBV_QP_ACCESS_FLAGS
- 設定 qp_access_flags
- IBV_QP_PKEY_INDEX
- 設定 pkey_index
- IBV_QP_PORT
- 設定 port_num
- IBV_QP_QKEY
- 設定 qkey
- IBV_QP_AV
- 設定 ah_attr
- IBV_QP_PATH_MTU
- 設定 path_mtu
- IBV_QP_TIMEOUT
- 設定逾時
- IBV_QP_RETRY_CNT
- 設定 retry_cnt
- IBV_QP_RNR_RETRY
- 設定 rnr_retry
- IBV_QP_RQ_PSN
- 設定 rq_psn
- IBV_QP_MAX_QP_RD_ATOMIC
- 設定 max_rd_atomic
- IBV_QP_ALT_PATH
- 透過 alt_ah_attr、alt_pkey_index、alt_port_num、alt_timeout 來設定替代路徑
- IBV_QP_MIN_RNR_TIMER
- 設定 min_rnr_timer
- IBV_QP_SQ_PSN
- 設定 sq_psn
- IBV_QP_MAX_DEST_RD_ATOMIC
- 設定 max_dest_rd_atomic
- IBV_QP_PATH_MIG_STATE
- 設定 path_mig_state
- IBV_QP_CAP
- 設定帽
- IBV_QP_DEST_QPN
- 設定 dest_qp_num
附註:
- 如果任何修改屬性或修改遮罩無效,則不會修改任何屬性 (包括 QP 狀態)。
- 並非所有裝置都支援重新調整 QP 大小。 若要判定裝置是否支援重新調整 QP 的大小,請檢查是否在裝置功能旗標中設定 IBV_DEVICE_RESIZE_MAX_WR 位元。
- 並非所有裝置都支援替代路徑。 若要判定裝置是否支援替代路徑,請檢查是否在裝置功能旗標中設定 IBV_DEVICE_AUTO_PATH_MIG 位元。
- 下表指出 QP 傳輸服務的類型,在將 QP 狀態從「重設」變更為「起始設定」至 RTR 至 RTS 狀態之後必須變更的屬性清單下限。
The types of QP transport service for the IBV_QPT_UD type, follow: Next state Required attributes ---------- ---------------------------------------- Init IBV_QP_STATE, IBV_QP_PKEY_INDEX, IBV_QP_PORT, IBV_QP_QKEY RTR IBV_QP_STATE RTS IBV_QP_STATE, IBV_QP_SQ_PSN The types of QP transport service for the IBV_QPT_UC type, follow: Next state Required attributes ---------- ---------------------------------------- Init IBV_QP_STATE, IBV_QP_PKEY_INDEX, IBV_QP_PORT, IBV_QP_ACCESS_FLAGS RTR IBV_QP_STATE, IBV_QP_AV, IBV_QP_PATH_MTU, IBV_QP_DEST_QPN, IBV_QP_RQ_PSN RTS IBV_QP_STATE, IBV_QP_SQ_PSN The types of QP transport service for the IBV_QPT_RC type, follow: Next state Required attributes ---------- ---------------------------------------- Init IBV_QP_STATE, IBV_QP_PKEY_INDEX, IBV_QP_PORT, IBV_QP_ACCESS_FLAGS RTR IBV_QP_STATE, IBV_QP_AV, IBV_QP_PATH_MTU, IBV_QP_DEST_QPN, IBV_QP_RQ_PSN, IBV_QP_MAX_DEST_RD_ATOMIC, IBV_QP_MIN_RNR_TIMER RTS IBV_QP_STATE, IBV_QP_SQ_PSN, IBV_QP_MAX_QP_RD_ATOMIC, IBV_QP_RETRY_CNT, IBV_QP_RNR_RETRY, IBV_QP_TIMEOUT The types of QP transport service for the IBV_QPT_RAW_PACKET type, follow: Next state Required attributes ---------- ---------------------------------------- Init IBV_QP_STATE, IBV_QP_PORT RTR IBV_QP_STATE RTS IBV_QP_STATE
指出 QP 傳輸服務類型:
下一個狀態 | 必要屬性 |
---|---|
起始 | IBV_QP_STATE、IBV_QP_PKEY_INDEX、IBV_QP_PORT、IBV_QP_ACCESS_FLAGS |
RTR | IBV_QP_STATE、IBV_QP_AV、IBV_QP_PATH_MTU、IBV_QP_DEST_QPN、IBV_QP_RQ_PSN、IBV_QP_MAX_DEST_RD_ATOMIC、IBV_QP_MIN_RNR_TIMER |
RTS | IBV_QP_STATE、IBV_QP_SQ_PSN、IBV_QP_MAX_QP_RD_ATOMIC、IBV_QP_RETRY_CNT、IBV_QP_RNR_RETRY、IBV_QP_TIMEOUT |
輸入參數
項目 | 描述子 |
---|---|
qp | 指定 ibv_create_qp 函數的 ibv_qp 結構。 |
ATTR | 指定 QP 屬性。 |
屬性遮罩 | 指定位元遮罩。 位元遮罩定義針對呼叫所設定的 attr 參數內的屬性。 |
回覆值
項目 | 描述子 |
---|---|
0 | 成功時。 |
錯誤碼 | 失敗時。 |