Re: [patch take 2][Intel-IOMMU] Fix for IOMMU early crash

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Keshavamurthy, Anil S
Date: Thursday, October 4, 2007 - 12:20 pm

On Thu, Oct 04, 2007 at 01:39:39PM +1000, Benjamin Herrenschmidt wrote:

Andrew,
	Please delete my previous patch and add the below patch 
to your MM queue. 

I guess the patch name is "intel-iommu-fix-for-iommu-early-crash.patch".

Thanks,
Anil
------------------------------------------------------

Subject: [Intel-IOMMU] Fix for IOMMU early crash

pci_dev's->sysdata is highly overloaded and currently
IOMMU is broken due to IOMMU code depending on this field.

This patch introduces new field in pci_dev's dev.archdata struct to
hold IOMMU specific per device IOMMU private data.

Signed-off-by: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>

---
 drivers/pci/intel-iommu.c   |   22 +++++++++++-----------
 include/asm-x86_64/device.h |    3 +++
 2 files changed, 14 insertions(+), 11 deletions(-)

Index: 2.6-mm/drivers/pci/intel-iommu.c
===================================================================
--- 2.6-mm.orig/drivers/pci/intel-iommu.c	2007-10-04 11:35:09.000000000 -0700
+++ 2.6-mm/drivers/pci/intel-iommu.c	2007-10-04 11:47:47.000000000 -0700
@@ -1348,7 +1348,7 @@
 		list_del(&info->link);
 		list_del(&info->global);
 		if (info->dev)
-			info->dev->sysdata = NULL;
+			info->dev->dev.archdata.iommu = NULL;
 		spin_unlock_irqrestore(&device_domain_lock, flags);
 
 		detach_domain_for_dev(info->domain, info->bus, info->devfn);
@@ -1361,7 +1361,7 @@
 
 /*
  * find_domain
- * Note: we use struct pci_dev->sysdata stores the info
+ * Note: we use struct pci_dev->dev.archdata.iommu stores the info
  */
 struct dmar_domain *
 find_domain(struct pci_dev *pdev)
@@ -1369,7 +1369,7 @@
 	struct device_domain_info *info;
 
 	/* No lock here, assumes no domain exit in normal case */
-	info = pdev->sysdata;
+	info = pdev->dev.archdata.iommu;
 	if (info)
 		return info->domain;
 	return NULL;
@@ -1519,7 +1519,7 @@
 	}
 	list_add(&info->link, &domain->devices);
 	list_add(&info->global, &device_domain_list);
-	pdev->sysdata = info;
+	pdev->dev.archdata.iommu = info;
 	spin_unlock_irqrestore(&device_domain_lock, flags);
 	return domain;
 error:
@@ -1579,7 +1579,7 @@
 static inline int iommu_prepare_rmrr_dev(struct dmar_rmrr_unit *rmrr,
 	struct pci_dev *pdev)
 {
-	if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO)
+	if (pdev->dev.archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO)
 		return 0;
 	return iommu_prepare_identity_map(pdev, rmrr->base_address,
 		rmrr->end_address + 1);
@@ -1595,7 +1595,7 @@
 	int ret;
 
 	for_each_pci_dev(pdev) {
-		if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO ||
+		if (pdev->dev.archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO ||
 				!IS_GFX_DEVICE(pdev))
 			continue;
 		printk(KERN_INFO "IOMMU: gfx device %s 1-1 mapping\n",
@@ -1836,7 +1836,7 @@
 	int prot = 0;
 
 	BUG_ON(dir == DMA_NONE);
-	if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO)
+	if (pdev->dev.archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO)
 		return virt_to_bus(addr);
 
 	domain = get_valid_domain_for_dev(pdev);
@@ -1900,7 +1900,7 @@
 	unsigned long start_addr;
 	struct iova *iova;
 
-	if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO)
+	if (pdev->dev.archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO)
 		return;
 	domain = find_domain(pdev);
 	BUG_ON(!domain);
@@ -1974,7 +1974,7 @@
 	size_t size = 0;
 	void *addr;
 
-	if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO)
+	if (pdev->dev.archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO)
 		return;
 
 	domain = find_domain(pdev);
@@ -2032,7 +2032,7 @@
 	unsigned long start_addr;
 
 	BUG_ON(dir == DMA_NONE);
-	if (pdev->sysdata == DUMMY_DEVICE_DOMAIN_INFO)
+	if (pdev->dev.archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO)
 		return intel_nontranslate_map_sg(hwdev, sg, nelems, dir);
 
 	domain = get_valid_domain_for_dev(pdev);
