From: Yi Liu <yi.l....@intel.com>

mlx5 has its own @init/@release for handling migration cap.

Signed-off-by: Yi Liu <yi.l....@intel.com>
Signed-off-by: Kevin Tian <kevin.t...@intel.com>
---
 drivers/vfio/pci/mlx5/main.c | 49 ++++++++++++++++++++++++++----------
 1 file changed, 36 insertions(+), 13 deletions(-)

diff --git a/drivers/vfio/pci/mlx5/main.c b/drivers/vfio/pci/mlx5/main.c
index a9b63d15c5d3..96d1f974f0b5 100644
--- a/drivers/vfio/pci/mlx5/main.c
+++ b/drivers/vfio/pci/mlx5/main.c
@@ -579,8 +579,35 @@ static const struct vfio_migration_ops mlx5vf_pci_mig_ops 
= {
        .migration_get_state = mlx5vf_pci_get_device_state,
 };
 
+static int mlx5vf_pci_init_dev(struct vfio_device *core_vdev)
+{
+       struct mlx5vf_pci_core_device *mvdev = container_of(
+               core_vdev, struct mlx5vf_pci_core_device, core_device.vdev);
+       int ret;
+
+       ret = vfio_pci_core_init_dev(core_vdev);
+       if (ret)
+               return ret;
+
+       mlx5vf_cmd_set_migratable(mvdev, &mlx5vf_pci_mig_ops);
+
+       return 0;
+
+}
+
+static void mlx5vf_pci_release_dev(struct vfio_device *core_vdev)
+{
+       struct mlx5vf_pci_core_device *mvdev = container_of(
+               core_vdev, struct mlx5vf_pci_core_device, core_device.vdev);
+
+       mlx5vf_cmd_remove_migratable(mvdev);
+       vfio_pci_core_release_dev(core_vdev);
+}
+
 static const struct vfio_device_ops mlx5vf_pci_ops = {
        .name = "mlx5-vfio-pci",
+       .init = mlx5vf_pci_init_dev,
+       .release = mlx5vf_pci_release_dev,
        .open_device = mlx5vf_pci_open_device,
        .close_device = mlx5vf_pci_close_device,
        .ioctl = vfio_pci_core_ioctl,
@@ -598,21 +625,19 @@ static int mlx5vf_pci_probe(struct pci_dev *pdev,
        struct mlx5vf_pci_core_device *mvdev;
        int ret;
 
-       mvdev = kzalloc(sizeof(*mvdev), GFP_KERNEL);
-       if (!mvdev)
-               return -ENOMEM;
-       vfio_pci_core_init_device(&mvdev->core_device, pdev, &mlx5vf_pci_ops);
-       mlx5vf_cmd_set_migratable(mvdev, &mlx5vf_pci_mig_ops);
+       mvdev = vfio_alloc_device(mlx5vf_pci_core_device, core_device.vdev,
+                                 &pdev->dev, &mlx5vf_pci_ops);
+       if (IS_ERR(mvdev))
+               return PTR_ERR(mvdev);
+
        dev_set_drvdata(&pdev->dev, &mvdev->core_device);
        ret = vfio_pci_core_register_device(&mvdev->core_device);
        if (ret)
-               goto out_free;
+               goto out_put_vdev;
        return 0;
 
-out_free:
-       mlx5vf_cmd_remove_migratable(mvdev);
-       vfio_pci_core_uninit_device(&mvdev->core_device);
-       kfree(mvdev);
+out_put_vdev:
+       vfio_put_device(&mvdev->core_device.vdev);
        return ret;
 }
 
@@ -621,9 +646,7 @@ static void mlx5vf_pci_remove(struct pci_dev *pdev)
        struct mlx5vf_pci_core_device *mvdev = mlx5vf_drvdata(pdev);
 
        vfio_pci_core_unregister_device(&mvdev->core_device);
-       mlx5vf_cmd_remove_migratable(mvdev);
-       vfio_pci_core_uninit_device(&mvdev->core_device);
-       kfree(mvdev);
+       vfio_put_device(&mvdev->core_device.vdev);
 }
 
 static const struct pci_device_id mlx5vf_pci_table[] = {
-- 
2.21.3

Reply via email to