> From: Matthew Rosato > Sent: Thursday, May 19, 2022 5:26 AM > > Rather than relying on a notifier for associating the KVM with > the group, let's assume that the association has already been > made prior to device_open. The first time a device is opened > associate the group KVM with the device. > > This fixes a user-triggerable oops in GVT. No changelog. > > Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxx> > Signed-off-by: Matthew Rosato <mjrosato@xxxxxxxxxxxxx> Not sure whether Christoph wants a s-o-b here when he wrote the snippet to remove the release work of gvt... > @@ -1083,11 +1083,22 @@ static struct file *vfio_device_open(struct > vfio_device *device) > > mutex_lock(&device->dev_set->lock); > device->open_count++; > + down_read(&device->group->group_rwsem); > + if (device->open_count == 1 && device->group->kvm) { > + /* > + * Here we pass the KVM pointer with the group under the > read > + * lock. If the device driver will use it, it must obtain a > + * reference and release it during close_device. > + */ > + device->kvm = device->group->kvm; > + } > + > if (device->open_count == 1 && device->ops->open_device) { Merge the two branches so both are under if (device->open_count == 1) {} (and group_rwsem can be also moved inside) > @@ -1315,9 +1330,13 @@ static int vfio_device_fops_release(struct inode > *inode, struct file *filep) > > mutex_lock(&device->dev_set->lock); > vfio_assert_device_open(device); > + down_read(&device->group->group_rwsem); > if (device->open_count == 1 && device->ops->close_device) > device->ops->close_device(device); > device->open_count--; > + if (device->open_count == 0 && device->kvm) > + device->kvm = NULL; This can be moved out of group_rwsem as there is no reference to vfio_group. > + up_read(&device->group->group_rwsem); otherwise, Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx> Thanks Kevin