]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
IB/mlx5: Use uid as part of PD commands
authorYishai Hadas <yishaih@mellanox.com>
Thu, 20 Sep 2018 18:39:19 +0000 (21:39 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 25 Sep 2018 20:06:04 +0000 (14:06 -0600)
Use uid as part of PD commands so that the firmware can manage the
PD object in a secured way.

For example when a QP is created its uid must match the CQ uid which it
uses.

Next patches in this series will use the uid from the PD, then will come
a patch to set the uid on the PD so that all objects will be properly
work in one change.

Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/mlx5/cmd.c
drivers/infiniband/hw/mlx5/cmd.h
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h

index c84fef9a8a089d2ad35696abe20466ceca975e2b..67f16e900445d505bcd5aa09fac43b94f9add938 100644 (file)
@@ -197,3 +197,14 @@ int mlx5_cmd_query_ext_ppcnt_counters(struct mlx5_core_dev *dev, void *out)
        return  mlx5_core_access_reg(dev, in, sz, out, sz, MLX5_REG_PPCNT,
                                     0, 0);
 }
+
+void mlx5_cmd_dealloc_pd(struct mlx5_core_dev *dev, u32 pdn, u16 uid)
+{
+       u32 out[MLX5_ST_SZ_DW(dealloc_pd_out)] = {};
+       u32 in[MLX5_ST_SZ_DW(dealloc_pd_in)]   = {};
+
+       MLX5_SET(dealloc_pd_in, in, opcode, MLX5_CMD_OP_DEALLOC_PD);
+       MLX5_SET(dealloc_pd_in, in, pd, pdn);
+       MLX5_SET(dealloc_pd_in, in, uid, uid);
+       mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
+}
index 88cbb1c417038c00defc926c2776084b83d95f63..6df031d41a8fa5260f91b7f5c31c7064f80d5982 100644 (file)
@@ -47,4 +47,5 @@ int mlx5_cmd_modify_cong_params(struct mlx5_core_dev *mdev,
 int mlx5_cmd_alloc_memic(struct mlx5_memic *memic, phys_addr_t *addr,
                         u64 length, u32 alignment);
 int mlx5_cmd_dealloc_memic(struct mlx5_memic *memic, u64 addr, u64 length);
+void mlx5_cmd_dealloc_pd(struct mlx5_core_dev *dev, u32 pdn, u16 uid);
 #endif /* MLX5_IB_CMD_H */
index 853574345d91eb40b654ebd5eb592aa3c9525b11..821dceb614a1223320b0f04419a2c2a319649c1f 100644 (file)
@@ -2254,21 +2254,29 @@ static struct ib_pd *mlx5_ib_alloc_pd(struct ib_device *ibdev,
        struct mlx5_ib_alloc_pd_resp resp;
        struct mlx5_ib_pd *pd;
        int err;
+       u32 out[MLX5_ST_SZ_DW(alloc_pd_out)] = {};
+       u32 in[MLX5_ST_SZ_DW(alloc_pd_in)]   = {};
+       u16 uid = 0;
 
        pd = kmalloc(sizeof(*pd), GFP_KERNEL);
        if (!pd)
                return ERR_PTR(-ENOMEM);
 
-       err = mlx5_core_alloc_pd(to_mdev(ibdev)->mdev, &pd->pdn);
+       MLX5_SET(alloc_pd_in, in, opcode, MLX5_CMD_OP_ALLOC_PD);
+       MLX5_SET(alloc_pd_in, in, uid, uid);
+       err = mlx5_cmd_exec(to_mdev(ibdev)->mdev, in, sizeof(in),
+                           out, sizeof(out));
        if (err) {
                kfree(pd);
                return ERR_PTR(err);
        }
 
+       pd->pdn = MLX5_GET(alloc_pd_out, out, pd);
+       pd->uid = uid;
        if (context) {
                resp.pdn = pd->pdn;
                if (ib_copy_to_udata(udata, &resp, sizeof(resp))) {
-                       mlx5_core_dealloc_pd(to_mdev(ibdev)->mdev, pd->pdn);
+                       mlx5_cmd_dealloc_pd(to_mdev(ibdev)->mdev, pd->pdn, uid);
                        kfree(pd);
                        return ERR_PTR(-EFAULT);
                }
@@ -2282,7 +2290,7 @@ static int mlx5_ib_dealloc_pd(struct ib_pd *pd)
        struct mlx5_ib_dev *mdev = to_mdev(pd->device);
        struct mlx5_ib_pd *mpd = to_mpd(pd);
 
-       mlx5_core_dealloc_pd(mdev->mdev, mpd->pdn);
+       mlx5_cmd_dealloc_pd(mdev->mdev, mpd->pdn, mpd->uid);
        kfree(mpd);
 
        return 0;
index a28d04d4c9df8a4d36151ffda594f4ddf4cbb786..6b0f27b05c67366d34e09b7917ee457c7baa7a19 100644 (file)
@@ -143,6 +143,7 @@ static inline struct mlx5_ib_ucontext *to_mucontext(struct ib_ucontext *ibuconte
 struct mlx5_ib_pd {
        struct ib_pd            ibpd;
        u32                     pdn;
+       u16                     uid;
 };
 
 enum {