On Thu, 2021-09-09 at 16:38 -0300, Jason Gunthorpe wrote: > This is a more complicated conversion because vfio_ccw is sharing the > vfio_device between both the mdev_device, its vfio_device and the > css_driver. > > The mdev is a singleton, and the reason for this sharing is so the > extra > css_driver function callbacks to be delivered to the vfio_device > implementation. > > This keeps things as they are, with the css_driver allocating the > singleton, not the mdev_driver. Following patches work to clean this > further. > > Embed the vfio_device in the vfio_ccw_private and instantiate it as a > vfio_device when the mdev probes. The drvdata of both the css_device > and > the mdev_device point at the private, and container_of is used to get > it > back from the vfio_device. > > Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxx> > --- > drivers/s390/cio/vfio_ccw_drv.c | 21 ++++-- > drivers/s390/cio/vfio_ccw_ops.c | 107 +++++++++++++++++--------- > -- > drivers/s390/cio/vfio_ccw_private.h | 5 ++ > 3 files changed, 85 insertions(+), 48 deletions(-) > > diff --git a/drivers/s390/cio/vfio_ccw_drv.c > b/drivers/s390/cio/vfio_ccw_drv.c > index 1e8d3151e5480e..396e815f81f8a4 100644 > --- a/drivers/s390/cio/vfio_ccw_drv.c > +++ b/drivers/s390/cio/vfio_ccw_drv.c > @@ -469,7 +469,7 @@ static int __init vfio_ccw_sch_init(void) > vfio_ccw_work_q = create_singlethread_workqueue("vfio-ccw"); > if (!vfio_ccw_work_q) { > ret = -ENOMEM; > - goto out_err; > + goto out_regions; > } > > vfio_ccw_io_region = > kmem_cache_create_usercopy("vfio_ccw_io_region", > @@ -478,7 +478,7 @@ static int __init vfio_ccw_sch_init(void) > sizeof(struct ccw_io_region), > NULL); > if (!vfio_ccw_io_region) { > ret = -ENOMEM; > - goto out_err; > + goto out_regions; > } > > vfio_ccw_cmd_region = > kmem_cache_create_usercopy("vfio_ccw_cmd_region", > @@ -487,7 +487,7 @@ static int __init vfio_ccw_sch_init(void) > sizeof(struct ccw_cmd_region), > NULL); > if (!vfio_ccw_cmd_region) { > ret = -ENOMEM; > - goto out_err; > + goto out_regions; > } > > vfio_ccw_schib_region = > kmem_cache_create_usercopy("vfio_ccw_schib_region", > @@ -497,7 +497,7 @@ static int __init vfio_ccw_sch_init(void) > > if (!vfio_ccw_schib_region) { > ret = -ENOMEM; > - goto out_err; > + goto out_regions; > } > > vfio_ccw_crw_region = > kmem_cache_create_usercopy("vfio_ccw_crw_region", > @@ -507,19 +507,25 @@ static int __init vfio_ccw_sch_init(void) > > if (!vfio_ccw_crw_region) { > ret = -ENOMEM; > - goto out_err; > + goto out_regions; > } > > + ret = mdev_register_driver(&vfio_ccw_mdev_driver); > + if (ret) > + goto out_regions; > + > isc_register(VFIO_CCW_ISC); > ret = css_driver_register(&vfio_ccw_sch_driver); > if (ret) { > isc_unregister(VFIO_CCW_ISC); > - goto out_err; > + goto out_driver; > } > > return ret; > > -out_err: > +out_driver: > + mdev_unregister_driver(&vfio_ccw_mdev_driver); > +out_regions: > vfio_ccw_destroy_regions(); > destroy_workqueue(vfio_ccw_work_q); > vfio_ccw_debug_exit(); > @@ -528,6 +534,7 @@ static int __init vfio_ccw_sch_init(void) > > static void __exit vfio_ccw_sch_exit(void) > { > + mdev_unregister_driver(&vfio_ccw_mdev_driver); Wouldn't it be better to mirror the unwind-init case, such that the above goes... > css_driver_unregister(&vfio_ccw_sch_driver); > isc_unregister(VFIO_CCW_ISC); ...here? > vfio_ccw_destroy_regions(); > diff --git a/drivers/s390/cio/vfio_ccw_ops.c ...snip... Besides that, looks fine to me.