---
name: "ibv_create_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_create_qp"
---

# ibv\_create\_qp(3)

create or destroy a queue pair (QP)

## NAME

ibv\_create\_qp, ibv\_destroy\_qp - create or destroy a queue pair (QP)

## SYNOPSIS

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

struct ibv_qp *ibv_create_qp(struct ibv_pd *pd,
                             struct ibv_qp_init_attr *qp_init_attr);

int ibv_destroy_qp(struct ibv_qp *qp);
```

## DESCRIPTION

**ibv\_create\_qp()** creates a queue pair (QP) associated with the protection domain *pd.* The argument *qp\_init\_attr* is an ibv\_qp\_init\_attr struct, as defined in \<infiniband/verbs.h\>.

```
struct ibv_qp_init_attr {
void                   *qp_context;     /* Associated context of the QP */
struct ibv_cq          *send_cq;        /* CQ to be associated with the Send Queue (SQ) */
struct ibv_cq          *recv_cq;        /* CQ to be associated with the Receive Queue (RQ) */
struct ibv_srq         *srq;            /* SRQ handle if QP is to be associated with an SRQ, otherwise NULL */
struct ibv_qp_cap       cap;            /* QP capabilities */
enum ibv_qp_type        qp_type;        /* QP Transport Service Type: IBV_QPT_RC, IBV_QPT_UC, IBV_QPT_UD, IBV_QPT_RAW_PACKET or IBV_QPT_DRIVER */
int                     sq_sig_all;     /* If set, each Work Request (WR) submitted to the SQ generates a completion entry */
};

struct ibv_qp_cap {
uint32_t                max_send_wr;    /* Requested max number of outstanding WRs in the SQ */
uint32_t                max_recv_wr;    /* Requested max number of outstanding WRs in the RQ */
uint32_t                max_send_sge;   /* Requested max number of scatter/gather (s/g) elements in a WR in the SQ */
uint32_t                max_recv_sge;   /* Requested max number of s/g elements in a WR in the RQ */
uint32_t                max_inline_data;/* Requested max number of data (bytes) that can be posted inline to the SQ, otherwise 0 */
};
```

The function **ibv\_create\_qp()** will update the *qp\_init\_attr-\>cap* struct with the actual QP values of the QP that was created; the values will be greater than or equal to the values requested.

**ibv\_destroy\_qp()** destroys the QP *qp.*

## RETURN VALUE

**ibv\_create\_qp()** returns a pointer to the created QP, or NULL if the request fails, and errno is set to indicate the reason. Check the QP number (**qp\_num**) in the returned QP.

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

## NOTES

**ibv\_create\_qp()** will fail if a it is asked to create QP of a type other than **IBV\_QPT\_RC** or **IBV\_QPT\_UD** associated with an SRQ.

The attributes max\_recv\_wr and max\_recv\_sge are ignored by **ibv\_create\_qp()** if the QP is to be associated with an SRQ.

**ibv\_destroy\_qp()** fails if the QP is attached to a multicast group.

**IBV\_QPT\_DRIVER** does not represent a specific service and is used for vendor specific QP logic.

## SEE ALSO

[**ibv\_alloc\_pd**(3)](/ibv_alloc_pd/3.md), [**ibv\_modify\_qp**(3)](/ibv_modify_qp/3.md), [**ibv\_query\_qp**(3)](/ibv_query_qp/3.md)

## AUTHORS

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