http://bugzilla.kernel.org/show_bug.cgi?id=9961





------- Comment #19 from [EMAIL PROTECTED]  2008-03-19 14:05 -------
I am still struggling with this.  I do not fully understand root cause
yet but I'm betting that the hot-add of a "transparent" p2p bridge
(on Dock II) immediately below yet another "transparent" p2p bridge
(on ThinkPad) which creates a pretty complex cobweb of resource references has
something to do with it.

    bus 00 --------------
                 |
              00:1e.0 - ThinkPad resident Intel 82801 Mobile PCI Bridge
                 |        "transparent" via pci_fixup_transparent_bridge()
                 |
    bus 02 --------------
                 |
              02:03.0 - Dock II resident Texas Instruments PCI2032 PCI
                 |      Docking Bridge
                 |         "transparent" due to programming interface == 0x01
                 |
    bus 09 --------------

I have determined why we are not seeing the Oops during boot when
the Dock II already attached to the laptop.  It is due to
pcibios_allocate_bus_resources() only being visited during boot.
The boot-time visit to
                  ...
   if (!r->start || !pr ||
       request_resource(pr, r) < 0) {
           printk(KERN_ERR "PCI: Cannot allocate "
                       "resource region %d "
                       "of bridge %s\n",
                       idx, pci_name(dev));
           /*
            * Something is wrong with the region.
            * Invalidate the resource to prevent
            * child resource allocations in this
            * range.
            */
            r->flags = 0;
   }
             ...
in pcibios_allocate_bus_resources() clears the Dock II resource flags
for regions 7, 8, and 9 as evidenced by the following messages which
appear both with and without transparent bridge sizing removed.
  PCI: Cannot allocate resource region 7 of bridge 0000:02:03.0
  PCI: Cannot allocate resource region 8 of bridge 0000:02:03.0
  PCI: Cannot allocate resource region 9 of bridge 0000:02:03.0

With the Dock II bridge resource flags for these regions cleared
the check:
    if (!(r->flags) || r->parent)
        continue;
in pdev_sort_resources() prevents execution from reaching
the list->next in the later:
   struct resource_list *ln = list->next;
where the NULL pointer dereference occurs in the hot-add case
after one trip through the body of the enclosing for loop.  In
the hot-add case, pcibios_allocate_bus_resources() is not visited
so the Dock II bridge resource flags are not cleared prior to
the call to pcibios_allocate_bus_resources().

If I am unable to come up with a solution for this that retains
the transparent bridge non-sizing in the next couple of days it
is likely that I will provide a patch that simply restores the
transparent bridge sizing.  I believe the resource shortage on
some of our systems that motiviated the transparent bridge
non-sizing change no longer shows up when space is not allocated
by default for expansion ROMs.  A later change that removes
default allocation for expansion ROMs is already in mainline.


-- 
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
acpi-bugzilla mailing list
acpi-bugzilla@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/acpi-bugzilla

Reply via email to