forked from Minki/linux
vfio/ap,ccw: Fix open/close when multiple device FDs are open
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>
This commit is contained in:
parent
3cb2482714
commit
9b0d6b7e28
@ -159,7 +159,7 @@ static int vfio_ccw_mdev_remove(struct mdev_device *mdev)
|
|||||||
return 0;
|
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 =
|
struct vfio_ccw_private *private =
|
||||||
dev_get_drvdata(mdev_parent_dev(mdev));
|
dev_get_drvdata(mdev_parent_dev(mdev));
|
||||||
@ -194,7 +194,7 @@ out_unregister:
|
|||||||
return ret;
|
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 =
|
struct vfio_ccw_private *private =
|
||||||
dev_get_drvdata(mdev_parent_dev(mdev));
|
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,
|
.supported_type_groups = mdev_type_groups,
|
||||||
.create = vfio_ccw_mdev_create,
|
.create = vfio_ccw_mdev_create,
|
||||||
.remove = vfio_ccw_mdev_remove,
|
.remove = vfio_ccw_mdev_remove,
|
||||||
.open = vfio_ccw_mdev_open,
|
.open_device = vfio_ccw_mdev_open_device,
|
||||||
.release = vfio_ccw_mdev_release,
|
.close_device = vfio_ccw_mdev_close_device,
|
||||||
.read = vfio_ccw_mdev_read,
|
.read = vfio_ccw_mdev_read,
|
||||||
.write = vfio_ccw_mdev_write,
|
.write = vfio_ccw_mdev_write,
|
||||||
.ioctl = vfio_ccw_mdev_ioctl,
|
.ioctl = vfio_ccw_mdev_ioctl,
|
||||||
|
@ -1315,7 +1315,7 @@ static int vfio_ap_mdev_reset_queues(struct mdev_device *mdev)
|
|||||||
return rc;
|
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);
|
struct ap_matrix_mdev *matrix_mdev = mdev_get_drvdata(mdev);
|
||||||
unsigned long events;
|
unsigned long events;
|
||||||
@ -1348,7 +1348,7 @@ static int vfio_ap_mdev_open(struct mdev_device *mdev)
|
|||||||
return ret;
|
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);
|
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,
|
.mdev_attr_groups = vfio_ap_mdev_attr_groups,
|
||||||
.create = vfio_ap_mdev_create,
|
.create = vfio_ap_mdev_create,
|
||||||
.remove = vfio_ap_mdev_remove,
|
.remove = vfio_ap_mdev_remove,
|
||||||
.open = vfio_ap_mdev_open,
|
.open_device = vfio_ap_mdev_open_device,
|
||||||
.release = vfio_ap_mdev_release,
|
.close_device = vfio_ap_mdev_close_device,
|
||||||
.ioctl = vfio_ap_mdev_ioctl,
|
.ioctl = vfio_ap_mdev_ioctl,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user