Commit 0ca78666 authored by Jason Gunthorpe's avatar Jason Gunthorpe Committed by Alex Williamson
Browse files

vfio/fsl-mc: Use vfio_init/register/unregister_group_dev



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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarCornelia Huck <cohuck@redhat.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Message-Id: <6-v3-225de1400dfc+4e074-vfio1_jgg@nvidia.com>
Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
parent 2b1fe162
Loading
Loading
Loading
Loading
+11 −9
Original line number Diff line number Diff line
@@ -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 @@ static int vfio_fsl_mc_probe(struct fsl_mc_device *mc_dev)

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;
+1 −0
Original line number Diff line number Diff line
@@ -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;