| From 740c9c966d7c9269d2283a93b6422a4217a6fa9b Mon Sep 17 00:00:00 2001 |
| From: Alex Williamson <alex.williamson@redhat.com> |
| Date: Tue, 20 Dec 2011 21:59:03 -0700 |
| Subject: [PATCH] KVM: Remove ability to assign a device without iommu support |
| |
| commit 423873736b78f549fbfa2f715f2e4de7e6c5e1e9 upstream. |
| |
| 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> |
| Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> |
| [PG: drop Documentation chunk; no api.txt file in .34 baseline] |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/virt/kvm/assigned-dev.c b/virt/kvm/assigned-dev.c |
| index 02ff2b1..1f97473 100644 |
| --- a/virt/kvm/assigned-dev.c |
| +++ b/virt/kvm/assigned-dev.c |
| @@ -509,6 +509,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); |
| |
| @@ -564,16 +567,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); |
| @@ -610,8 +611,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); |
| |
| -- |
| 1.7.9.7 |
| |