RDMA/mlx5: Rely on existence of udata to separate kernel/user flows
authorLeon Romanovsky <leonro@mellanox.com>
Mon, 27 Apr 2020 15:46:24 +0000 (18:46 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Thu, 30 Apr 2020 21:45:43 +0000 (18:45 -0300)
Instead of keeping special field to separate kernel/user create/destroy
flows, rely on existence of udata pointer. All allocation flows are
using kzalloc() and leave uninitialized pointers as NULL which makes
MLX5_QP_EMPTY and MLX5_QP_KERNEL flows to be the same.

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

index 82ea01a..df375cb 100644 (file)
@@ -337,7 +337,6 @@ struct mlx5_ib_rwq {
        struct ib_umem          *umem;
        size_t                  buf_size;
        unsigned int            page_shift;
-       int                     create_type;
        struct mlx5_db          db;
        u32                     user_index;
        u32                     wqe_count;
@@ -346,17 +345,6 @@ struct mlx5_ib_rwq {
        u32                     create_flags; /* Use enum mlx5_ib_wq_flags */
 };
 
-enum {
-       MLX5_QP_USER,
-       MLX5_QP_KERNEL,
-       MLX5_QP_EMPTY
-};
-
-enum {
-       MLX5_WQ_USER,
-       MLX5_WQ_KERNEL
-};
-
 struct mlx5_ib_rwq_ind_table {
        struct ib_rwq_ind_table ib_rwq_ind_tbl;
        u32                     rqtn;
@@ -457,8 +445,6 @@ struct mlx5_ib_qp {
         */
        int                     bfregn;
 
-       int                     create_type;
-
        struct list_head        qps_list;
        struct list_head        cq_recv_list;
        struct list_head        cq_send_list;
index 495f039..74f09cd 100644 (file)
@@ -897,7 +897,6 @@ static int create_user_rq(struct mlx5_ib_dev *dev, struct ib_pd *pd,
                goto err_umem;
        }
 
-       rwq->create_type = MLX5_WQ_USER;
        return 0;
 
 err_umem:
@@ -1022,7 +1021,6 @@ static int create_user_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
                mlx5_ib_dbg(dev, "copy failed\n");
                goto err_unmap;
        }
-       qp->create_type = MLX5_QP_USER;
 
        return 0;
 
@@ -1187,7 +1185,6 @@ static int create_kernel_qp(struct mlx5_ib_dev *dev,
                err = -ENOMEM;
                goto err_wrid;
        }
-       qp->create_type = MLX5_QP_KERNEL;
 
        return 0;
 
@@ -1214,8 +1211,10 @@ static void destroy_qp_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp)
        kvfree(qp->sq.wrid);
        kvfree(qp->sq.wr_data);
        kvfree(qp->rq.wrid);
-       mlx5_db_free(dev->mdev, &qp->db);
-       mlx5_frag_buf_free(dev->mdev, &qp->buf);
+       if (qp->db.db)
+               mlx5_db_free(dev->mdev, &qp->db);
+       if (qp->buf.frags)
+               mlx5_frag_buf_free(dev->mdev, &qp->buf);
 }
 
 static u32 get_rx_type(struct mlx5_ib_qp *qp, struct ib_qp_init_attr *attr)
@@ -2000,8 +1999,6 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
                in = kvzalloc(inlen, GFP_KERNEL);
                if (!in)
                        return -ENOMEM;
-
-               qp->create_type = MLX5_QP_EMPTY;
        }
 
        if (is_sqp(init_attr->qp_type))
@@ -2155,9 +2152,9 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
        return 0;
 
 err_create:
-       if (qp->create_type == MLX5_QP_USER)
+       if (udata)
                destroy_qp_user(dev, pd, qp, base, udata);
-       else if (qp->create_type == MLX5_QP_KERNEL)
+       else
                destroy_qp_kernel(dev, qp);
 
 err:
@@ -2311,7 +2308,7 @@ static void destroy_qp_common(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
        if (recv_cq)
                list_del(&qp->cq_recv_list);
 
-       if (qp->create_type == MLX5_QP_KERNEL) {
+       if (!udata) {
                __mlx5_ib_cq_clean(recv_cq, base->mqp.qpn,
                                   qp->ibqp.srq ? to_msrq(qp->ibqp.srq) : NULL);
                if (send_cq != recv_cq)
@@ -2331,10 +2328,10 @@ static void destroy_qp_common(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
                                     base->mqp.qpn);
        }
 
-       if (qp->create_type == MLX5_QP_KERNEL)
-               destroy_qp_kernel(dev, qp);
-       else if (qp->create_type == MLX5_QP_USER)
+       if (udata)
                destroy_qp_user(dev, &get_pd(qp)->ibpd, qp, base, udata);
+       else
+               destroy_qp_kernel(dev, qp);
 }
 
 static int create_dct(struct ib_pd *pd, struct mlx5_ib_qp *qp,