IB/core: Change ib_create_cq to use struct ib_cq_init_attr
authorMatan Barak <matanb@mellanox.com>
Thu, 11 Jun 2015 13:35:21 +0000 (16:35 +0300)
committerDoug Ledford <dledford@redhat.com>
Fri, 12 Jun 2015 18:49:10 +0000 (14:49 -0400)
Currently, ib_create_cq uses cqe and comp_vecotr instead
of the extendible ib_cq_init_attr struct.

Earlier patches already changed the vendors to work with
ib_cq_init_attr. This patch changes the consumers too.

Signed-off-by: Matan Barak <matanb@mellanox.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
18 files changed:
drivers/infiniband/core/mad.c
drivers/infiniband/core/verbs.c
drivers/infiniband/hw/ehca/ehca_main.c
drivers/infiniband/hw/mlx4/mad.c
drivers/infiniband/hw/mlx4/main.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/ulp/ipoib/ipoib_verbs.c
drivers/infiniband/ulp/iser/iser_verbs.c
drivers/infiniband/ulp/isert/ib_isert.c
drivers/infiniband/ulp/srp/ib_srp.c
drivers/infiniband/ulp/srpt/ib_srpt.c
drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
include/rdma/ib_verbs.h
net/9p/trans_rdma.c
net/rds/ib_cm.c
net/rds/iw_cm.c
net/sunrpc/xprtrdma/svc_rdma_transport.c
net/sunrpc/xprtrdma/verbs.c

index 600af266838ce6dc24698223066afd02b379f148..533c0b2e7a635b94b02da73493d7315992a0b60b 100644 (file)
@@ -2923,6 +2923,7 @@ static int ib_mad_port_open(struct ib_device *device,
        unsigned long flags;
        char name[sizeof "ib_mad123"];
        int has_smi;
+       struct ib_cq_init_attr cq_attr = {};
 
        /* Create new device info */
        port_priv = kzalloc(sizeof *port_priv, GFP_KERNEL);
@@ -2943,9 +2944,10 @@ static int ib_mad_port_open(struct ib_device *device,
        if (has_smi)
                cq_size *= 2;
 
+       cq_attr.cqe = cq_size;
        port_priv->cq = ib_create_cq(port_priv->device,
                                     ib_mad_thread_completion_handler,
-                                    NULL, port_priv, cq_size, 0);
+                                    NULL, port_priv, &cq_attr);
        if (IS_ERR(port_priv->cq)) {
                dev_err(&device->dev, "Couldn't create ib_mad CQ\n");
                ret = PTR_ERR(port_priv->cq);
index 7bffdbe6afe98e2c554e4bb793055aca0185cea6..bac3fb406a7470edb0deb1d66d6559118fe8ac53 100644 (file)
@@ -1076,12 +1076,12 @@ EXPORT_SYMBOL(ib_destroy_qp);
 struct ib_cq *ib_create_cq(struct ib_device *device,
                           ib_comp_handler comp_handler,
                           void (*event_handler)(struct ib_event *, void *),
-                          void *cq_context, int cqe, int comp_vector)
+                          void *cq_context,
+                          const struct ib_cq_init_attr *cq_attr)
 {
        struct ib_cq *cq;
-       struct ib_cq_init_attr attr = {.cqe = cqe, .comp_vector = comp_vector};
 
-       cq = device->create_cq(device, &attr, NULL, NULL);
+       cq = device->create_cq(device, cq_attr, NULL, NULL);
 
        if (!IS_ERR(cq)) {
                cq->device        = device;
index 5e30b72d3677b6a93be5544e40657e572fdaf6c0..c0e45a46504bcb545cda89266851fdfdb2f23498 100644 (file)
@@ -552,6 +552,7 @@ static int ehca_create_aqp1(struct ehca_shca *shca, u32 port)
        struct ib_cq *ibcq;
        struct ib_qp *ibqp;
        struct ib_qp_init_attr qp_init_attr;
+       struct ib_cq_init_attr cq_attr = {};
        int ret;
 
        if (sport->ibcq_aqp1) {
@@ -559,7 +560,9 @@ static int ehca_create_aqp1(struct ehca_shca *shca, u32 port)
                return -EPERM;
        }
 
-       ibcq = ib_create_cq(&shca->ib_device, NULL, NULL, (void *)(-1), 10, 0);
+       cq_attr.cqe = 10;
+       ibcq = ib_create_cq(&shca->ib_device, NULL, NULL, (void *)(-1),
+                           &cq_attr);
        if (IS_ERR(ibcq)) {
                ehca_err(&shca->ib_device, "Cannot create AQP1 CQ.");
                return PTR_ERR(ibcq);
index 614ac6f07ae1490b50f715f2bb8fa45452cbb589..a790be5a7423aab4951338f488e62f8821795c6a 100644 (file)
@@ -1774,6 +1774,7 @@ static int create_pv_resources(struct ib_device *ibdev, int slave, int port,
                               int create_tun, struct mlx4_ib_demux_pv_ctx *ctx)
 {
        int ret, cq_size;
+       struct ib_cq_init_attr cq_attr = {};
 
        if (ctx->state != DEMUX_PV_STATE_DOWN)
                return -EEXIST;
@@ -1802,8 +1803,9 @@ static int create_pv_resources(struct ib_device *ibdev, int slave, int port,
        if (ctx->has_smi)
                cq_size *= 2;
 
+       cq_attr.cqe = cq_size;
        ctx->cq = ib_create_cq(ctx->ib_dev, mlx4_ib_tunnel_comp_handler,
-                              NULL, ctx, cq_size, 0);
+                              NULL, ctx, &cq_attr);
        if (IS_ERR(ctx->cq)) {
                ret = PTR_ERR(ctx->cq);
                pr_err("Couldn't create tunnel CQ (%d)\n", ret);
index 86c0c27120f718f8cc18232f7f5d10a9d8808d54..af2071ed143711a2320a83b43be4eb99898c93b6 100644 (file)
@@ -758,6 +758,7 @@ static struct ib_xrcd *mlx4_ib_alloc_xrcd(struct ib_device *ibdev,
                                          struct ib_udata *udata)
 {
        struct mlx4_ib_xrcd *xrcd;
+       struct ib_cq_init_attr cq_attr = {};
        int err;
 
        if (!(to_mdev(ibdev)->dev->caps.flags & MLX4_DEV_CAP_FLAG_XRC))
@@ -777,7 +778,8 @@ static struct ib_xrcd *mlx4_ib_alloc_xrcd(struct ib_device *ibdev,
                goto err2;
        }
 
-       xrcd->cq = ib_create_cq(ibdev, NULL, NULL, xrcd, 1, 0);
+       cq_attr.cqe = 1;
+       xrcd->cq = ib_create_cq(ibdev, NULL, NULL, xrcd, &cq_attr);
        if (IS_ERR(xrcd->cq)) {
                err = PTR_ERR(xrcd->cq);
                goto err3;
index 9565c203a497b1b145e951845bf30dc0ef697873..06b023855a335154306d6c1a90ebfe51ca0d567a 100644 (file)
@@ -971,6 +971,7 @@ static int create_umr_res(struct mlx5_ib_dev *dev)
        struct ib_cq *cq;
        struct ib_qp *qp;
        struct ib_mr *mr;
+       struct ib_cq_init_attr cq_attr = {};
        int ret;
 
        attr = kzalloc(sizeof(*attr), GFP_KERNEL);
@@ -994,8 +995,9 @@ static int create_umr_res(struct mlx5_ib_dev *dev)
                goto error_1;
        }
 
-       cq = ib_create_cq(&dev->ib_dev, mlx5_umr_cq_handler, NULL, NULL, 128,
-                         0);
+       cq_attr.cqe = 128;
+       cq = ib_create_cq(&dev->ib_dev, mlx5_umr_cq_handler, NULL, NULL,
+                         &cq_attr);
        if (IS_ERR(cq)) {
                mlx5_ib_dbg(dev, "Couldn't create CQ for sync UMR QP\n");
                ret = PTR_ERR(cq);
index e5cc43074196dbab1ae216cb43135f7e5f081c66..9e6ee82a8fd76f490de93d6117754e2a6657ec72 100644 (file)
@@ -141,6 +141,7 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca)
                .sq_sig_type = IB_SIGNAL_ALL_WR,
                .qp_type     = IB_QPT_UD
        };
+       struct ib_cq_init_attr cq_attr = {};
 
        int ret, size;
        int i;
@@ -178,14 +179,17 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca)
        } else
                goto out_free_wq;
 
-       priv->recv_cq = ib_create_cq(priv->ca, ipoib_ib_completion, NULL, dev, size, 0);
+       cq_attr.cqe = size;
+       priv->recv_cq = ib_create_cq(priv->ca, ipoib_ib_completion, NULL,
+                                    dev, &cq_attr);
        if (IS_ERR(priv->recv_cq)) {
                printk(KERN_WARNING "%s: failed to create receive CQ\n", ca->name);
                goto out_cm_dev_cleanup;
        }
 
+       cq_attr.cqe = ipoib_sendq_size;
        priv->send_cq = ib_create_cq(priv->ca, ipoib_send_comp_handler, NULL,
-                                    dev, ipoib_sendq_size, 0);
+                                    dev, &cq_attr);
        if (IS_ERR(priv->send_cq)) {
                printk(KERN_WARNING "%s: failed to create send CQ\n", ca->name);
                goto out_free_recv_cq;
index d33c5c000f9cb27a9b8617fe6fdffa57f95d64fd..5c9f565ea0e88840c3c3c7a031e20180c3c8025d 100644 (file)
@@ -126,14 +126,17 @@ static int iser_create_device_ib_res(struct iser_device *device)
                goto pd_err;
 
        for (i = 0; i < device->comps_used; i++) {
+               struct ib_cq_init_attr cq_attr = {};
                struct iser_comp *comp = &device->comps[i];
 
                comp->device = device;
+               cq_attr.cqe = max_cqe;
+               cq_attr.comp_vector = i;
                comp->cq = ib_create_cq(device->ib_device,
                                        iser_cq_callback,
                                        iser_cq_event_callback,
                                        (void *)comp,
-                                       max_cqe, i);
+                                       &cq_attr);
                if (IS_ERR(comp->cq)) {
                        comp->cq = NULL;
                        goto cq_err;
index d99a0c8f14a422225c87afa1c19e59f1c0fa326a..9e7b4927265c76eadcdc8507188a15e8e0d99a71 100644 (file)
@@ -318,15 +318,18 @@ isert_alloc_comps(struct isert_device *device,
        max_cqe = min(ISER_MAX_CQ_LEN, attr->max_cqe);
 
        for (i = 0; i < device->comps_used; i++) {
+               struct ib_cq_init_attr cq_attr = {};
                struct isert_comp *comp = &device->comps[i];
 
                comp->device = device;
                INIT_WORK(&comp->work, isert_cq_work);
+               cq_attr.cqe = max_cqe;
+               cq_attr.comp_vector = i;
                comp->cq = ib_create_cq(device->ib_device,
                                        isert_cq_callback,
                                        isert_cq_event_callback,
                                        (void *)comp,
-                                       max_cqe, i);
+                                       &cq_attr);
                if (IS_ERR(comp->cq)) {
                        isert_err("Unable to allocate cq\n");
                        ret = PTR_ERR(comp->cq);
index c3f654d20038eaab65ee66da2924e7404ced8c52..eada8f758ad4089ec0e15a7469ccc50cb626a98f 100644 (file)
@@ -500,6 +500,7 @@ static int srp_create_ch_ib(struct srp_rdma_ch *ch)
        struct ib_fmr_pool *fmr_pool = NULL;
        struct srp_fr_pool *fr_pool = NULL;
        const int m = 1 + dev->use_fast_reg;
+       struct ib_cq_init_attr cq_attr = {};
        int ret;
 
        init_attr = kzalloc(sizeof *init_attr, GFP_KERNEL);
@@ -507,15 +508,19 @@ static int srp_create_ch_ib(struct srp_rdma_ch *ch)
                return -ENOMEM;
 
        /* + 1 for SRP_LAST_WR_ID */
+       cq_attr.cqe = target->queue_size + 1;
+       cq_attr.comp_vector = ch->comp_vector;
        recv_cq = ib_create_cq(dev->dev, srp_recv_completion, NULL, ch,
-                              target->queue_size + 1, ch->comp_vector);
+                              &cq_attr);
        if (IS_ERR(recv_cq)) {
                ret = PTR_ERR(recv_cq);
                goto err;
        }
 
+       cq_attr.cqe = m * target->queue_size;
+       cq_attr.comp_vector = ch->comp_vector;
        send_cq = ib_create_cq(dev->dev, srp_send_completion, NULL, ch,
-                              m * target->queue_size, ch->comp_vector);
+                              &cq_attr);
        if (IS_ERR(send_cq)) {
                ret = PTR_ERR(send_cq);
                goto err_recv_cq;
index 9b84b4c0a000a32bdc896d6142fb63c7d5b13a3a..783efe1a3a2857576989cfc91be356310e86c700 100644 (file)
@@ -2080,6 +2080,7 @@ static int srpt_create_ch_ib(struct srpt_rdma_ch *ch)
        struct srpt_port *sport = ch->sport;
        struct srpt_device *sdev = sport->sdev;
        u32 srp_sq_size = sport->port_attrib.srp_sq_size;
+       struct ib_cq_init_attr cq_attr = {};
        int ret;
 
        WARN_ON(ch->rq_size < 1);
@@ -2090,8 +2091,9 @@ static int srpt_create_ch_ib(struct srpt_rdma_ch *ch)
                goto out;
 
 retry:
+       cq_attr.cqe = ch->rq_size + srp_sq_size;
        ch->cq = ib_create_cq(sdev->device, srpt_completion, NULL, ch,
-                             ch->rq_size + srp_sq_size, 0);
+                             &cq_attr);
        if (IS_ERR(ch->cq)) {
                ret = PTR_ERR(ch->cq);
                pr_err("failed to create CQ cqe= %d ret= %d\n",
index 3bad441de8dc90df646caecb64e40e54b83c15bc..c41b5575df05e38d7c5d5cdd3503d136affaabab 100644 (file)
@@ -647,6 +647,7 @@ kib_conn_t *kiblnd_create_conn(kib_peer_t *peer, struct rdma_cm_id *cmid,
        kib_dev_t             *dev;
        struct ib_qp_init_attr *init_qp_attr;
        struct kib_sched_info   *sched;
+       struct ib_cq_init_attr  cq_attr = {};
        kib_conn_t              *conn;
        struct ib_cq            *cq;
        unsigned long           flags;
@@ -742,10 +743,11 @@ kib_conn_t *kiblnd_create_conn(kib_peer_t *peer, struct rdma_cm_id *cmid,
 
        kiblnd_map_rx_descs(conn);
 
+       cq_attr.cqe = IBLND_CQ_ENTRIES(version);
+       cq_attr.comp_vector = kiblnd_get_completion_vector(conn, cpt);
        cq = ib_create_cq(cmid->device,
                          kiblnd_cq_completion, kiblnd_cq_event, conn,
-                         IBLND_CQ_ENTRIES(version),
-                         kiblnd_get_completion_vector(conn, cpt));
+                         &cq_attr);
        if (IS_ERR(cq)) {
                CERROR("Can't create CQ: %ld, cqe: %d\n",
                       PTR_ERR(cq), IBLND_CQ_ENTRIES(version));
index b25ffa05e3384b504893a7f3f2d79a9305a8fa67..ea01e9953ec7d5ba0424daf7ebaa1b977a0b21c8 100644 (file)
@@ -2314,16 +2314,15 @@ static inline int ib_post_recv(struct ib_qp *qp,
  *   asynchronous event not associated with a completion occurs on the CQ.
  * @cq_context: Context associated with the CQ returned to the user via
  *   the associated completion and event handlers.
- * @cqe: The minimum size of the CQ.
- * @comp_vector - Completion vector used to signal completion events.
- *     Must be >= 0 and < context->num_comp_vectors.
+ * @cq_attr: The attributes the CQ should be created upon.
  *
  * Users can examine the cq structure to determine the actual CQ size.
  */
 struct ib_cq *ib_create_cq(struct ib_device *device,
                           ib_comp_handler comp_handler,
                           void (*event_handler)(struct ib_event *, void *),
-                          void *cq_context, int cqe, int comp_vector);
+                          void *cq_context,
+                          const struct ib_cq_init_attr *cq_attr);
 
 /**
  * ib_resize_cq - Modifies the capacity of the CQ.
index 3533d2a53ab649e634487edfa63dcc965a3ffa07..37a78d20c0f647a976ec58dbad1a06a957cc1771 100644 (file)
@@ -648,6 +648,7 @@ rdma_create_trans(struct p9_client *client, const char *addr, char *args)
        struct rdma_conn_param conn_param;
        struct ib_qp_init_attr qp_attr;
        struct ib_device_attr devattr;
+       struct ib_cq_init_attr cq_attr = {};
 
        /* Parse the transport specific mount options */
        err = parse_opts(args, &opts);
@@ -705,9 +706,10 @@ rdma_create_trans(struct p9_client *client, const char *addr, char *args)
                goto error;
 
        /* Create the Completion Queue */
+       cq_attr.cqe = opts.sq_depth + opts.rq_depth + 1;
        rdma->cq = ib_create_cq(rdma->cm_id->device, cq_comp_handler,
                                cq_event_handler, client,
-                               opts.sq_depth + opts.rq_depth + 1, 0);
+                               &cq_attr);
        if (IS_ERR(rdma->cq))
                goto error;
        ib_req_notify_cq(rdma->cq, IB_CQ_NEXT_COMP);
index b8d1bdae8a2a7cca0d70f199cf747e18302506a8..0da2a45b33bd8ee5df6915e253440d3bc65081fc 100644 (file)
@@ -247,6 +247,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
        struct rds_ib_connection *ic = conn->c_transport_data;
        struct ib_device *dev = ic->i_cm_id->device;
        struct ib_qp_init_attr attr;
+       struct ib_cq_init_attr cq_attr = {};
        struct rds_ib_device *rds_ibdev;
        int ret;
 
@@ -270,9 +271,10 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
        ic->i_pd = rds_ibdev->pd;
        ic->i_mr = rds_ibdev->mr;
 
+       cq_attr.cqe = ic->i_send_ring.w_nr + 1;
        ic->i_send_cq = ib_create_cq(dev, rds_ib_send_cq_comp_handler,
                                     rds_ib_cq_event_handler, conn,
-                                    ic->i_send_ring.w_nr + 1, 0);
+                                    &cq_attr);
        if (IS_ERR(ic->i_send_cq)) {
                ret = PTR_ERR(ic->i_send_cq);
                ic->i_send_cq = NULL;
@@ -280,9 +282,10 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
                goto out;
        }
 
+       cq_attr.cqe = ic->i_recv_ring.w_nr;
        ic->i_recv_cq = ib_create_cq(dev, rds_ib_recv_cq_comp_handler,
                                     rds_ib_cq_event_handler, conn,
-                                    ic->i_recv_ring.w_nr, 0);
+                                    &cq_attr);
        if (IS_ERR(ic->i_recv_cq)) {
                ret = PTR_ERR(ic->i_recv_cq);
                ic->i_recv_cq = NULL;
index a6c2bea9f8f9b37b46ce381336a90fb685187083..8f486fa3207901895e5184f50eb55563b6628e30 100644 (file)
@@ -179,6 +179,7 @@ static int rds_iw_init_qp_attrs(struct ib_qp_init_attr *attr,
                void *context)
 {
        struct ib_device *dev = rds_iwdev->dev;
+       struct ib_cq_init_attr cq_attr = {};
        unsigned int send_size, recv_size;
        int ret;
 
@@ -198,9 +199,10 @@ static int rds_iw_init_qp_attrs(struct ib_qp_init_attr *attr,
        attr->sq_sig_type = IB_SIGNAL_REQ_WR;
        attr->qp_type = IB_QPT_RC;
 
+       cq_attr.cqe = send_size;
        attr->send_cq = ib_create_cq(dev, send_cq_handler,
                                     rds_iw_cq_event_handler,
-                                    context, send_size, 0);
+                                    context, &cq_attr);
        if (IS_ERR(attr->send_cq)) {
                ret = PTR_ERR(attr->send_cq);
                attr->send_cq = NULL;
@@ -208,9 +210,10 @@ static int rds_iw_init_qp_attrs(struct ib_qp_init_attr *attr,
                goto out;
        }
 
+       cq_attr.cqe = recv_size;
        attr->recv_cq = ib_create_cq(dev, recv_cq_handler,
                                     rds_iw_cq_event_handler,
-                                    context, recv_size, 0);
+                                    context, &cq_attr);
        if (IS_ERR(attr->recv_cq)) {
                ret = PTR_ERR(attr->recv_cq);
                attr->recv_cq = NULL;
index 88eb994edd36419abda0202a087f0540bbf6362c..f4cfa764d76f95063d9db606afb81236a492a337 100644 (file)
@@ -855,6 +855,7 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
        struct svcxprt_rdma *listen_rdma;
        struct svcxprt_rdma *newxprt = NULL;
        struct rdma_conn_param conn_param;
+       struct ib_cq_init_attr cq_attr = {};
        struct ib_qp_init_attr qp_attr;
        struct ib_device_attr devattr;
        int uninitialized_var(dma_mr_acc);
@@ -907,22 +908,22 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
                dprintk("svcrdma: error creating PD for connect request\n");
                goto errout;
        }
+       cq_attr.cqe = newxprt->sc_sq_depth;
        newxprt->sc_sq_cq = ib_create_cq(newxprt->sc_cm_id->device,
                                         sq_comp_handler,
                                         cq_event_handler,
                                         newxprt,
-                                        newxprt->sc_sq_depth,
-                                        0);
+                                        &cq_attr);
        if (IS_ERR(newxprt->sc_sq_cq)) {
                dprintk("svcrdma: error creating SQ CQ for connect request\n");
                goto errout;
        }
+       cq_attr.cqe = newxprt->sc_max_requests;
        newxprt->sc_rq_cq = ib_create_cq(newxprt->sc_cm_id->device,
                                         rq_comp_handler,
                                         cq_event_handler,
                                         newxprt,
-                                        newxprt->sc_max_requests,
-                                        0);
+                                        &cq_attr);
        if (IS_ERR(newxprt->sc_rq_cq)) {
                dprintk("svcrdma: error creating RQ CQ for connect request\n");
                goto errout;
index 6f6b8a56212a904c3adda46f3a1a53470bb7dd32..52df265b472a9b2b79574c7d9363acba26ea5d8b 100644 (file)
@@ -644,6 +644,7 @@ rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia,
 {
        struct ib_device_attr *devattr = &ia->ri_devattr;
        struct ib_cq *sendcq, *recvcq;
+       struct ib_cq_init_attr cq_attr = {};
        int rc, err;
 
        /* check provider's send/recv wr limits */
@@ -691,9 +692,9 @@ rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia,
        init_waitqueue_head(&ep->rep_connect_wait);
        INIT_DELAYED_WORK(&ep->rep_connect_worker, rpcrdma_connect_worker);
 
+       cq_attr.cqe = ep->rep_attr.cap.max_send_wr + 1;
        sendcq = ib_create_cq(ia->ri_id->device, rpcrdma_sendcq_upcall,
-                                 rpcrdma_cq_async_error_upcall, ep,
-                                 ep->rep_attr.cap.max_send_wr + 1, 0);
+                                 rpcrdma_cq_async_error_upcall, ep, &cq_attr);
        if (IS_ERR(sendcq)) {
                rc = PTR_ERR(sendcq);
                dprintk("RPC:       %s: failed to create send CQ: %i\n",
@@ -708,9 +709,9 @@ rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia,
                goto out2;
        }
 
+       cq_attr.cqe = ep->rep_attr.cap.max_recv_wr + 1;
        recvcq = ib_create_cq(ia->ri_id->device, rpcrdma_recvcq_upcall,
-                                 rpcrdma_cq_async_error_upcall, ep,
-                                 ep->rep_attr.cap.max_recv_wr + 1, 0);
+                                 rpcrdma_cq_async_error_upcall, ep, &cq_attr);
        if (IS_ERR(recvcq)) {
                rc = PTR_ERR(recvcq);
                dprintk("RPC:       %s: failed to create recv CQ: %i\n",