Messages in this thread Patch in this message | | | Date | Tue, 11 Sep 2007 10:42:31 -0700 | From | "Keshavamurthy, Anil S" <> | Subject | Re: [RFC][Intel-IOMMU] Fix for IOMMU early crash |
| |
On Mon, Sep 10, 2007 at 03:37:48AM +1000, Paul Mackerras wrote: > Keshavamurthy, Anil S writes: > > > Subject: [RFC][Intel-IOMMU] Fix for IOMMU early crash > > > > Populating pci_bus->sysdata way early in the pci discovery phase > > sets NON-NULL value to pci_dev->sysdata which breaks the assumption > > in the Intel IOMMU driver and crashes the system. > > > > > > In the drivers/pci/probe.c, pci_dev->sysdata gets a copy of > > its pci_bus->sysdata which is not required as > > the same can be obtained from pci_dev->bus->sysdata. More over > > the left hand assignment of pci_dev->sysdata is never being used, > > Wrong. You needed to grep a bit more widely... Ah..Thanks for pointing this out. sorry I had checked only i386 and x86_64. > > > so their is no point is setting > > pci_dev->sysdata = pci_bus->sysdata; > > > > This patch removes sysdata from pci_dev struct and creates a new > > field called sys_data which is exclusively used > > by IOMMU driver to keep its per device context pointer. > > This will break powerpc, because we use the pci_dev->sysdata field to > point to a firmware device tree node. Please figure out another way > to solve your problem.
Yes, I agree that pci_dev->sysdata can;t be removed. Even we (IOMMU) were dependent on this field but somehow this field is being overwritten to point to pci_bus's->sysdata and hence IOMMU was failing. Earlier it was overwritten to NULL and hence we were not failing but now it is overwritten to non-NULL and hence we fail.
My therory is that we don;t need to copy pci_bus's->sysdata to pci_dev's->sysdata. Below patch solves my problem. Any objection to below patch?
--- drivers/pci/hotplug/fakephp.c | 1 - drivers/pci/probe.c | 1 - 2 files changed, 2 deletions(-)
Index: work/drivers/pci/hotplug/fakephp.c =================================================================== --- work.orig/drivers/pci/hotplug/fakephp.c 2007-09-11 10:29:30.000000000 -0700 +++ work/drivers/pci/hotplug/fakephp.c 2007-09-11 10:35:22.000000000 -0700 @@ -243,7 +243,6 @@ return; dev->bus = (struct pci_bus*)bus; - dev->sysdata = bus->sysdata; for (devfn = 0; devfn < 0x100; devfn += 8) { dev->devfn = devfn; pci_rescan_slot(dev); Index: work/drivers/pci/probe.c =================================================================== --- work.orig/drivers/pci/probe.c 2007-09-11 10:29:30.000000000 -0700 +++ work/drivers/pci/probe.c 2007-09-11 10:35:22.000000000 -0700 @@ -994,7 +994,6 @@ return NULL; dev->bus = bus; - dev->sysdata = bus->sysdata; dev->dev.parent = bus->bridge; dev->dev.bus = &pci_bus_type; dev->devfn = devfn;
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |