aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Rose <gregory.v.rose@intel.com>2011-07-22 01:46:07 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2011-09-23 12:05:44 -0400
commit6777829cfe1c4ed78319ad40aaee60254222da76 (patch)
tree03e55538247c4b2fbdc837984922a0ac8753b253
parent9c9b1f24f2aa31a3cea94939edc551f68ebadc89 (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.h2
-rw-r--r--virt/kvm/assigned-dev.c2
-rw-r--r--virt/kvm/iommu.c4
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
179enum pci_irq_reroute_variant { 181enum 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,