kvm/vfio: Accept vfio device file from userspace
This defines KVM_DEV_VFIO_FILE* and make alias with KVM_DEV_VFIO_GROUP*. Old userspace uses KVM_DEV_VFIO_GROUP* works as well. Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Tested-by: Terrence Xu <terrence.xu@intel.com> Tested-by: Nicolin Chen <nicolinc@nvidia.com> Tested-by: Matthew Rosato <mjrosato@linux.ibm.com> Tested-by: Yanting Jiang <yanting.jiang@intel.com> Tested-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> Tested-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Signed-off-by: Yi Liu <yi.l.liu@intel.com> Link: https://lore.kernel.org/r/20230718135551.6592-6-yi.l.liu@intel.com Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
parent
2f99073a72
commit
dcc31ea60b
|
@ -9,22 +9,34 @@ Device types supported:
|
|||
- KVM_DEV_TYPE_VFIO
|
||||
|
||||
Only one VFIO instance may be created per VM. The created device
|
||||
tracks VFIO groups in use by the VM and features of those groups
|
||||
important to the correctness and acceleration of the VM. As groups
|
||||
are enabled and disabled for use by the VM, KVM should be updated
|
||||
about their presence. When registered with KVM, a reference to the
|
||||
VFIO-group is held by KVM.
|
||||
tracks VFIO files (group or device) in use by the VM and features
|
||||
of those groups/devices important to the correctness and acceleration
|
||||
of the VM. As groups/devices are enabled and disabled for use by the
|
||||
VM, KVM should be updated about their presence. When registered with
|
||||
KVM, a reference to the VFIO file is held by KVM.
|
||||
|
||||
Groups:
|
||||
KVM_DEV_VFIO_GROUP
|
||||
KVM_DEV_VFIO_FILE
|
||||
alias: KVM_DEV_VFIO_GROUP
|
||||
|
||||
KVM_DEV_VFIO_FILE attributes:
|
||||
KVM_DEV_VFIO_FILE_ADD: Add a VFIO file (group/device) to VFIO-KVM device
|
||||
tracking
|
||||
|
||||
kvm_device_attr.addr points to an int32_t file descriptor for the
|
||||
VFIO file.
|
||||
|
||||
KVM_DEV_VFIO_FILE_DEL: Remove a VFIO file (group/device) from VFIO-KVM
|
||||
device tracking
|
||||
|
||||
kvm_device_attr.addr points to an int32_t file descriptor for the
|
||||
VFIO file.
|
||||
|
||||
KVM_DEV_VFIO_GROUP (legacy kvm device group restricted to the handling of VFIO group fd):
|
||||
KVM_DEV_VFIO_GROUP_ADD: same as KVM_DEV_VFIO_FILE_ADD for group fd only
|
||||
|
||||
KVM_DEV_VFIO_GROUP_DEL: same as KVM_DEV_VFIO_FILE_DEL for group fd only
|
||||
|
||||
KVM_DEV_VFIO_GROUP attributes:
|
||||
KVM_DEV_VFIO_GROUP_ADD: Add a VFIO group to VFIO-KVM device tracking
|
||||
kvm_device_attr.addr points to an int32_t file descriptor
|
||||
for the VFIO group.
|
||||
KVM_DEV_VFIO_GROUP_DEL: Remove a VFIO group from VFIO-KVM device tracking
|
||||
kvm_device_attr.addr points to an int32_t file descriptor
|
||||
for the VFIO group.
|
||||
KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE: attaches a guest visible TCE table
|
||||
allocated by sPAPR KVM.
|
||||
kvm_device_attr.addr points to a struct::
|
||||
|
@ -40,7 +52,10 @@ KVM_DEV_VFIO_GROUP attributes:
|
|||
- @tablefd is a file descriptor for a TCE table allocated via
|
||||
KVM_CREATE_SPAPR_TCE.
|
||||
|
||||
The GROUP_ADD operation above should be invoked prior to accessing the
|
||||
The FILE/GROUP_ADD operation above should be invoked prior to accessing the
|
||||
device file descriptor via VFIO_GROUP_GET_DEVICE_FD in order to support
|
||||
drivers which require a kvm pointer to be set in their .open_device()
|
||||
callback.
|
||||
callback. It is the same for device file descriptor via character device
|
||||
open which gets device access via VFIO_DEVICE_BIND_IOMMUFD. For such file
|
||||
descriptors, FILE_ADD should be invoked before VFIO_DEVICE_BIND_IOMMUFD
|
||||
to support the drivers mentioned in prior sentence as well.
|
||||
|
|
|
@ -1418,9 +1418,16 @@ struct kvm_device_attr {
|
|||
__u64 addr; /* userspace address of attr data */
|
||||
};
|
||||
|
||||
#define KVM_DEV_VFIO_GROUP 1
|
||||
#define KVM_DEV_VFIO_GROUP_ADD 1
|
||||
#define KVM_DEV_VFIO_GROUP_DEL 2
|
||||
#define KVM_DEV_VFIO_FILE 1
|
||||
|
||||
#define KVM_DEV_VFIO_FILE_ADD 1
|
||||
#define KVM_DEV_VFIO_FILE_DEL 2
|
||||
|
||||
/* KVM_DEV_VFIO_GROUP aliases are for compile time uapi compatibility */
|
||||
#define KVM_DEV_VFIO_GROUP KVM_DEV_VFIO_FILE
|
||||
|
||||
#define KVM_DEV_VFIO_GROUP_ADD KVM_DEV_VFIO_FILE_ADD
|
||||
#define KVM_DEV_VFIO_GROUP_DEL KVM_DEV_VFIO_FILE_DEL
|
||||
#define KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE 3
|
||||
|
||||
enum kvm_device_type {
|
||||
|
|
|
@ -286,12 +286,12 @@ static int kvm_vfio_set_file(struct kvm_device *dev, long attr,
|
|||
int32_t fd;
|
||||
|
||||
switch (attr) {
|
||||
case KVM_DEV_VFIO_GROUP_ADD:
|
||||
case KVM_DEV_VFIO_FILE_ADD:
|
||||
if (get_user(fd, argp))
|
||||
return -EFAULT;
|
||||
return kvm_vfio_file_add(dev, fd);
|
||||
|
||||
case KVM_DEV_VFIO_GROUP_DEL:
|
||||
case KVM_DEV_VFIO_FILE_DEL:
|
||||
if (get_user(fd, argp))
|
||||
return -EFAULT;
|
||||
return kvm_vfio_file_del(dev, fd);
|
||||
|
@ -309,7 +309,7 @@ static int kvm_vfio_set_attr(struct kvm_device *dev,
|
|||
struct kvm_device_attr *attr)
|
||||
{
|
||||
switch (attr->group) {
|
||||
case KVM_DEV_VFIO_GROUP:
|
||||
case KVM_DEV_VFIO_FILE:
|
||||
return kvm_vfio_set_file(dev, attr->attr,
|
||||
u64_to_user_ptr(attr->addr));
|
||||
}
|
||||
|
@ -321,10 +321,10 @@ static int kvm_vfio_has_attr(struct kvm_device *dev,
|
|||
struct kvm_device_attr *attr)
|
||||
{
|
||||
switch (attr->group) {
|
||||
case KVM_DEV_VFIO_GROUP:
|
||||
case KVM_DEV_VFIO_FILE:
|
||||
switch (attr->attr) {
|
||||
case KVM_DEV_VFIO_GROUP_ADD:
|
||||
case KVM_DEV_VFIO_GROUP_DEL:
|
||||
case KVM_DEV_VFIO_FILE_ADD:
|
||||
case KVM_DEV_VFIO_FILE_DEL:
|
||||
#ifdef CONFIG_SPAPR_TCE_IOMMU
|
||||
case KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE:
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue