vfio/ccw: replace vfio_init_device with _alloc_
authorEric Farman <farman@linux.ibm.com>
Fri, 4 Nov 2022 14:20:06 +0000 (15:20 +0100)
committerAlex Williamson <alex.williamson@redhat.com>
Thu, 10 Nov 2022 18:30:23 +0000 (11:30 -0700)
Now that we have a reasonable separation of structs that follow
the subchannel and mdev lifecycles, there's no reason we can't
call the official vfio_alloc_device routine for our private data,
and behave like everyone else.

Signed-off-by: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Link: https://lore.kernel.org/r/20221104142007.1314999-7-farman@linux.ibm.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/s390/cio/vfio_ccw_drv.c
drivers/s390/cio/vfio_ccw_ops.c
drivers/s390/cio/vfio_ccw_private.h
drivers/vfio/vfio_main.c
include/linux/vfio.h

index 9fbd1b27a1ac114dbc1ae3710c1196502c849e6a..c2a65808605afdfb9f99687a2b29e2f6aec3b402 100644 (file)
@@ -152,24 +152,6 @@ static void vfio_ccw_sch_irq(struct subchannel *sch)
        vfio_ccw_fsm_event(private, VFIO_CCW_EVENT_INTERRUPT);
 }
 
-void vfio_ccw_free_private(struct vfio_ccw_private *private)
-{
-       struct vfio_ccw_crw *crw, *temp;
-
-       list_for_each_entry_safe(crw, temp, &private->crw, next) {
-               list_del(&crw->next);
-               kfree(crw);
-       }
-
-       kmem_cache_free(vfio_ccw_crw_region, private->crw_region);
-       kmem_cache_free(vfio_ccw_schib_region, private->schib_region);
-       kmem_cache_free(vfio_ccw_cmd_region, private->cmd_region);
-       kmem_cache_free(vfio_ccw_io_region, private->io_region);
-       kfree(private->cp.guest_cp);
-       mutex_destroy(&private->io_mutex);
-       kfree(private);
-}
-
 static void vfio_ccw_free_parent(struct device *dev)
 {
        struct vfio_ccw_parent *parent = container_of(dev, struct vfio_ccw_parent, dev);
index 8a929a9cf3c66385c0c1e2113555c9e5df094ff9..1155f8bcedd9939ad30343fc27487cb467cfafca 100644 (file)
@@ -102,15 +102,10 @@ static int vfio_ccw_mdev_probe(struct mdev_device *mdev)
        struct vfio_ccw_private *private;
        int ret;
 
-       private = kzalloc(sizeof(*private), GFP_KERNEL);
-       if (!private)
-               return -ENOMEM;
-
-       ret = vfio_init_device(&private->vdev, &mdev->dev, &vfio_ccw_dev_ops);
-       if (ret) {
-               kfree(private);
-               return ret;
-       }
+       private = vfio_alloc_device(vfio_ccw_private, vdev, &mdev->dev,
+                                   &vfio_ccw_dev_ops);
+       if (IS_ERR(private))
+               return PTR_ERR(private);
 
        dev_set_drvdata(&parent->dev, private);
 
@@ -135,8 +130,21 @@ static void vfio_ccw_mdev_release_dev(struct vfio_device *vdev)
 {
        struct vfio_ccw_private *private =
                container_of(vdev, struct vfio_ccw_private, vdev);
+       struct vfio_ccw_crw *crw, *temp;
+
+       list_for_each_entry_safe(crw, temp, &private->crw, next) {
+               list_del(&crw->next);
+               kfree(crw);
+       }
+
+       kmem_cache_free(vfio_ccw_crw_region, private->crw_region);
+       kmem_cache_free(vfio_ccw_schib_region, private->schib_region);
+       kmem_cache_free(vfio_ccw_cmd_region, private->cmd_region);
+       kmem_cache_free(vfio_ccw_io_region, private->io_region);
+       kfree(private->cp.guest_cp);
+       mutex_destroy(&private->io_mutex);
 
-       vfio_ccw_free_private(private);
+       vfio_free_device(vdev);
 }
 
 static void vfio_ccw_mdev_remove(struct mdev_device *mdev)
index 2278fd38d34eaabf54605e4f36eac849a7820c11..b441ae6700fd235e6bb2044b6cda33b217c5dfe6 100644 (file)
@@ -131,8 +131,6 @@ int vfio_ccw_sch_quiesce(struct subchannel *sch);
 void vfio_ccw_sch_io_todo(struct work_struct *work);
 void vfio_ccw_crw_todo(struct work_struct *work);
 
-void vfio_ccw_free_private(struct vfio_ccw_private *private);
-
 extern struct mdev_driver vfio_ccw_mdev_driver;
 
 /*
index 2d168793d4e1ce99b223c5b4c193e49476cf493c..2901b8ad5be9258ac10f1115d9a576deb79c08a8 100644 (file)
@@ -348,6 +348,9 @@ static void vfio_device_release(struct device *dev)
        device->ops->release(device);
 }
 
+static int vfio_init_device(struct vfio_device *device, struct device *dev,
+                           const struct vfio_device_ops *ops);
+
 /*
  * Allocate and initialize vfio_device so it can be registered to vfio
  * core.
@@ -386,11 +389,9 @@ EXPORT_SYMBOL_GPL(_vfio_alloc_device);
 
 /*
  * Initialize a vfio_device so it can be registered to vfio core.
- *
- * Only vfio-ccw driver should call this interface.
  */
-int vfio_init_device(struct vfio_device *device, struct device *dev,
-                    const struct vfio_device_ops *ops)
+static int vfio_init_device(struct vfio_device *device, struct device *dev,
+                           const struct vfio_device_ops *ops)
 {
        int ret;
 
@@ -422,7 +423,6 @@ out_uninit:
        ida_free(&vfio.device_ida, device->index);
        return ret;
 }
-EXPORT_SYMBOL_GPL(vfio_init_device);
 
 /*
  * The helper called by driver @release callback to free the device
index e7cebeb875dd1abdc2a9ed969532f2be5f5b2029..ba809268a48e074d18dba91fe542f5a546826e3d 100644 (file)
@@ -176,8 +176,6 @@ struct vfio_device *_vfio_alloc_device(size_t size, struct device *dev,
                                        dev, ops),                              \
                     struct dev_struct, member)
 
-int vfio_init_device(struct vfio_device *device, struct device *dev,
-                    const struct vfio_device_ops *ops);
 void vfio_free_device(struct vfio_device *device);
 static inline void vfio_put_device(struct vfio_device *device)
 {