lkml.org 
[lkml]   [2011]   [Dec]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 1/2] kvm: Remove ability to assign a device without iommu support
    Date
    This option has no users and it exposes a security hole that we
    can allow devices to be assigned without iommu protection. Make
    KVM_DEV_ASSIGN_ENABLE_IOMMU a mandatory option.

    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    ---

    Documentation/virtual/kvm/api.txt | 3 +++
    virt/kvm/assigned-dev.c | 18 +++++++++---------
    2 files changed, 12 insertions(+), 9 deletions(-)

    diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
    index 7945b0b..ee2c96b 100644
    --- a/Documentation/virtual/kvm/api.txt
    +++ b/Documentation/virtual/kvm/api.txt
    @@ -1151,6 +1151,9 @@ following flags are specified:
    /* Depends on KVM_CAP_IOMMU */
    #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0)

    +The KVM_DEV_ASSIGN_ENABLE_IOMMU flag is a mandatory option to ensure
    +isolation of the device. Usages not specifying this flag are deprecated.
    +
    4.49 KVM_DEASSIGN_PCI_DEVICE

    Capability: KVM_CAP_DEVICE_DEASSIGNMENT
    diff --git a/virt/kvm/assigned-dev.c b/virt/kvm/assigned-dev.c
    index 3ad0925..a251a28 100644
    --- a/virt/kvm/assigned-dev.c
    +++ b/virt/kvm/assigned-dev.c
    @@ -487,6 +487,9 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm,
    struct kvm_assigned_dev_kernel *match;
    struct pci_dev *dev;

    + if (!(assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU))
    + return -EINVAL;
    +
    mutex_lock(&kvm->lock);
    idx = srcu_read_lock(&kvm->srcu);

    @@ -544,16 +547,14 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm,

    list_add(&match->list, &kvm->arch.assigned_dev_head);

    - if (assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU) {
    - if (!kvm->arch.iommu_domain) {
    - r = kvm_iommu_map_guest(kvm);
    - if (r)
    - goto out_list_del;
    - }
    - r = kvm_assign_device(kvm, match);
    + if (!kvm->arch.iommu_domain) {
    + r = kvm_iommu_map_guest(kvm);
    if (r)
    goto out_list_del;
    }
    + r = kvm_assign_device(kvm, match);
    + if (r)
    + goto out_list_del;

    out:
    srcu_read_unlock(&kvm->srcu, idx);
    @@ -593,8 +594,7 @@ static int kvm_vm_ioctl_deassign_device(struct kvm *kvm,
    goto out;
    }

    - if (match->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU)
    - kvm_deassign_device(kvm, match);
    + kvm_deassign_device(kvm, match);

    kvm_free_assigned_device(kvm, match);



    \
     
     \ /
      Last update: 2011-12-21 06:01    [W:2.758 / U:0.152 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site