Skip to content

Commit dcc31ea

Browse files
yiliu1765awilliam
authored andcommitted
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 <[email protected]> Reviewed-by: Kevin Tian <[email protected]> Tested-by: Terrence Xu <[email protected]> Tested-by: Nicolin Chen <[email protected]> Tested-by: Matthew Rosato <[email protected]> Tested-by: Yanting Jiang <[email protected]> Tested-by: Shameer Kolothum <[email protected]> Tested-by: Zhenzhong Duan <[email protected]> Signed-off-by: Yi Liu <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alex Williamson <[email protected]>
1 parent 2f99073 commit dcc31ea

File tree

3 files changed

+47
-25
lines changed

3 files changed

+47
-25
lines changed

Documentation/virt/kvm/devices/vfio.rst

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,34 @@ Device types supported:
99
- KVM_DEV_TYPE_VFIO
1010

1111
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.
1717

1818
Groups:
19-
KVM_DEV_VFIO_GROUP
20-
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.
19+
KVM_DEV_VFIO_FILE
20+
alias: KVM_DEV_VFIO_GROUP
21+
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+
2840
KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE: attaches a guest visible TCE table
2941
allocated by sPAPR KVM.
3042
kvm_device_attr.addr points to a struct::
@@ -40,7 +52,10 @@ KVM_DEV_VFIO_GROUP attributes:
4052
- @tablefd is a file descriptor for a TCE table allocated via
4153
KVM_CREATE_SPAPR_TCE.
4254

43-
The GROUP_ADD operation above should be invoked prior to accessing the
55+
The FILE/GROUP_ADD operation above should be invoked prior to accessing the
4456
device file descriptor via VFIO_GROUP_GET_DEVICE_FD in order to support
4557
drivers which require a kvm pointer to be set in their .open_device()
46-
callback.
58+
callback. It is the same for device file descriptor via character device
59+
open which gets device access via VFIO_DEVICE_BIND_IOMMUFD. For such file
60+
descriptors, FILE_ADD should be invoked before VFIO_DEVICE_BIND_IOMMUFD
61+
to support the drivers mentioned in prior sentence as well.

include/uapi/linux/kvm.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1418,9 +1418,16 @@ struct kvm_device_attr {
14181418
__u64 addr; /* userspace address of attr data */
14191419
};
14201420

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
14241431
#define KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE 3
14251432

14261433
enum kvm_device_type {

virt/kvm/vfio.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -286,12 +286,12 @@ static int kvm_vfio_set_file(struct kvm_device *dev, long attr,
286286
int32_t fd;
287287

288288
switch (attr) {
289-
case KVM_DEV_VFIO_GROUP_ADD:
289+
case KVM_DEV_VFIO_FILE_ADD:
290290
if (get_user(fd, argp))
291291
return -EFAULT;
292292
return kvm_vfio_file_add(dev, fd);
293293

294-
case KVM_DEV_VFIO_GROUP_DEL:
294+
case KVM_DEV_VFIO_FILE_DEL:
295295
if (get_user(fd, argp))
296296
return -EFAULT;
297297
return kvm_vfio_file_del(dev, fd);
@@ -309,7 +309,7 @@ static int kvm_vfio_set_attr(struct kvm_device *dev,
309309
struct kvm_device_attr *attr)
310310
{
311311
switch (attr->group) {
312-
case KVM_DEV_VFIO_GROUP:
312+
case KVM_DEV_VFIO_FILE:
313313
return kvm_vfio_set_file(dev, attr->attr,
314314
u64_to_user_ptr(attr->addr));
315315
}
@@ -321,10 +321,10 @@ static int kvm_vfio_has_attr(struct kvm_device *dev,
321321
struct kvm_device_attr *attr)
322322
{
323323
switch (attr->group) {
324-
case KVM_DEV_VFIO_GROUP:
324+
case KVM_DEV_VFIO_FILE:
325325
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:
328328
#ifdef CONFIG_SPAPR_TCE_IOMMU
329329
case KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE:
330330
#endif

0 commit comments

Comments
 (0)