@@ -2234,7 +2234,7 @@
 		for (i = 0; i < drhd->devices_cnt; i++) {
 			if (!drhd->devices[i])
 				continue;
-			drhd->devices[i]->sysdata = DUMMY_DEVICE_DOMAIN_INFO;
+			drhd->devices[i]->dev.archdata.iommu = DUMMY_DEVICE_DOMAIN_INFO;
 		}
 	}
 }
Index: 2.6-mm/include/asm-x86_64/device.h
===================================================================
--- 2.6-mm.orig/include/asm-x86_64/device.h	2007-10-04 11:35:09.000000000 -0700
+++ 2.6-mm/include/asm-x86_64/device.h	2007-10-04 11:49:44.000000000 -0700
@@ -10,6 +10,9 @@
 #ifdef CONFIG_ACPI
 	void	*acpi_handle;
 #endif
+#ifdef CONFIG_DMAR
+	void *iommu; /* hook for IOMMU specific extension */
+#endif
 };
 
 #endif /* _ASM_X86_64_DEVICE_H */
-
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[RFC][Intel-IOMMU] Fix for IOMMU early crash, Keshavamurthy, Anil S, (Sat Sep 8, 1:05 pm)
Re: [RFC][Intel-IOMMU] Fix for IOMMU early crash, Muli Ben-Yehuda, (Sun Sep 9, 4:16 am)
Re: [RFC][Intel-IOMMU] Fix for IOMMU early crash, Paul Mackerras, (Sun Sep 9, 10:37 am)
Re: [RFC][Intel-IOMMU] Fix for IOMMU early crash, Muli Ben-Yehuda, (Sun Sep 9, 10:51 am)
Re: [RFC][Intel-IOMMU] Fix for IOMMU early crash, Keshavamurthy, Anil S, (Mon Sep 10, 8:43 am)
Re: [RFC][Intel-IOMMU] Fix for IOMMU early crash, Muli Ben-Yehuda, (Mon Sep 10, 1:25 pm)
Re: [RFC][Intel-IOMMU] Fix for IOMMU early crash, Keshavamurthy, Anil S, (Tue Sep 11, 10:22 am)
Re: [RFC][Intel-IOMMU] Fix for IOMMU early crash, Keshavamurthy, Anil S, (Tue Sep 11, 10:42 am)
Re: [patch][Intel-IOMMU] Fix for IOMMU early crash, Paul Mackerras, (Tue Sep 11, 12:48 pm)
Re: [RFC][Intel-IOMMU] Fix for IOMMU early crash, Keshavamurthy, Anil S, (Tue Sep 11, 1:43 pm)
[BUG:] forcedeth: MCP55 not allowing DHCP, Casey Dahlin, (Tue Sep 11, 3:05 pm)
[patch][Intel-IOMMU] Fix for IOMMU early crash, Keshavamurthy, Anil S, (Wed Sep 12, 12:28 pm)
Re: [patch][Intel-IOMMU] Fix for IOMMU early crash, Keshavamurthy, Anil S, (Wed Sep 12, 2:55 pm)
Re: [patch][Intel-IOMMU] Fix for IOMMU early crash, Keshavamurthy, Anil S, (Wed Sep 12, 6:29 pm)
Re: [patch][Intel-IOMMU] Fix for IOMMU early crash, Paul Mackerras, (Fri Sep 14, 9:30 am)
Re: [BUG:] forcedeth: MCP55 not allowing DHCP, Casey Dahlin, (Mon Sep 17, 6:59 pm)
Re: [patch][Intel-IOMMU] Fix for IOMMU early crash, Keshavamurthy, Anil S, (Tue Sep 25, 10:07 am)
[patch take 2][Intel-IOMMU] Fix for IOMMU early crash, Keshavamurthy, Anil S, (Wed Oct 3, 2:13 pm)
Re: [patch take 2][Intel-IOMMU] Fix for IOMMU early crash, Benjamin Herrenschmidt, (Wed Oct 3, 6:19 pm)
Re: [patch take 2][Intel-IOMMU] Fix for IOMMU early crash, Keshavamurthy, Anil S, (Wed Oct 3, 6:36 pm)
Re: [patch take 2][Intel-IOMMU] Fix for IOMMU early crash, Benjamin Herrenschmidt, (Wed Oct 3, 8:39 pm)
Re: [patch take 2][Intel-IOMMU] Fix for IOMMU early crash, Keshavamurthy, Anil S, (Thu Oct 4, 12:20 pm)
Re: [patch take 2][Intel-IOMMU] Fix for IOMMU early crash, Benjamin Herrenschmidt, (Thu Oct 4, 8:08 pm)