[Intel-gfx] [PATCH v9 04/25] vfio: Accept vfio device file in the KVM facing kAPI
Eric Auger
eric.auger at redhat.com
Wed Apr 5 17:58:24 UTC 2023
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 at intel.com>
> Reviewed-by: Jason Gunthorpe <jgg at nvidia.com>
> Tested-by: Terrence Xu <terrence.xu at intel.com>
> Tested-by: Nicolin Chen <nicolinc at nvidia.com>
> Tested-by: Matthew Rosato <mjrosato at linux.ibm.com>
> Tested-by: Yanting Jiang <yanting.jiang at intel.com>
> Signed-off-by: Yi Liu <yi.l.liu at intel.com>
Reviewed-by: Eric Auger <eric.auger at redhat.com>
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);
>
More information about the Intel-gfx
mailing list