Hi Yi, On 4/1/23 17:18, Yi Liu wrote: > This makes the vfio file kAPIs to accept vfio device files, also a > preparation for vfio device cdev support. > > For the kvm set with vfio device file, kvm pointer is stored in struct > vfio_device_file, and use kvm_ref_lock to protect kvm set and kvm > pointer usage within VFIO. This kvm pointer will be set to vfio_device > after device file is bound to iommufd in the cdev path. > > Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx> > Reviewed-by: Jason Gunthorpe <jgg@xxxxxxxxxx> > Tested-by: Terrence Xu <terrence.xu@xxxxxxxxx> > Tested-by: Nicolin Chen <nicolinc@xxxxxxxxxx> > Tested-by: Matthew Rosato <mjrosato@xxxxxxxxxxxxx> > Tested-by: Yanting Jiang <yanting.jiang@xxxxxxxxx> > Signed-off-by: Yi Liu <yi.l.liu@xxxxxxxxx> Reviewed-by: Eric Auger <eric.auger@xxxxxxxxxx> Thanks Eric > --- > drivers/vfio/vfio.h | 2 ++ > drivers/vfio/vfio_main.c | 18 ++++++++++++++++++ > 2 files changed, 20 insertions(+) > > diff --git a/drivers/vfio/vfio.h b/drivers/vfio/vfio.h > index 56ad127ac618..e4672d91a6f7 100644 > --- a/drivers/vfio/vfio.h > +++ b/drivers/vfio/vfio.h > @@ -18,6 +18,8 @@ struct vfio_container; > > struct vfio_device_file { > struct vfio_device *device; > + spinlock_t kvm_ref_lock; /* protect kvm field */ > + struct kvm *kvm; > }; > > void vfio_device_put_registration(struct vfio_device *device); > diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c > index 748bde4d74d9..cb543791b28b 100644 > --- a/drivers/vfio/vfio_main.c > +++ b/drivers/vfio/vfio_main.c > @@ -414,6 +414,7 @@ vfio_allocate_device_file(struct vfio_device *device) > return ERR_PTR(-ENOMEM); > > df->device = device; > + spin_lock_init(&df->kvm_ref_lock); > > return df; > } > @@ -1246,6 +1247,20 @@ bool vfio_file_enforced_coherent(struct file *file) > } > EXPORT_SYMBOL_GPL(vfio_file_enforced_coherent); > > +static void vfio_device_file_set_kvm(struct file *file, struct kvm *kvm) > +{ > + struct vfio_device_file *df = file->private_data; > + > + /* > + * The kvm is first recorded in the vfio_device_file, and will > + * be propagated to vfio_device::kvm when the file is bound to > + * iommufd successfully in the vfio device cdev path. > + */ > + spin_lock(&df->kvm_ref_lock); > + df->kvm = kvm; > + spin_unlock(&df->kvm_ref_lock); > +} > + > /** > * vfio_file_set_kvm - Link a kvm with VFIO drivers > * @file: VFIO group file or VFIO device file > @@ -1259,6 +1274,9 @@ void vfio_file_set_kvm(struct file *file, struct kvm *kvm) > group = vfio_group_from_file(file); > if (group) > vfio_group_set_kvm(group, kvm); > + > + if (vfio_device_from_file(file)) > + vfio_device_file_set_kvm(file, kvm); > } > EXPORT_SYMBOL_GPL(vfio_file_set_kvm); >