---
name: "ibv_modify_qp"
section: "3"
platform: "linux"
package: "rdma-core"
version: "65.0-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd"]
url: "https://new.carta.tech/ibv_modify_qp"
---

# ibv\_modify\_qp(3)

modify the attributes of a queue pair (QP)

## NAME

ibv\_modify\_qp - modify the attributes of a queue pair (QP)

## SYNOPSIS

```
#include <infiniband/verbs.h>

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

## DESCRIPTION

**ibv\_modify\_qp()** modifies the attributes of QP *qp* with the attributes in *attr* according to the mask *attr\_mask.* The argument *attr* is an ibv\_qp\_attr struct, as defined in \<infiniband/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 */
uint32_t                dest_qp_num;            /* Destination QP number (valid only for RC/UC QPs) */
unsigned 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) */
uint32_t                rate_limit;             /* Rate limit in kbps for packet pacing */
};
```

For details on struct ibv\_qp\_cap see the description of  **ibv\_create\_qp().** For details on struct ibv\_ah\_attr see the description of **ibv\_create\_ah().**

The argument *attr\_mask* specifies the QP attributes to be modified. The argument is either 0 or the bitwise OR of one or more of the following flags:

- **IBV\_QP\_STATE Modify qp\_state**

  - **IBV\_QP\_CUR\_STATE Set cur\_qp\_state**

  - **IBV\_QP\_EN\_SQD\_ASYNC\_NOTIFY Set en\_sqd\_async\_notify**

  - **IBV\_QP\_ACCESS\_FLAGS Set qp\_access\_flags**

  - **IBV\_QP\_PKEY\_INDEX Set pkey\_index**

  - **IBV\_QP\_PORT Set port\_num**

  - **IBV\_QP\_QKEY Set qkey**

  - **IBV\_QP\_AV Set ah\_attr**

  - **IBV\_QP\_PATH\_MTU Set path\_mtu**

  - **IBV\_QP\_TIMEOUT Set timeout**

  - **IBV\_QP\_RETRY\_CNT Set retry\_cnt**

  - **IBV\_QP\_RNR\_RETRY Set rnr\_retry**

  - **IBV\_QP\_RQ\_PSN Set rq\_psn**

  - **IBV\_QP\_MAX\_QP\_RD\_ATOMIC Set max\_rd\_atomic**

  - **IBV\_QP\_ALT\_PATH Set the alternative path via: alt\_ah\_attr, alt\_pkey\_index, alt\_port\_num, alt\_timeout**

  - **IBV\_QP\_MIN\_RNR\_TIMER Set min\_rnr\_timer**

  - **IBV\_QP\_SQ\_PSN Set sq\_psn**

  - **IBV\_QP\_MAX\_DEST\_RD\_ATOMIC Set max\_dest\_rd\_atomic**

  - **IBV\_QP\_PATH\_MIG\_STATE Set path\_mig\_state**

  - **IBV\_QP\_CAP Set cap**

  - **IBV\_QP\_DEST\_QPN Set dest\_qp\_num**

  - **IBV\_QP\_RATE\_LIMIT Set rate\_limit**

  ## RETURN VALUE

**ibv\_modify\_qp()** returns 0 on success, or the value of errno on failure (which indicates the failure reason).

## NOTES

If any of the modify attributes or the modify mask are invalid, none of the attributes will be modified (including the QP state).

Not all devices support resizing QPs.  To check if a device supports it, check if the **IBV\_DEVICE\_RESIZE\_MAX\_WR** bit is set in the device capabilities flags.

Not all devices support alternate paths.  To check if a device supports it, check if the **IBV\_DEVICE\_AUTO\_PATH\_MIG** bit is set in the device capabilities flags.

The following tables indicate for each QP Transport Service Type, the minimum list of attributes that must be changed upon transitioning QP state from: Reset --\> Init --\> RTR --\> RTS.

```
For QP Transport Service Type  IBV_QPT_UD:

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
```

```
For QP Transport Service Type  IBV_QPT_UC:

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
```

```
For QP Transport Service Type  IBV_QPT_RC:

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
```

```
For QP Transport Service Type  IBV_QPT_RAW_PACKET:

Next state     Required attributes
----------     ----------------------------------------
Init           IBV_QP_STATE, IBV_QP_PORT
RTR            IBV_QP_STATE
RTS            IBV_QP_STATE
```

If port flag IBV\_QPF\_GRH\_REQUIRED is set then ah\_attr and alt\_ah\_attr must be passed with definition of 'struct ibv\_ah\_attr { .is\_global = 1; .grh = {...}; }'.

## SEE ALSO

[**ibv\_create\_qp**(3)](/ibv_create_qp/3.md), [**ibv\_destroy\_qp**(3)](/ibv_destroy_qp/3.md), [**ibv\_query\_qp**(3)](/ibv_query_qp/3.md), [**ibv\_create\_ah**(3)](/ibv_create_ah/3.md)

## AUTHORS

- Dotan Barak \<dotanba@gmail.com\>
