IB/mlx5: Extend CQ creation to get uar page index from user space
authorYishai Hadas <yishaih@mellanox.com>
Tue, 24 Mar 2020 06:01:40 +0000 (08:01 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Fri, 27 Mar 2020 15:59:04 +0000 (12:59 -0300)
Extend CQ creation to get uar page index from user space, this mode can be
used with the UAR dynamic mode APIs to allocate/destroy a UAR object.

Link: https://lore.kernel.org/r/20200324060143.1569116-3-leon@kernel.org
Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
Reviewed-by: Michael Guralnik <michaelgur@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/mlx5/cq.c
include/uapi/rdma/mlx5-abi.h

index 367a71b..1d184bd 100644 (file)
@@ -692,17 +692,19 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
        struct mlx5_ib_ucontext *context = rdma_udata_to_drv_context(
                udata, struct mlx5_ib_ucontext, ibucontext);
 
-       ucmdlen = udata->inlen < sizeof(ucmd) ?
-                 (sizeof(ucmd) - sizeof(ucmd.flags)) : sizeof(ucmd);
+       ucmdlen = min(udata->inlen, sizeof(ucmd));
+       if (ucmdlen < offsetof(struct mlx5_ib_create_cq, flags))
+               return -EINVAL;
 
        if (ib_copy_from_udata(&ucmd, udata, ucmdlen))
                return -EFAULT;
 
-       if (ucmdlen == sizeof(ucmd) &&
-           (ucmd.flags & ~(MLX5_IB_CREATE_CQ_FLAGS_CQE_128B_PAD)))
+       if ((ucmd.flags & ~(MLX5_IB_CREATE_CQ_FLAGS_CQE_128B_PAD |
+                           MLX5_IB_CREATE_CQ_FLAGS_UAR_PAGE_INDEX)))
                return -EINVAL;
 
-       if (ucmd.cqe_size != 64 && ucmd.cqe_size != 128)
+       if ((ucmd.cqe_size != 64 && ucmd.cqe_size != 128) ||
+           ucmd.reserved0 || ucmd.reserved1)
                return -EINVAL;
 
        *cqe_size = ucmd.cqe_size;
@@ -739,7 +741,10 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
        MLX5_SET(cqc, cqc, log_page_size,
                 page_shift - MLX5_ADAPTER_PAGE_SHIFT);
 
-       *index = context->bfregi.sys_pages[0];
+       if (ucmd.flags & MLX5_IB_CREATE_CQ_FLAGS_UAR_PAGE_INDEX)
+               *index = ucmd.uar_page_index;
+       else
+               *index = context->bfregi.sys_pages[0];
 
        if (ucmd.cqe_comp_en == 1) {
                int mini_cqe_format;
index 624f5b5..e900f9a 100644 (file)
@@ -266,6 +266,7 @@ struct mlx5_ib_query_device_resp {
 
 enum mlx5_ib_create_cq_flags {
        MLX5_IB_CREATE_CQ_FLAGS_CQE_128B_PAD    = 1 << 0,
+       MLX5_IB_CREATE_CQ_FLAGS_UAR_PAGE_INDEX  = 1 << 1,
 };
 
 struct mlx5_ib_create_cq {
@@ -275,6 +276,9 @@ struct mlx5_ib_create_cq {
        __u8    cqe_comp_en;
        __u8    cqe_comp_res_format;
        __u16   flags;
+       __u16   uar_page_index;
+       __u16   reserved0;
+       __u32   reserved1;
 };
 
 struct mlx5_ib_create_cq_resp {