]> git.itanic.dy.fi Git - linux-stable/commitdiff
vfio/mlx5: Check whether VF is migratable
authorShay Drory <shayd@nvidia.com>
Tue, 24 Jan 2023 14:49:53 +0000 (16:49 +0200)
committerAlex Williamson <alex.williamson@redhat.com>
Mon, 30 Jan 2023 19:16:15 +0000 (12:16 -0700)
Add a check whether VF is migratable. Only if VF is migratable, mark the
VFIO device as migration capable.

Signed-off-by: Shay Drory <shayd@nvidia.com>
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Link: https://lore.kernel.org/r/20230124144955.139901-2-yishaih@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/pci/mlx5/cmd.c
drivers/vfio/pci/mlx5/cmd.h

index 0586f09c69afc7b2a8e69976d82184e09240c3ad..e956e79626b756f9bcb3192971b5aef8486adf2c 100644 (file)
@@ -7,6 +7,29 @@
 
 enum { CQ_OK = 0, CQ_EMPTY = -1, CQ_POLL_ERR = -2 };
 
+static int mlx5vf_is_migratable(struct mlx5_core_dev *mdev, u16 func_id)
+{
+       int query_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out);
+       void *query_cap = NULL, *cap;
+       int ret;
+
+       query_cap = kzalloc(query_sz, GFP_KERNEL);
+       if (!query_cap)
+               return -ENOMEM;
+
+       ret = mlx5_vport_get_other_func_cap(mdev, func_id, query_cap,
+                                           MLX5_CAP_GENERAL_2);
+       if (ret)
+               goto out;
+
+       cap = MLX5_ADDR_OF(query_hca_cap_out, query_cap, capability);
+       if (!MLX5_GET(cmd_hca_cap_2, cap, migratable))
+               ret = -EOPNOTSUPP;
+out:
+       kfree(query_cap);
+       return ret;
+}
+
 static int mlx5vf_cmd_get_vhca_id(struct mlx5_core_dev *mdev, u16 function_id,
                                  u16 *vhca_id);
 static void
@@ -195,6 +218,10 @@ void mlx5vf_cmd_set_migratable(struct mlx5vf_pci_core_device *mvdev,
        if (mvdev->vf_id < 0)
                goto end;
 
+       ret = mlx5vf_is_migratable(mvdev->mdev, mvdev->vf_id + 1);
+       if (ret)
+               goto end;
+
        if (mlx5vf_cmd_get_vhca_id(mvdev->mdev, mvdev->vf_id + 1,
                                   &mvdev->vhca_id))
                goto end;
index 5483171d57ad35c01b0010d2ce9e5d2a11169545..657d94affe2b2766ea23f8eb3ab914cef3b2f424 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/kernel.h>
 #include <linux/vfio_pci_core.h>
 #include <linux/mlx5/driver.h>
+#include <linux/mlx5/vport.h>
 #include <linux/mlx5/cq.h>
 #include <linux/mlx5/qp.h>