diff options
author | Greg Rose <gregory.v.rose@intel.com> | 2011-07-22 01:46:07 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2011-09-23 12:05:44 -0400 |
commit | 6777829cfe1c4ed78319ad40aaee60254222da76 (patch) | |
tree | 03e55538247c4b2fbdc837984922a0ac8753b253 | |
parent | 9c9b1f24f2aa31a3cea94939edc551f68ebadc89 (diff) |
pci: Add flag indicating device has been assigned by KVM
Device drivers that create and destroy SR-IOV virtual functions via
calls to pci_enable_sriov() and pci_disable_sriov can cause catastrophic
failures if they attempt to destroy VFs while they are assigned to
guest virtual machines. By adding a flag for use by the KVM module
to indicate that a device is assigned a device driver can check that
flag and avoid destroying VFs while they are assigned and avoid system
failures.
CC: Ian Campbell <ijc@hellion.org.uk>
CC: Konrad Wilk <konrad.wilk@oracle.com>
Signed-off-by: Greg Rose <gregory.v.rose@intel.com>
Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r-- | include/linux/pci.h | 2 | ||||
-rw-r--r-- | virt/kvm/assigned-dev.c | 2 | ||||
-rw-r--r-- | virt/kvm/iommu.c | 4 |
3 files changed, 8 insertions, 0 deletions
diff --git a/include/linux/pci.h b/include/linux/pci.h index f27893b3b724..d8c8573ecc21 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -174,6 +174,8 @@ enum pci_dev_flags { | |||
174 | PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = (__force pci_dev_flags_t) 1, | 174 | PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = (__force pci_dev_flags_t) 1, |
175 | /* Device configuration is irrevocably lost if disabled into D3 */ | 175 | /* Device configuration is irrevocably lost if disabled into D3 */ |
176 | PCI_DEV_FLAGS_NO_D3 = (__force pci_dev_flags_t) 2, | 176 | PCI_DEV_FLAGS_NO_D3 = (__force pci_dev_flags_t) 2, |
177 | /* Provide indication device is assigned by a Virtual Machine Manager */ | ||
178 | PCI_DEV_FLAGS_ASSIGNED = (__force pci_dev_flags_t) 4, | ||
177 | }; | 179 | }; |
178 | 180 | ||
179 | enum pci_irq_reroute_variant { | 181 | enum pci_irq_reroute_variant { |
diff --git a/virt/kvm/assigned-dev.c b/virt/kvm/assigned-dev.c index 4e9eaeb518c7..eaf3a50f9769 100644 --- a/virt/kvm/assigned-dev.c +++ b/virt/kvm/assigned-dev.c | |||
@@ -205,6 +205,8 @@ static void kvm_free_assigned_device(struct kvm *kvm, | |||
205 | else | 205 | else |
206 | pci_restore_state(assigned_dev->dev); | 206 | pci_restore_state(assigned_dev->dev); |
207 | 207 | ||
208 | assigned_dev->dev->dev_flags &= ~PCI_DEV_FLAGS_ASSIGNED; | ||
209 | |||
208 | pci_release_regions(assigned_dev->dev); | 210 | pci_release_regions(assigned_dev->dev); |
209 | pci_disable_device(assigned_dev->dev); | 211 | pci_disable_device(assigned_dev->dev); |
210 | pci_dev_put(assigned_dev->dev); | 212 | pci_dev_put(assigned_dev->dev); |
diff --git a/virt/kvm/iommu.c b/virt/kvm/iommu.c index 78c80f67f535..967aba133a62 100644 --- a/virt/kvm/iommu.c +++ b/virt/kvm/iommu.c | |||
@@ -187,6 +187,8 @@ int kvm_assign_device(struct kvm *kvm, | |||
187 | goto out_unmap; | 187 | goto out_unmap; |
188 | } | 188 | } |
189 | 189 | ||
190 | pdev->dev_flags |= PCI_DEV_FLAGS_ASSIGNED; | ||
191 | |||
190 | printk(KERN_DEBUG "assign device %x:%x:%x.%x\n", | 192 | printk(KERN_DEBUG "assign device %x:%x:%x.%x\n", |
191 | assigned_dev->host_segnr, | 193 | assigned_dev->host_segnr, |
192 | assigned_dev->host_busnr, | 194 | assigned_dev->host_busnr, |
@@ -215,6 +217,8 @@ int kvm_deassign_device(struct kvm *kvm, | |||
215 | 217 | ||
216 | iommu_detach_device(domain, &pdev->dev); | 218 | iommu_detach_device(domain, &pdev->dev); |
217 | 219 | ||
220 | pdev->dev_flags &= ~PCI_DEV_FLAGS_ASSIGNED; | ||
221 | |||
218 | printk(KERN_DEBUG "deassign device %x:%x:%x.%x\n", | 222 | printk(KERN_DEBUG "deassign device %x:%x:%x.%x\n", |
219 | assigned_dev->host_segnr, | 223 | assigned_dev->host_segnr, |
220 | assigned_dev->host_busnr, | 224 | assigned_dev->host_busnr, |