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>pull/806/head
parent
2f99073a72
commit
dcc31ea60b
|
|
@ -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_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
|
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:
|
||||||
- @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 {
|
||||||
__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,
|
||||||
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,
|
||||||
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,
|
||||||
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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue