Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[linux-2.6-microblaze.git] / drivers / infiniband / hw / mlx5 / gsi.c
index 7fcad91..3ad8f63 100644 (file)
@@ -116,8 +116,6 @@ int mlx5_ib_create_gsi(struct ib_pd *pd, struct mlx5_ib_qp *mqp,
                goto err_free_tx;
        }
 
-       mutex_lock(&dev->devr.mutex);
-
        if (dev->devr.ports[port_num - 1].gsi) {
                mlx5_ib_warn(dev, "GSI QP already exists on port %d\n",
                             port_num);
@@ -147,35 +145,20 @@ int mlx5_ib_create_gsi(struct ib_pd *pd, struct mlx5_ib_qp *mqp,
                hw_init_attr.cap.max_inline_data = 0;
        }
 
-       gsi->rx_qp = mlx5_ib_create_qp(pd, &hw_init_attr, NULL);
+       gsi->rx_qp = ib_create_qp(pd, &hw_init_attr);
        if (IS_ERR(gsi->rx_qp)) {
                mlx5_ib_warn(dev, "unable to create hardware GSI QP. error %ld\n",
                             PTR_ERR(gsi->rx_qp));
                ret = PTR_ERR(gsi->rx_qp);
                goto err_destroy_cq;
        }
-       gsi->rx_qp->device = pd->device;
-       gsi->rx_qp->pd = pd;
-       gsi->rx_qp->real_qp = gsi->rx_qp;
-
-       gsi->rx_qp->qp_type = hw_init_attr.qp_type;
-       gsi->rx_qp->send_cq = hw_init_attr.send_cq;
-       gsi->rx_qp->recv_cq = hw_init_attr.recv_cq;
-       gsi->rx_qp->event_handler = hw_init_attr.event_handler;
-       spin_lock_init(&gsi->rx_qp->mr_lock);
-       INIT_LIST_HEAD(&gsi->rx_qp->rdma_mrs);
-       INIT_LIST_HEAD(&gsi->rx_qp->sig_mrs);
 
        dev->devr.ports[attr->port_num - 1].gsi = gsi;
-
-       mutex_unlock(&dev->devr.mutex);
-
        return 0;
 
 err_destroy_cq:
        ib_free_cq(gsi->cq);
 err_free_wrs:
-       mutex_unlock(&dev->devr.mutex);
        kfree(gsi->outstanding_wrs);
 err_free_tx:
        kfree(gsi->tx_qps);
@@ -190,16 +173,13 @@ int mlx5_ib_destroy_gsi(struct mlx5_ib_qp *mqp)
        int qp_index;
        int ret;
 
-       mutex_lock(&dev->devr.mutex);
-       ret = mlx5_ib_destroy_qp(gsi->rx_qp, NULL);
+       ret = ib_destroy_qp(gsi->rx_qp);
        if (ret) {
                mlx5_ib_warn(dev, "unable to destroy hardware GSI QP. error %d\n",
                             ret);
-               mutex_unlock(&dev->devr.mutex);
                return ret;
        }
        dev->devr.ports[port_num - 1].gsi = NULL;
-       mutex_unlock(&dev->devr.mutex);
        gsi->rx_qp = NULL;
 
        for (qp_index = 0; qp_index < gsi->num_qps; ++qp_index) {
@@ -213,8 +193,6 @@ int mlx5_ib_destroy_gsi(struct mlx5_ib_qp *mqp)
 
        kfree(gsi->outstanding_wrs);
        kfree(gsi->tx_qps);
-       kfree(mqp);
-
        return 0;
 }
 
@@ -339,23 +317,13 @@ err_destroy_qp:
        WARN_ON_ONCE(qp);
 }
 
-static void setup_qps(struct mlx5_ib_gsi_qp *gsi)
-{
-       struct mlx5_ib_dev *dev = to_mdev(gsi->rx_qp->device);
-       u16 qp_index;
-
-       mutex_lock(&dev->devr.mutex);
-       for (qp_index = 0; qp_index < gsi->num_qps; ++qp_index)
-               setup_qp(gsi, qp_index);
-       mutex_unlock(&dev->devr.mutex);
-}
-
 int mlx5_ib_gsi_modify_qp(struct ib_qp *qp, struct ib_qp_attr *attr,
                          int attr_mask)
 {
        struct mlx5_ib_dev *dev = to_mdev(qp->device);
        struct mlx5_ib_qp *mqp = to_mqp(qp);
        struct mlx5_ib_gsi_qp *gsi = &mqp->gsi;
+       u16 qp_index;
        int ret;
 
        mlx5_ib_dbg(dev, "modifying GSI QP to state %d\n", attr->qp_state);
@@ -366,8 +334,11 @@ int mlx5_ib_gsi_modify_qp(struct ib_qp *qp, struct ib_qp_attr *attr,
                return ret;
        }
 
-       if (to_mqp(gsi->rx_qp)->state == IB_QPS_RTS)
-               setup_qps(gsi);
+       if (to_mqp(gsi->rx_qp)->state != IB_QPS_RTS)
+               return 0;
+
+       for (qp_index = 0; qp_index < gsi->num_qps; ++qp_index)
+               setup_qp(gsi, qp_index);
        return 0;
 }
 
@@ -511,8 +482,8 @@ int mlx5_ib_gsi_post_recv(struct ib_qp *qp, const struct ib_recv_wr *wr,
 
 void mlx5_ib_gsi_pkey_change(struct mlx5_ib_gsi_qp *gsi)
 {
-       if (!gsi)
-               return;
+       u16 qp_index;
 
-       setup_qps(gsi);
+       for (qp_index = 0; qp_index < gsi->num_qps; ++qp_index)
+               setup_qp(gsi, qp_index);
 }