aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/vtd.c
diff options
context:
space:
mode:
authorWeidong Han <weidong.han@intel.com>2008-12-02 08:24:23 -0500
committerJoerg Roedel <joerg.roedel@amd.com>2009-01-03 08:02:19 -0500
commit0a920356748df4fb06e86c21c23d2ed6d31d37ad (patch)
tree545bf8591b48b8f33af3f03f50a536424853a259 /virt/kvm/vtd.c
parent260782bcfdaaa7850f29d6bb2ec6603019168c57 (diff)
KVM: support device deassignment
Support device deassignment, it can be used in device hotplug. Signed-off-by: Weidong Han <weidong.han@intel.com> Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Diffstat (limited to 'virt/kvm/vtd.c')
-rw-r--r--virt/kvm/vtd.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/virt/kvm/vtd.c b/virt/kvm/vtd.c
index 44bb58a395a5..174ea1f8cee5 100644
--- a/virt/kvm/vtd.c
+++ b/virt/kvm/vtd.c
@@ -116,6 +116,30 @@ int kvm_assign_device(struct kvm *kvm,
116 return 0; 116 return 0;
117} 117}
118 118
119int kvm_deassign_device(struct kvm *kvm,
120 struct kvm_assigned_dev_kernel *assigned_dev)
121{
122 struct dmar_domain *domain = kvm->arch.intel_iommu_domain;
123 struct pci_dev *pdev = NULL;
124
125 /* check if iommu exists and in use */
126 if (!domain)
127 return 0;
128
129 pdev = assigned_dev->dev;
130 if (pdev == NULL)
131 return -ENODEV;
132
133 intel_iommu_detach_device(domain, pdev);
134
135 printk(KERN_DEBUG "deassign device: host bdf = %x:%x:%x\n",
136 assigned_dev->host_busnr,
137 PCI_SLOT(assigned_dev->host_devfn),
138 PCI_FUNC(assigned_dev->host_devfn));
139
140 return 0;
141}
142
119int kvm_iommu_map_guest(struct kvm *kvm) 143int kvm_iommu_map_guest(struct kvm *kvm)
120{ 144{
121 int r; 145 int r;