vfio/ap,ccw: Fix open/close when multiple device FDs are open
authorJason Gunthorpe <jgg@nvidia.com>
Fri, 6 Aug 2021 01:19:08 +0000 (22:19 -0300)
committerAlex Williamson <alex.williamson@redhat.com>
Wed, 11 Aug 2021 15:50:11 +0000 (09:50 -0600)
The user can open multiple device FDs if it likes, however these open()
functions call vfio_register_notifier() on some device global
state. Calling vfio_register_notifier() twice in will trigger a WARN_ON
from notifier_chain_register() and the first close will wrongly delete the
notifier and more.

Since these really want the new open/close_device() semantics just change
the functions over.

Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/12-v4-9ea22c5e6afb+1adf-vfio_reflck_jgg@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/s390/cio/vfio_ccw_ops.c
drivers/s390/crypto/vfio_ap_ops.c

index c57d2a7..7f540ad 100644 (file)
@@ -159,7 +159,7 @@ static int vfio_ccw_mdev_remove(struct mdev_device *mdev)
        return 0;
 }
 
-static int vfio_ccw_mdev_open(struct mdev_device *mdev)
+static int vfio_ccw_mdev_open_device(struct mdev_device *mdev)
 {
        struct vfio_ccw_private *private =
                dev_get_drvdata(mdev_parent_dev(mdev));
@@ -194,7 +194,7 @@ out_unregister:
        return ret;
 }
 
-static void vfio_ccw_mdev_release(struct mdev_device *mdev)
+static void vfio_ccw_mdev_close_device(struct mdev_device *mdev)
 {
        struct vfio_ccw_private *private =
                dev_get_drvdata(mdev_parent_dev(mdev));
@@ -638,8 +638,8 @@ static const struct mdev_parent_ops vfio_ccw_mdev_ops = {
        .supported_type_groups  = mdev_type_groups,
        .create                 = vfio_ccw_mdev_create,
        .remove                 = vfio_ccw_mdev_remove,
-       .open                   = vfio_ccw_mdev_open,
-       .release                = vfio_ccw_mdev_release,
+       .open_device            = vfio_ccw_mdev_open_device,
+       .close_device           = vfio_ccw_mdev_close_device,
        .read                   = vfio_ccw_mdev_read,
        .write                  = vfio_ccw_mdev_write,
        .ioctl                  = vfio_ccw_mdev_ioctl,
index 122c85c..cee5626 100644 (file)
@@ -1315,7 +1315,7 @@ static int vfio_ap_mdev_reset_queues(struct mdev_device *mdev)
        return rc;
 }
 
-static int vfio_ap_mdev_open(struct mdev_device *mdev)
+static int vfio_ap_mdev_open_device(struct mdev_device *mdev)
 {
        struct ap_matrix_mdev *matrix_mdev = mdev_get_drvdata(mdev);
        unsigned long events;
@@ -1348,7 +1348,7 @@ static int vfio_ap_mdev_open(struct mdev_device *mdev)
        return ret;
 }
 
-static void vfio_ap_mdev_release(struct mdev_device *mdev)
+static void vfio_ap_mdev_close_device(struct mdev_device *mdev)
 {
        struct ap_matrix_mdev *matrix_mdev = mdev_get_drvdata(mdev);
 
@@ -1427,8 +1427,8 @@ static const struct mdev_parent_ops vfio_ap_matrix_ops = {
        .mdev_attr_groups       = vfio_ap_mdev_attr_groups,
        .create                 = vfio_ap_mdev_create,
        .remove                 = vfio_ap_mdev_remove,
-       .open                   = vfio_ap_mdev_open,
-       .release                = vfio_ap_mdev_release,
+       .open_device            = vfio_ap_mdev_open_device,
+       .close_device           = vfio_ap_mdev_close_device,
        .ioctl                  = vfio_ap_mdev_ioctl,
 };