diff mbox

[Part2,V1,13/14] iommu/vt-d: update device to static identity domain mapping for PCI hotplug

Message ID 1389085234-22296-14-git-send-email-jiang.liu@linux.intel.com (mailing list archive)
State New, archived
Delegated to: Bjorn Helgaas
Headers show

Commit Message

Jiang Liu Jan. 7, 2014, 9 a.m. UTC
When PCI device hotplug event happen, we need to update device to
static identity domain mapping relationship to maintain correct
device to domain mapping.

Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
---
 drivers/iommu/intel-iommu.c |   17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)
diff mbox

Patch

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 6a9a314..83e3ed4 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -3659,13 +3659,26 @@  static int device_notifier(struct notifier_block *nb,
 		return 0;
 
 	down_read(&dmar_global_lock);
-	if (action == BUS_NOTIFY_UNBOUND_DRIVER && !iommu_pass_through) {
-		domain_remove_one_dev_info(domain, pdev);
+	switch (action) {
+	case BUS_NOTIFY_ADD_DEVICE:
+		if (iommu_should_identity_map(pdev, 1))
+			domain_add_dev_info(si_domain, pdev,
+					    hw_pass_through ?
+					    CONTEXT_TT_PASS_THROUGH :
+					    CONTEXT_TT_MULTI_LEVEL);
+		break;
 
+	case BUS_NOTIFY_UNBOUND_DRIVER:
+		if (iommu_pass_through)
+			break;
+		/* fall through */
+	case BUS_NOTIFY_DEL_DEVICE:
+		domain_remove_one_dev_info(domain, pdev);
 		if (!(domain->flags & DOMAIN_FLAG_VIRTUAL_MACHINE) &&
 		    !(domain->flags & DOMAIN_FLAG_STATIC_IDENTITY) &&
 		    list_empty(&domain->devices))
 			domain_exit(domain);
+		break;
 	}
 	up_read(&dmar_global_lock);