diff options
author | Weidong Han <weidong.han@intel.com> | 2008-12-08 10:29:53 -0500 |
---|---|---|
committer | Joerg Roedel <joerg.roedel@amd.com> | 2009-01-03 08:10:08 -0500 |
commit | b653574a7d14b663cc812cb20be6a114939ba186 (patch) | |
tree | 1fa1c833bacea5411e1c640180a00848552d7282 | |
parent | 0a920356748df4fb06e86c21c23d2ed6d31d37ad (diff) |
Deassign device in kvm_free_assgined_device
In kvm_iommu_unmap_memslots(), assigned_dev_head is already empty.
Signed-off-by: Weidong Han <weidong.han@intel.com>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
-rw-r--r-- | include/linux/kvm_host.h | 1 | ||||
-rw-r--r-- | virt/kvm/kvm_main.c | 1 | ||||
-rw-r--r-- | virt/kvm/vtd.c | 10 |
3 files changed, 2 insertions, 10 deletions
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index ce5d1c17ce26..e62a4629e51c 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
@@ -316,6 +316,7 @@ struct kvm_assigned_dev_kernel { | |||
316 | #define KVM_ASSIGNED_DEV_HOST_MSI (1 << 9) | 316 | #define KVM_ASSIGNED_DEV_HOST_MSI (1 << 9) |
317 | unsigned long irq_requested_type; | 317 | unsigned long irq_requested_type; |
318 | int irq_source_id; | 318 | int irq_source_id; |
319 | int flags; | ||
319 | struct pci_dev *dev; | 320 | struct pci_dev *dev; |
320 | struct kvm *kvm; | 321 | struct kvm *kvm; |
321 | }; | 322 | }; |
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 3238e08e4651..4ef0fb43d1f9 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -496,6 +496,7 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm, | |||
496 | match->assigned_dev_id = assigned_dev->assigned_dev_id; | 496 | match->assigned_dev_id = assigned_dev->assigned_dev_id; |
497 | match->host_busnr = assigned_dev->busnr; | 497 | match->host_busnr = assigned_dev->busnr; |
498 | match->host_devfn = assigned_dev->devfn; | 498 | match->host_devfn = assigned_dev->devfn; |
499 | match->flags = assigned_dev->flags; | ||
499 | match->dev = dev; | 500 | match->dev = dev; |
500 | match->irq_source_id = -1; | 501 | match->irq_source_id = -1; |
501 | match->kvm = kvm; | 502 | match->kvm = kvm; |
diff --git a/virt/kvm/vtd.c b/virt/kvm/vtd.c index 174ea1f8cee5..d46de9af838b 100644 --- a/virt/kvm/vtd.c +++ b/virt/kvm/vtd.c | |||
@@ -205,22 +205,12 @@ static int kvm_iommu_unmap_memslots(struct kvm *kvm) | |||
205 | 205 | ||
206 | int kvm_iommu_unmap_guest(struct kvm *kvm) | 206 | int kvm_iommu_unmap_guest(struct kvm *kvm) |
207 | { | 207 | { |
208 | struct kvm_assigned_dev_kernel *entry; | ||
209 | struct dmar_domain *domain = kvm->arch.intel_iommu_domain; | 208 | struct dmar_domain *domain = kvm->arch.intel_iommu_domain; |
210 | 209 | ||
211 | /* check if iommu exists and in use */ | 210 | /* check if iommu exists and in use */ |
212 | if (!domain) | 211 | if (!domain) |
213 | return 0; | 212 | return 0; |
214 | 213 | ||
215 | list_for_each_entry(entry, &kvm->arch.assigned_dev_head, list) { | ||
216 | printk(KERN_DEBUG "VT-d unmap: host bdf = %x:%x:%x\n", | ||
217 | entry->host_busnr, | ||
218 | PCI_SLOT(entry->host_devfn), | ||
219 | PCI_FUNC(entry->host_devfn)); | ||
220 | |||
221 | /* detach kvm dmar domain */ | ||
222 | intel_iommu_detach_device(domain, entry->dev); | ||
223 | } | ||
224 | kvm_iommu_unmap_memslots(kvm); | 214 | kvm_iommu_unmap_memslots(kvm); |
225 | intel_iommu_free_domain(domain); | 215 | intel_iommu_free_domain(domain); |
226 | return 0; | 216 | return 0; |