> From: Jason Gunthorpe <jgg@xxxxxxxxxx> > Sent: Tuesday, February 14, 2023 7:44 AM > > On Mon, Feb 13, 2023 at 07:13:36AM -0800, Yi Liu wrote: > > +static struct vfio_device *vfio_device_from_file(struct file *file) > > +{ > > + struct vfio_device_file *df = file->private_data; > > + > > + if (file->f_op != &vfio_device_fops) > > + return NULL; > > + return df->device; > > +} > > + > > /** > > * vfio_file_is_valid - True if the file is usable with VFIO APIS > > * @file: VFIO group file or VFIO device file > > */ > > bool vfio_file_is_valid(struct file *file) > > { > > - return vfio_group_from_file(file); > > + return vfio_group_from_file(file) || > > + vfio_device_from_file(file); > > } > > EXPORT_SYMBOL_GPL(vfio_file_is_valid); > > This can only succeed on a device cdev that has been fully opened. Actually, we cannot. This is used in the kvm-vfio code to see if the user-provided fd is vfio fds in the SET_KVM path. And we don't have the device cdev fully opened until BIND_IOMMUFD. But we do need to invoke SET_KVM before issuing BIND_IOMMUFD as the device open needs kvm pointer. So if we cannot apply fully opened limit to this interface. Maybe an updated function comment is needed. " vfio_file_is_valid - True if the file is vfio files (group or device)" Regards, Yi Liu