RDMA/mlx5: Embed GSI QP into general mlx5_ib QP
authorLeon Romanovsky <leonro@nvidia.com>
Sat, 26 Sep 2020 10:24:41 +0000 (13:24 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Tue, 29 Sep 2020 16:09:48 +0000 (13:09 -0300)
The GSI QPs have different create flow from the regular QPs, but it is not
really needed. Update the code to use mlx5_ib_qp as a storage class for
all outside of GSI calls.

Link: https://lore.kernel.org/r/20200926102450.2966017-2-leon@kernel.org
Reviewed-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/hw/mlx5/gsi.c
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/infiniband/hw/mlx5/qp.c

index d9f300f..0b18558 100644 (file)
@@ -39,26 +39,6 @@ struct mlx5_ib_gsi_wr {
        bool completed:1;
 };
 
-struct mlx5_ib_gsi_qp {
-       struct ib_qp ibqp;
-       struct ib_qp *rx_qp;
-       u8 port_num;
-       struct ib_qp_cap cap;
-       enum ib_sig_type sq_sig_type;
-       /* Serialize qp state modifications */
-       struct mutex mutex;
-       struct ib_cq *cq;
-       struct mlx5_ib_gsi_wr *outstanding_wrs;
-       u32 outstanding_pi, outstanding_ci;
-       int num_qps;
-       /* Protects access to the tx_qps. Post send operations synchronize
-        * with tx_qp creation in setup_qp(). Also protects the
-        * outstanding_wrs array and indices.
-        */
-       spinlock_t lock;
-       struct ib_qp **tx_qps;
-};
-
 static struct mlx5_ib_gsi_qp *gsi_qp(struct ib_qp *qp)
 {
        return container_of(qp, struct mlx5_ib_gsi_qp, ibqp);
@@ -116,6 +96,7 @@ struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
                                    struct ib_qp_init_attr *init_attr)
 {
        struct mlx5_ib_dev *dev = to_mdev(pd->device);
+       struct mlx5_ib_qp *mqp;
        struct mlx5_ib_gsi_qp *gsi;
        struct ib_qp_init_attr hw_init_attr = *init_attr;
        const u8 port_num = init_attr->port_num;
@@ -130,10 +111,11 @@ struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
                        num_qps = MLX5_MAX_PORTS;
        }
 
-       gsi = kzalloc(sizeof(*gsi), GFP_KERNEL);
-       if (!gsi)
+       mqp = kzalloc(sizeof(struct mlx5_ib_qp), GFP_KERNEL);
+       if (!mqp)
                return ERR_PTR(-ENOMEM);
 
+       gsi = &mqp->gsi;
        gsi->tx_qps = kcalloc(num_qps, sizeof(*gsi->tx_qps), GFP_KERNEL);
        if (!gsi->tx_qps) {
                ret = -ENOMEM;
@@ -216,20 +198,18 @@ err_free_wrs:
 err_free_tx:
        kfree(gsi->tx_qps);
 err_free:
-       kfree(gsi);
+       kfree(mqp);
        return ERR_PTR(ret);
 }
 
-int mlx5_ib_gsi_destroy_qp(struct ib_qp *qp)
+int mlx5_ib_destroy_gsi(struct mlx5_ib_qp *mqp)
 {
-       struct mlx5_ib_dev *dev = to_mdev(qp->device);
-       struct mlx5_ib_gsi_qp *gsi = gsi_qp(qp);
+       struct mlx5_ib_dev *dev = to_mdev(mqp->ibqp.device);
+       struct mlx5_ib_gsi_qp *gsi = &mqp->gsi;
        const int port_num = gsi->port_num;
        int qp_index;
        int ret;
 
-       mlx5_ib_dbg(dev, "destroying GSI QP\n");
-
        mutex_lock(&dev->devr.mutex);
        ret = mlx5_ib_destroy_qp(gsi->rx_qp, NULL);
        if (ret) {
@@ -253,7 +233,7 @@ int mlx5_ib_gsi_destroy_qp(struct ib_qp *qp)
 
        kfree(gsi->outstanding_wrs);
        kfree(gsi->tx_qps);
-       kfree(gsi);
+       kfree(mqp);
 
        return 0;
 }
index 3856ee3..384590d 100644 (file)
@@ -384,6 +384,26 @@ struct mlx5_ib_dct {
        u32                     *in;
 };
 
+struct mlx5_ib_gsi_qp {
+       struct ib_qp ibqp;
+       struct ib_qp *rx_qp;
+       u8 port_num;
+       struct ib_qp_cap cap;
+       enum ib_sig_type sq_sig_type;
+       /* Serialize qp state modifications */
+       struct mutex mutex;
+       struct ib_cq *cq;
+       struct mlx5_ib_gsi_wr *outstanding_wrs;
+       u32 outstanding_pi, outstanding_ci;
+       int num_qps;
+       /* Protects access to the tx_qps. Post send operations synchronize
+        * with tx_qp creation in setup_qp(). Also protects the
+        * outstanding_wrs array and indices.
+        */
+       spinlock_t lock;
+       struct ib_qp **tx_qps;
+};
+
 struct mlx5_ib_qp {
        struct ib_qp            ibqp;
        union {
@@ -391,6 +411,7 @@ struct mlx5_ib_qp {
                struct mlx5_ib_raw_packet_qp raw_packet_qp;
                struct mlx5_ib_rss_qp rss_qp;
                struct mlx5_ib_dct dct;
+               struct mlx5_ib_gsi_qp gsi;
        };
        struct mlx5_frag_buf    buf;
 
@@ -693,8 +714,6 @@ struct mlx5_mr_cache {
        unsigned long           last_add;
 };
 
-struct mlx5_ib_gsi_qp;
-
 struct mlx5_ib_port_resources {
        struct mlx5_ib_resources *devr;
        struct mlx5_ib_gsi_qp *gsi;
@@ -1322,7 +1341,7 @@ void mlx5_ib_init_cong_debugfs(struct mlx5_ib_dev *dev, u8 port_num);
 /* GSI QP helper functions */
 struct ib_qp *mlx5_ib_gsi_create_qp(struct ib_pd *pd,
                                    struct ib_qp_init_attr *init_attr);
-int mlx5_ib_gsi_destroy_qp(struct ib_qp *qp);
+int mlx5_ib_destroy_gsi(struct mlx5_ib_qp *mqp);
 int mlx5_ib_gsi_modify_qp(struct ib_qp *qp, struct ib_qp_attr *attr,
                          int attr_mask);
 int mlx5_ib_gsi_query_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
index 8c13d76..0459ea2 100644 (file)
@@ -3037,7 +3037,7 @@ int mlx5_ib_destroy_qp(struct ib_qp *qp, struct ib_udata *udata)
        struct mlx5_ib_qp *mqp = to_mqp(qp);
 
        if (unlikely(qp->qp_type == IB_QPT_GSI))
-               return mlx5_ib_gsi_destroy_qp(qp);
+               return mlx5_ib_destroy_gsi(mqp);
 
        if (mqp->type == MLX5_IB_QPT_DCT)
                return mlx5_ib_destroy_dct(mqp);