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 成功時。
錯誤碼 失敗時。