Hi Yi, On 1/17/23 14:49, Yi Liu wrote: > This defines KVM_DEV_VFIO_FILE* and make alias with KVM_DEV_VFIO_GROUP*. > Old userspace uses KVM_DEV_VFIO_GROUP* works as well. > > Signed-off-by: Yi Liu <yi.l.liu@xxxxxxxxx> > --- > Documentation/virt/kvm/devices/vfio.rst | 32 ++++++++++++------------- > include/uapi/linux/kvm.h | 23 +++++++++++++----- > virt/kvm/vfio.c | 18 +++++++------- > 3 files changed, 42 insertions(+), 31 deletions(-) > > diff --git a/Documentation/virt/kvm/devices/vfio.rst b/Documentation/virt/kvm/devices/vfio.rst > index 2d20dc561069..ac4300ded398 100644 > --- a/Documentation/virt/kvm/devices/vfio.rst > +++ b/Documentation/virt/kvm/devices/vfio.rst > @@ -9,23 +9,23 @@ 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. > - > -Groups: > - KVM_DEV_VFIO_GROUP > - > -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 > +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/device 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. > + > +VFIO Files: > + KVM_DEV_VFIO_FILE > + > +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 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_FILE_SET_SPAPR_TCE: attaches a guest visible TCE table > allocated by sPAPR KVM. > kvm_device_attr.addr points to a struct:: > > diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h > index 55155e262646..ad36e144a41d 100644 > --- a/include/uapi/linux/kvm.h > +++ b/include/uapi/linux/kvm.h > @@ -1396,15 +1396,26 @@ struct kvm_create_device { > > struct kvm_device_attr { > __u32 flags; /* no flags currently defined */ > - __u32 group; /* device-defined */ > - __u64 attr; /* group-defined */ > + union { > + __u32 group; > + __u32 file; > + }; /* device-defined */ > + __u64 attr; /* VFIO-file-defined or group-defined */ I think there is a confusion here between the 'VFIO group' terminology and the 'kvm device group' terminology. Commands for kvm devices are gathered in groups and within groups you have sub-commands called attributes. See Documentation/virt/kvm/devices/arm-vgic-v3.rst for instance. So to me this shall be left unchanged. > __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_GROUP_SET_SPAPR_TCE 3 > +#define KVM_DEV_VFIO_FILE 1 > + > +#define KVM_DEV_VFIO_FILE_ADD 1 > +#define KVM_DEV_VFIO_FILE_DEL 2 > +#define KVM_DEV_VFIO_FILE_SET_SPAPR_TCE 3 > + > +/* 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 KVM_DEV_VFIO_FILE_SET_SPAPR_TCE > > enum kvm_device_type { > KVM_DEV_TYPE_FSL_MPIC_20 = 1, > diff --git a/virt/kvm/vfio.c b/virt/kvm/vfio.c > index 525efe37ab6d..e73ca60af3ae 100644 > --- a/virt/kvm/vfio.c > +++ b/virt/kvm/vfio.c > @@ -286,18 +286,18 @@ 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); > > #ifdef CONFIG_SPAPR_TCE_IOMMU > - case KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE: > + case KVM_DEV_VFIO_FILE_SET_SPAPR_TCE: > return kvm_vfio_file_set_spapr_tce(dev, arg); > #endif > } > @@ -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)); > } > @@ -320,13 +320,13 @@ static int kvm_vfio_set_attr(struct kvm_device *dev, > static int kvm_vfio_has_attr(struct kvm_device *dev, > struct kvm_device_attr *attr) > { > - switch (attr->group) { > - case KVM_DEV_VFIO_GROUP: > + switch (attr->file) { > + 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: > + case KVM_DEV_VFIO_FILE_SET_SPAPR_TCE: > #endif > return 0; > } Thanks Eric