Commit dcc31ea6 authored by Yi Liu's avatar Yi Liu Committed by Alex Williamson

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: default avatarJason Gunthorpe <jgg@nvidia.com>
Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Tested-by: default avatarTerrence Xu <terrence.xu@intel.com>
Tested-by: default avatarNicolin Chen <nicolinc@nvidia.com>
Tested-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
Tested-by: default avatarYanting Jiang <yanting.jiang@intel.com>
Tested-by: default avatarShameer Kolothum <shameerali.kolothum.thodi@huawei.com>
Tested-by: default avatarZhenzhong Duan <zhenzhong.duan@intel.com>
Signed-off-by: default avatarYi Liu <yi.l.liu@intel.com>
Link: https://lore.kernel.org/r/20230718135551.6592-6-yi.l.liu@intel.comSigned-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
parent 2f99073a
...@@ -9,22 +9,34 @@ Device types supported: ...@@ -9,22 +9,34 @@ Device types supported:
- KVM_DEV_TYPE_VFIO - KVM_DEV_TYPE_VFIO
Only one VFIO instance may be created per VM. The created device 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 tracks VFIO files (group or device) in use by the VM and features
important to the correctness and acceleration of the VM. As groups of those groups/devices important to the correctness and acceleration
are enabled and disabled for use by the VM, KVM should be updated of the VM. As groups/devices are enabled and disabled for use by the
about their presence. When registered with KVM, a reference to the VM, KVM should be updated about their presence. When registered with
VFIO-group is held by KVM. KVM, a reference to the VFIO file is held by KVM.
Groups: Groups:
KVM_DEV_VFIO_GROUP KVM_DEV_VFIO_FILE
alias: KVM_DEV_VFIO_GROUP
KVM_DEV_VFIO_GROUP attributes:
KVM_DEV_VFIO_GROUP_ADD: Add a VFIO group to VFIO-KVM device tracking KVM_DEV_VFIO_FILE attributes:
kvm_device_attr.addr points to an int32_t file descriptor KVM_DEV_VFIO_FILE_ADD: Add a VFIO file (group/device) to VFIO-KVM device
for the VFIO group. tracking
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 kvm_device_attr.addr points to an int32_t file descriptor for the
for the VFIO group. 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_SET_SPAPR_TCE: attaches a guest visible TCE table KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE: attaches a guest visible TCE table
allocated by sPAPR KVM. allocated by sPAPR KVM.
kvm_device_attr.addr points to a struct:: kvm_device_attr.addr points to a struct::
...@@ -40,7 +52,10 @@ KVM_DEV_VFIO_GROUP attributes: ...@@ -40,7 +52,10 @@ KVM_DEV_VFIO_GROUP attributes:
- @tablefd is a file descriptor for a TCE table allocated via - @tablefd is a file descriptor for a TCE table allocated via
KVM_CREATE_SPAPR_TCE. 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 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() 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 { ...@@ -1418,9 +1418,16 @@ struct kvm_device_attr {
__u64 addr; /* userspace address of attr data */ __u64 addr; /* userspace address of attr data */
}; };
#define KVM_DEV_VFIO_GROUP 1 #define KVM_DEV_VFIO_FILE 1
#define KVM_DEV_VFIO_GROUP_ADD 1
#define KVM_DEV_VFIO_GROUP_DEL 2 #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 #define KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE 3
enum kvm_device_type { enum kvm_device_type {
......
...@@ -286,12 +286,12 @@ static int kvm_vfio_set_file(struct kvm_device *dev, long attr, ...@@ -286,12 +286,12 @@ static int kvm_vfio_set_file(struct kvm_device *dev, long attr,
int32_t fd; int32_t fd;
switch (attr) { switch (attr) {
case KVM_DEV_VFIO_GROUP_ADD: case KVM_DEV_VFIO_FILE_ADD:
if (get_user(fd, argp)) if (get_user(fd, argp))
return -EFAULT; return -EFAULT;
return kvm_vfio_file_add(dev, fd); return kvm_vfio_file_add(dev, fd);
case KVM_DEV_VFIO_GROUP_DEL: case KVM_DEV_VFIO_FILE_DEL:
if (get_user(fd, argp)) if (get_user(fd, argp))
return -EFAULT; return -EFAULT;
return kvm_vfio_file_del(dev, fd); return kvm_vfio_file_del(dev, fd);
...@@ -309,7 +309,7 @@ static int kvm_vfio_set_attr(struct kvm_device *dev, ...@@ -309,7 +309,7 @@ static int kvm_vfio_set_attr(struct kvm_device *dev,
struct kvm_device_attr *attr) struct kvm_device_attr *attr)
{ {
switch (attr->group) { switch (attr->group) {
case KVM_DEV_VFIO_GROUP: case KVM_DEV_VFIO_FILE:
return kvm_vfio_set_file(dev, attr->attr, return kvm_vfio_set_file(dev, attr->attr,
u64_to_user_ptr(attr->addr)); u64_to_user_ptr(attr->addr));
} }
...@@ -321,10 +321,10 @@ static int kvm_vfio_has_attr(struct kvm_device *dev, ...@@ -321,10 +321,10 @@ static int kvm_vfio_has_attr(struct kvm_device *dev,
struct kvm_device_attr *attr) struct kvm_device_attr *attr)
{ {
switch (attr->group) { switch (attr->group) {
case KVM_DEV_VFIO_GROUP: case KVM_DEV_VFIO_FILE:
switch (attr->attr) { switch (attr->attr) {
case KVM_DEV_VFIO_GROUP_ADD: case KVM_DEV_VFIO_FILE_ADD:
case KVM_DEV_VFIO_GROUP_DEL: case KVM_DEV_VFIO_FILE_DEL:
#ifdef CONFIG_SPAPR_TCE_IOMMU #ifdef CONFIG_SPAPR_TCE_IOMMU
case KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE: case KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE:
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment