vfio/fsl-mc: Use vfio_init/register/unregister_group_dev
authorJason Gunthorpe <jgg@nvidia.com>
Tue, 30 Mar 2021 15:53:06 +0000 (09:53 -0600)
committerAlex Williamson <alex.williamson@redhat.com>
Tue, 6 Apr 2021 17:55:10 +0000 (11:55 -0600)
fsl-mc already allocates a struct vfio_fsl_mc_device with exactly the same
lifetime as vfio_device, switch to the new API and embed vfio_device in
vfio_fsl_mc_device. While here remove the devm usage for the vdev, this
code is clean and doesn't need devm.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Message-Id: <6-v3-225de1400dfc+4e074-vfio1_jgg@nvidia.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/fsl-mc/vfio_fsl_mc.c
drivers/vfio/fsl-mc/vfio_fsl_mc_private.h

index 8722f5e..ad6c6fe 100644 (file)
@@ -616,24 +616,25 @@ static int vfio_fsl_mc_probe(struct fsl_mc_device *mc_dev)
                return -EINVAL;
        }
 
-       vdev = devm_kzalloc(dev, sizeof(*vdev), GFP_KERNEL);
+       vdev = kzalloc(sizeof(*vdev), GFP_KERNEL);
        if (!vdev) {
                ret = -ENOMEM;
                goto out_group_put;
        }
 
+       vfio_init_group_dev(&vdev->vdev, dev, &vfio_fsl_mc_ops, vdev);
        vdev->mc_dev = mc_dev;
        mutex_init(&vdev->igate);
 
        ret = vfio_fsl_mc_reflck_attach(vdev);
        if (ret)
-               goto out_group_put;
+               goto out_kfree;
 
        ret = vfio_fsl_mc_init_device(vdev);
        if (ret)
                goto out_reflck;
 
-       ret = vfio_add_group_dev(dev, &vfio_fsl_mc_ops, vdev);
+       ret = vfio_register_group_dev(&vdev->vdev);
        if (ret) {
                dev_err(dev, "VFIO_FSL_MC: Failed to add to vfio group\n");
                goto out_device;
@@ -648,14 +649,17 @@ static int vfio_fsl_mc_probe(struct fsl_mc_device *mc_dev)
        ret = vfio_fsl_mc_scan_container(mc_dev);
        if (ret)
                goto out_group_dev;
+       dev_set_drvdata(dev, vdev);
        return 0;
 
 out_group_dev:
-       vfio_del_group_dev(dev);
+       vfio_unregister_group_dev(&vdev->vdev);
 out_device:
        vfio_fsl_uninit_device(vdev);
 out_reflck:
        vfio_fsl_mc_reflck_put(vdev->reflck);
+out_kfree:
+       kfree(vdev);
 out_group_put:
        vfio_iommu_group_put(group, dev);
        return ret;
@@ -663,19 +667,17 @@ out_group_put:
 
 static int vfio_fsl_mc_remove(struct fsl_mc_device *mc_dev)
 {
-       struct vfio_fsl_mc_device *vdev;
        struct device *dev = &mc_dev->dev;
+       struct vfio_fsl_mc_device *vdev = dev_get_drvdata(dev);
 
-       vdev = vfio_del_group_dev(dev);
-       if (!vdev)
-               return -EINVAL;
-
+       vfio_unregister_group_dev(&vdev->vdev);
        mutex_destroy(&vdev->igate);
 
        dprc_remove_devices(mc_dev, NULL, 0);
        vfio_fsl_uninit_device(vdev);
        vfio_fsl_mc_reflck_put(vdev->reflck);
 
+       kfree(vdev);
        vfio_iommu_group_put(mc_dev->dev.iommu_group, dev);
 
        return 0;
index a97ee69..89700e0 100644 (file)
@@ -36,6 +36,7 @@ struct vfio_fsl_mc_region {
 };
 
 struct vfio_fsl_mc_device {
+       struct vfio_device              vdev;
        struct fsl_mc_device            *mc_dev;
        struct notifier_block        nb;
        int                             refcnt;