diff options
author | Weidong Han <weidong.han@intel.com> | 2008-12-02 08:24:23 -0500 |
---|---|---|
committer | Joerg Roedel <joerg.roedel@amd.com> | 2009-01-03 08:02:19 -0500 |
commit | 0a920356748df4fb06e86c21c23d2ed6d31d37ad (patch) | |
tree | 545bf8591b48b8f33af3f03f50a536424853a259 /virt/kvm/vtd.c | |
parent | 260782bcfdaaa7850f29d6bb2ec6603019168c57 (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.c | 24 |
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 | ||
119 | int 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 | |||
119 | int kvm_iommu_map_guest(struct kvm *kvm) | 143 | int kvm_iommu_map_guest(struct kvm *kvm) |
120 | { | 144 | { |
121 | int r; | 145 | int r; |