Thread (1 message) 1 message, 1 author, 2011-09-23

Re: [net-next 1/8] pci: Add flag indicating device has been assigned by KVM

From: Jeff Kirsher <hidden>
Date: 2011-09-23 05:23:15

On Thu, 2011-09-22 at 22:19 -0700, Jesse Barnes wrote:
On Thu, 22 Sep 2011 21:16:18 -0700
Jeff Kirsher [off-list ref] wrote:
quoted
On Wed, Sep 21, 2011 at 03:12, Jeff Kirsher
[off-list ref] wrote:
quoted
From: Greg Rose <redacted>

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.

Signed-off-by: Greg Rose <redacted>
Signed-off-by: Jeff Kirsher <redacted>
---
 include/linux/pci.h     |    2 ++
 virt/kvm/assigned-dev.c |    2 ++
 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 f27893b..4f511da 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -174,6 +174,8 @@ enum pci_dev_flags {
       PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = (__force
pci_dev_flags_t) 1, /* Device configuration is irrevocably lost if
disabled into D3 */ PCI_DEV_FLAGS_NO_D3 = (__force pci_dev_flags_t)
2,
+       /* Provide indication device is assigned by KVM */
+       PCI_DEV_FLAGS_ASSIGNED = (__force pci_dev_flags_t) 4,
 };

 enum pci_irq_reroute_variant {
diff --git a/virt/kvm/assigned-dev.c b/virt/kvm/assigned-dev.c
index 4e9eaeb..eaf3a50 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, else
               pci_restore_state(assigned_dev->dev);

+       assigned_dev->dev->dev_flags &= ~PCI_DEV_FLAGS_ASSIGNED;
+
       pci_release_regions(assigned_dev->dev);
       pci_disable_device(assigned_dev->dev);
       pci_dev_put(assigned_dev->dev);
diff --git a/virt/kvm/iommu.c b/virt/kvm/iommu.c
index 78c80f6..967aba1 100644
--- a/virt/kvm/iommu.c
+++ b/virt/kvm/iommu.c
@@ -187,6 +187,8 @@ int kvm_assign_device(struct kvm *kvm,
                       goto out_unmap;
       }

+       pdev->dev_flags |= PCI_DEV_FLAGS_ASSIGNED;
+
       printk(KERN_DEBUG "assign device %x:%x:%x.%x\n",
               assigned_dev->host_segnr,
               assigned_dev->host_busnr,
@@ -215,6 +217,8 @@ int kvm_deassign_device(struct kvm *kvm,

       iommu_detach_device(domain, &pdev->dev);

+       pdev->dev_flags &= ~PCI_DEV_FLAGS_ASSIGNED;
+
       printk(KERN_DEBUG "deassign device %x:%x:%x.%x\n",
               assigned_dev->host_segnr,
               assigned_dev->host_busnr,
--
1.7.6.2
Jesse/Konrad/Ian-

I sent this patch out as part of a pull request for David Miller's
net-next tree.  I know that Greg sent this originally out to the
linux-pci mailing list as a RFC. Since Greg also has a patch against
ixgbe which implemented this flag, I sent both patches for inclusion
into David Miller's net-next.

Dave is wanting to ensure that the PCI maintainers have reviewed this
and are ok with it before pulls my series of patches.
Yeah I think I looked at this one in the past, my ack must have been
dropped.  You can add it if you want.

Jesse
Thanks Jesse!

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help