Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Yi Liu and committed by
Alex Williamson
dcc31ea6 2f99073a

+46 -24
+30 -15
Documentation/virt/kvm/devices/vfio.rst
··· 9 9 - KVM_DEV_TYPE_VFIO 10 10 11 11 Only one VFIO instance may be created per VM. The created device 12 - tracks VFIO groups in use by the VM and features of those groups 13 - important to the correctness and acceleration of the VM. As groups 14 - are enabled and disabled for use by the VM, KVM should be updated 15 - about their presence. When registered with KVM, a reference to the 16 - VFIO-group is held by KVM. 12 + tracks VFIO files (group or device) in use by the VM and features 13 + of those groups/devices important to the correctness and acceleration 14 + of the VM. As groups/devices are enabled and disabled for use by the 15 + VM, KVM should be updated about their presence. When registered with 16 + KVM, a reference to the VFIO file is held by KVM. 17 17 18 18 Groups: 19 - KVM_DEV_VFIO_GROUP 19 + KVM_DEV_VFIO_FILE 20 + alias: KVM_DEV_VFIO_GROUP 20 21 21 - KVM_DEV_VFIO_GROUP attributes: 22 - KVM_DEV_VFIO_GROUP_ADD: Add a VFIO group to VFIO-KVM device tracking 23 - kvm_device_attr.addr points to an int32_t file descriptor 24 - for the VFIO group. 25 - KVM_DEV_VFIO_GROUP_DEL: Remove a VFIO group from VFIO-KVM device tracking 26 - kvm_device_attr.addr points to an int32_t file descriptor 27 - for the VFIO group. 22 + KVM_DEV_VFIO_FILE attributes: 23 + KVM_DEV_VFIO_FILE_ADD: Add a VFIO file (group/device) to VFIO-KVM device 24 + tracking 25 + 26 + kvm_device_attr.addr points to an int32_t file descriptor for the 27 + VFIO file. 28 + 29 + KVM_DEV_VFIO_FILE_DEL: Remove a VFIO file (group/device) from VFIO-KVM 30 + device tracking 31 + 32 + kvm_device_attr.addr points to an int32_t file descriptor for the 33 + VFIO file. 34 + 35 + KVM_DEV_VFIO_GROUP (legacy kvm device group restricted to the handling of VFIO group fd): 36 + KVM_DEV_VFIO_GROUP_ADD: same as KVM_DEV_VFIO_FILE_ADD for group fd only 37 + 38 + KVM_DEV_VFIO_GROUP_DEL: same as KVM_DEV_VFIO_FILE_DEL for group fd only 39 + 28 40 KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE: attaches a guest visible TCE table 29 41 allocated by sPAPR KVM. 30 42 kvm_device_attr.addr points to a struct:: ··· 52 40 - @tablefd is a file descriptor for a TCE table allocated via 53 41 KVM_CREATE_SPAPR_TCE. 54 42 55 - The GROUP_ADD operation above should be invoked prior to accessing the 43 + The FILE/GROUP_ADD operation above should be invoked prior to accessing the 56 44 device file descriptor via VFIO_GROUP_GET_DEVICE_FD in order to support 57 45 drivers which require a kvm pointer to be set in their .open_device() 58 - callback. 46 + callback. It is the same for device file descriptor via character device 47 + open which gets device access via VFIO_DEVICE_BIND_IOMMUFD. For such file 48 + descriptors, FILE_ADD should be invoked before VFIO_DEVICE_BIND_IOMMUFD 49 + to support the drivers mentioned in prior sentence as well.
+10 -3
include/uapi/linux/kvm.h
··· 1418 1418 __u64 addr; /* userspace address of attr data */ 1419 1419 }; 1420 1420 1421 - #define KVM_DEV_VFIO_GROUP 1 1422 - #define KVM_DEV_VFIO_GROUP_ADD 1 1423 - #define KVM_DEV_VFIO_GROUP_DEL 2 1421 + #define KVM_DEV_VFIO_FILE 1 1422 + 1423 + #define KVM_DEV_VFIO_FILE_ADD 1 1424 + #define KVM_DEV_VFIO_FILE_DEL 2 1425 + 1426 + /* KVM_DEV_VFIO_GROUP aliases are for compile time uapi compatibility */ 1427 + #define KVM_DEV_VFIO_GROUP KVM_DEV_VFIO_FILE 1428 + 1429 + #define KVM_DEV_VFIO_GROUP_ADD KVM_DEV_VFIO_FILE_ADD 1430 + #define KVM_DEV_VFIO_GROUP_DEL KVM_DEV_VFIO_FILE_DEL 1424 1431 #define KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE 3 1425 1432 1426 1433 enum kvm_device_type {
+6 -6
virt/kvm/vfio.c
··· 286 286 int32_t fd; 287 287 288 288 switch (attr) { 289 - case KVM_DEV_VFIO_GROUP_ADD: 289 + case KVM_DEV_VFIO_FILE_ADD: 290 290 if (get_user(fd, argp)) 291 291 return -EFAULT; 292 292 return kvm_vfio_file_add(dev, fd); 293 293 294 - case KVM_DEV_VFIO_GROUP_DEL: 294 + case KVM_DEV_VFIO_FILE_DEL: 295 295 if (get_user(fd, argp)) 296 296 return -EFAULT; 297 297 return kvm_vfio_file_del(dev, fd); ··· 309 309 struct kvm_device_attr *attr) 310 310 { 311 311 switch (attr->group) { 312 - case KVM_DEV_VFIO_GROUP: 312 + case KVM_DEV_VFIO_FILE: 313 313 return kvm_vfio_set_file(dev, attr->attr, 314 314 u64_to_user_ptr(attr->addr)); 315 315 } ··· 321 321 struct kvm_device_attr *attr) 322 322 { 323 323 switch (attr->group) { 324 - case KVM_DEV_VFIO_GROUP: 324 + case KVM_DEV_VFIO_FILE: 325 325 switch (attr->attr) { 326 - case KVM_DEV_VFIO_GROUP_ADD: 327 - case KVM_DEV_VFIO_GROUP_DEL: 326 + case KVM_DEV_VFIO_FILE_ADD: 327 + case KVM_DEV_VFIO_FILE_DEL: 328 328 #ifdef CONFIG_SPAPR_TCE_IOMMU 329 329 case KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE: 330 330 #endif