Here's my swipe at a cleanup patch that can be folded in to this series, to get the mdev stuff in a more proper location for vfio-ccw. As previously described, the subchannel is a device-agnostic structure that does/should not need to know about specific nuances such as mediated devices. This is why things like struct vfio_ccw_private exist, so move these details there. Signed-off-by: Eric Farman <farman@xxxxxxxxxxxxx> --- drivers/s390/cio/cio.h | 3 --- drivers/s390/cio/vfio_ccw_drv.c | 13 +++++++------ drivers/s390/cio/vfio_ccw_private.h | 4 ++++ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/s390/cio/cio.h b/drivers/s390/cio/cio.h index 1da45307a186..2ad8833653e9 100644 --- a/drivers/s390/cio/cio.h +++ b/drivers/s390/cio/cio.h @@ -109,9 +109,6 @@ struct subchannel { * frees it. Use driver_set_override() to set or clear it. */ const char *driver_override; - struct mdev_parent parent; - struct mdev_type mdev_type; - struct mdev_type *mdev_types[1]; } __attribute__ ((aligned(8))); DECLARE_PER_CPU_ALIGNED(struct irb, cio_irb); diff --git a/drivers/s390/cio/vfio_ccw_drv.c b/drivers/s390/cio/vfio_ccw_drv.c index 6605b4239f88..bdf76805d175 100644 --- a/drivers/s390/cio/vfio_ccw_drv.c +++ b/drivers/s390/cio/vfio_ccw_drv.c @@ -142,6 +142,10 @@ static struct vfio_ccw_private *vfio_ccw_alloc_private(struct subchannel *sch) INIT_WORK(&private->io_work, vfio_ccw_sch_io_todo); INIT_WORK(&private->crw_work, vfio_ccw_crw_todo); + private->mdev_type.sysfs_name = "io"; + private->mdev_type.pretty_name = "I/O subchannel (Non-QDIO)"; + private->mdev_types[0] = &private->mdev_type; + private->cp.guest_cp = kcalloc(CCWCHAIN_LEN_MAX, sizeof(struct ccw1), GFP_KERNEL); if (!private->cp.guest_cp) @@ -219,12 +223,9 @@ static int vfio_ccw_sch_probe(struct subchannel *sch) dev_set_drvdata(&sch->dev, private); - sch->mdev_type.sysfs_name = "io"; - sch->mdev_type.pretty_name = "I/O subchannel (Non-QDIO)"; - sch->mdev_types[0] = &sch->mdev_type; - ret = mdev_register_parent(&sch->parent, &sch->dev, + ret = mdev_register_parent(&private->parent, &sch->dev, &vfio_ccw_mdev_driver, - sch->mdev_types, 1); + private->mdev_types, 1); if (ret) goto out_free; @@ -244,7 +245,7 @@ static void vfio_ccw_sch_remove(struct subchannel *sch) struct vfio_ccw_private *private = dev_get_drvdata(&sch->dev); vfio_ccw_fsm_event(private, VFIO_CCW_EVENT_CLOSE); - mdev_unregister_parent(&sch->parent); + mdev_unregister_parent(&private->parent); dev_set_drvdata(&sch->dev, NULL); diff --git a/drivers/s390/cio/vfio_ccw_private.h b/drivers/s390/cio/vfio_ccw_private.h index 4aa806530974..358996897efc 100644 --- a/drivers/s390/cio/vfio_ccw_private.h +++ b/drivers/s390/cio/vfio_ccw_private.h @@ -111,6 +111,10 @@ struct vfio_ccw_private { struct eventfd_ctx *req_trigger; struct work_struct io_work; struct work_struct crw_work; + + struct mdev_parent parent; + struct mdev_type mdev_type; + struct mdev_type *mdev_types[1]; } __aligned(8); int vfio_ccw_sch_quiesce(struct subchannel *sch); -- 2.31.1