lkml.org 
[lkml]   [2023]   [Feb]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 05/14] kvm/vfio: Accept vfio device file from userspace
    Date
    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@intel.com>
    ---
    Documentation/virt/kvm/devices/vfio.rst | 40 ++++++++++++++-----------
    include/uapi/linux/kvm.h | 16 +++++++---
    virt/kvm/vfio.c | 16 +++++-----
    3 files changed, 42 insertions(+), 30 deletions(-)

    diff --git a/Documentation/virt/kvm/devices/vfio.rst b/Documentation/virt/kvm/devices/vfio.rst
    index 2d20dc561069..7f84ec26ca4a 100644
    --- a/Documentation/virt/kvm/devices/vfio.rst
    +++ b/Documentation/virt/kvm/devices/vfio.rst
    @@ -9,23 +9,26 @@ 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.
    +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/devices 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.

    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
    - 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
    + - 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.
    + - alias: KVM_DEV_VFIO_GROUP_ADD
    + 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.
    + - alias: KVM_DEV_VFIO_GROUP_DEL
    + 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::

    @@ -36,6 +39,7 @@ KVM_DEV_VFIO_GROUP attributes:

    where:

    - - @groupfd is a file descriptor for a VFIO group;
    - - @tablefd is a file descriptor for a TCE table allocated via
    - KVM_CREATE_SPAPR_TCE.
    + *) @groupfd is a file descriptor for a VFIO group;
    + *) @tablefd is a file descriptor for a TCE table allocated via
    + KVM_CREATE_SPAPR_TCE.
    + - alias: KVM_DEV_VFIO_FILE_SET_SPAPR_TCE
    diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
    index 55155e262646..484a8133bc69 100644
    --- a/include/uapi/linux/kvm.h
    +++ b/include/uapi/linux/kvm.h
    @@ -1401,10 +1401,18 @@ struct kvm_device_attr {
    __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
    +
    +/* 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 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 857d6ba349e1..d869913baafd 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));
    }
    @@ -321,12 +321,12 @@ static int kvm_vfio_has_attr(struct kvm_device *dev,
    struct kvm_device_attr *attr)
    {
    switch (attr->group) {
    - case KVM_DEV_VFIO_GROUP:
    + 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;
    }
    --
    2.34.1
    \
     
     \ /
      Last update: 2023-03-27 00:10    [W:2.673 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site