From: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
To: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: Len Brown <lenb@kernel.org>,
linux-acpi@vger.kernel.org,
linux-kernel <linux-kernel@vger.kernel.org>,
linux-pci@vger.kernel.org, "Barnes,
Jesse" <jesse.barnes@intel.com>,
shaohua.li@intel.com
Subject: Re: ACPI hotplug panic with current git head
Date: Mon, 19 Jan 2009 12:11:32 +0900 [thread overview]
Message-ID: <4973EF64.2050404@jp.fujitsu.com> (raw)
In-Reply-To: <1232328216.3247.68.camel@localhost.localdomain>
[-- Attachment #1: Type: text/plain, Size: 7106 bytes --]
James Bottomley wrote:
> On Mon, 2009-01-19 at 10:10 +0900, Kenji Kaneshige wrote:
>> James Bottomley wrote:
>>> On Fri, 2009-01-16 at 15:07 +0900, Kenji Kaneshige wrote:
>>>>> It looks like acpi_pci_get_bridge_handle() is returning NULL, so this is
>>>>> the fix that works for me.
>>>>>
>>>> I'm sorry for troubling you, and thank you for your patience.
>>>>
>>>> The patch seems to avoid the kernel panic, but I still don't know
>>>> why acpi_pci_get_bridge_handle() returns NULL here. I assumed
>>>> it should return non-NULL value here. So I'd like to investigate
>>>> it more.
>>> Sure, Len and I couldn't work out why it was returning NULL on this box
>>> (other than that perhaps it doesn't have an ACPI entry). The two
>>> offending busses which trigger this are the two internal ones (which
>>> aren't hotplug). The layout of the box is:
>>>
>>> sparkweed:~# lspci -t
>>> -+-[0000:0c]---00.0
>>> +-[0000:0a]---00.0
>>> +-[0000:08]---00.0
>>> +-[0000:06]---00.0
>>> +-[0000:04]---00.0
>>> +-[0000:02]---00.0
>>> +-[0000:01]-+-00.0
>>> | +-01.0
>>> | +-01.1
>>> | \-02.0
>>> \-[0000:00]-+-00.0
>>> +-01.0
>>> +-03.0
>>> +-03.1
>>> +-03.2
>>> +-0f.0
>>> +-0f.1
>>> \-0f.3
>>> sparkweed:~# lspci
>>> 00:00.0 Host bridge: IBM Calgary PCI-X Host Bridge (rev 02)
>>> 00:01.0 VGA compatible controller: ATI Technologies Inc Radeon RV100 QY
>>> [Radeon 7000/VE]
>>> 00:03.0 USB Controller: NEC Corporation USB (rev 43)
>>> 00:03.1 USB Controller: NEC Corporation USB (rev 43)
>>> 00:03.2 USB Controller: NEC Corporation USB 2.0 (rev 04)
>>> 00:0f.0 Host bridge: Broadcom CSB6 South Bridge (rev a0)
>>> 00:0f.1 IDE interface: Broadcom CSB6 RAID/IDE Controller (rev a0)
>>> 00:0f.3 ISA bridge: Broadcom GCLE-2 Host Bridge
>>> 01:00.0 Host bridge: IBM Calgary PCI-X Host Bridge (rev 02)
>>> 01:01.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5704
>>> Gigabit Ethernet (rev 10)
>>> 01:01.1 Ethernet controller: Broadcom Corporation NetXtreme BCM5704
>>> Gigabit Ethernet (rev 10)
>>> 01:02.0 SCSI storage controller: Adaptec AIC-9410W SAS (Razor ASIC
>>> non-RAID) (rev 08)
>>> 02:00.0 Host bridge: IBM Calgary PCI-X Host Bridge (rev 02)
>>> 04:00.0 Host bridge: IBM Calgary PCI-X Host Bridge (rev 02)
>>> 06:00.0 Host bridge: IBM Calgary PCI-X Host Bridge (rev 02)
>>> 08:00.0 Host bridge: IBM Calgary PCI-X Host Bridge (rev 02)
>>> 0a:00.0 Host bridge: IBM Calgary PCI-X Host Bridge (rev 02)
>>> 0c:00.0 Host bridge: IBM Calgary PCI-X Host Bridge (rev 02)
>>>
>>> And when I annotate the problem, the two busses returning NULL are
>>> 0000:00 and 0000:01
>>>
>> Thank you very much for the information. It seems there are
>> something special in the data structure of host bridge for
>> 0000:00 and 0000:01.
>
> Yes, len speculates the non hotplug buses are missing some acpi entries.
>
>> I'm making a debug patch now and will send it to you as soon
>> as possible. I'm sorry to trouble you, but could you try it
>> later.
>
> Sure ... I'm travelling this week, but the machine is usually remotely
> accessible.
>
I appreciate your kindness.
I'm sending the debug patch against 2.6.29-rc1 below. I'm also
sending it as an attachment. It also contains the code to prevent
the kernel panic from you. Please note that you will see two
WARN_ON(1) messages with the patch. Those are shown by my debug
patch.
Could you try it and send me the whole dmsg output?
Thanks,
Kenji Kaneshige
drivers/pci/hotplug/acpiphp_glue.c | 18 ++++++++++++++++++
include/linux/pci-acpi.h | 25 ++++++++++++++++++++++---
2 files changed, 40 insertions(+), 3 deletions(-)
Index: linux-2.6.29-rc1/include/linux/pci-acpi.h
===================================================================
--- linux-2.6.29-rc1.orig/include/linux/pci-acpi.h 2008-12-01 22:59:52.000000000 +0900
+++ linux-2.6.29-rc1/include/linux/pci-acpi.h 2009-01-19 10:27:13.000000000 +0900
@@ -65,9 +65,28 @@
{
int seg = pci_domain_nr(pbus), busnr = pbus->number;
struct pci_dev *bridge = pbus->self;
- if (bridge)
- return DEVICE_ACPI_HANDLE(&(bridge->dev));
- return acpi_get_pci_rootbridge_handle(seg, busnr);
+ acpi_handle handle;
+ char objname[64] = "<NULL>";
+ struct acpi_buffer buffer = { .length = sizeof(objname),
+ .pointer = objname };
+
+ printk(KERN_INFO "%s: bridge(pbus->self) = %p, pbus->parent = %p\n",
+ __func__, bridge, pbus->parent);
+
+ if (bridge) {
+ printk(KERN_INFO "%s: handle the bridge as PtoP.\n", __func__);
+ handle = DEVICE_ACPI_HANDLE(&(bridge->dev));
+ } else {
+ printk(KERN_INFO "%s: handle the bridge as root.\n", __func__);
+ handle = acpi_get_pci_rootbridge_handle(seg, busnr);
+ }
+
+ if (handle)
+ acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
+ printk(KERN_INFO "%s: ACPI handle of the bridge for %04x:%02x: %p %s\n",
+ __func__, seg, busnr, handle, objname);
+
+ return handle;
}
#else
#if !defined(AE_ERROR)
Index: linux-2.6.29-rc1/drivers/pci/hotplug/acpiphp_glue.c
===================================================================
--- linux-2.6.29-rc1.orig/drivers/pci/hotplug/acpiphp_glue.c 2008-12-01 22:59:46.000000000 +0900
+++ linux-2.6.29-rc1/drivers/pci/hotplug/acpiphp_glue.c 2009-01-19 10:32:05.000000000 +0900
@@ -266,6 +266,12 @@
int found = acpi_pci_detect_ejectable(pbus);
if (!found) {
acpi_handle bridge_handle = acpi_pci_get_bridge_handle(pbus);
+ if (!bridge_handle) {
+ printk(KERN_INFO
+ "%s: NULL handle returned!!!\n", __func__);
+ WARN_ON(1);
+ return 0;
+ }
acpi_walk_namespace(ACPI_TYPE_DEVICE, bridge_handle, (u32)1,
is_pci_dock_device, (void *)&found, NULL);
}
@@ -459,6 +465,9 @@
int device, function;
struct pci_dev *dev;
struct pci_bus *pci_bus = context;
+ char objname[64];
+ struct acpi_buffer buffer = { .length = sizeof(objname),
+ .pointer = objname };
status = acpi_get_handle(handle, "_ADR", &dummy_handle);
if (ACPI_FAILURE(status))
@@ -478,6 +487,9 @@
if (!dev || !dev->subordinate)
goto out;
+ acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
+ printk(KERN_INFO "%s: Detecting slots under PtoP bridge (%s)\n",
+ __func__, objname);
/* check if this bridge has ejectable slots */
if ((detect_ejectable_slots(dev->subordinate) > 0)) {
dbg("found PCI-to-PCI bridge at PCI %s\n", pci_name(dev));
@@ -504,6 +516,9 @@
int seg, bus;
acpi_handle dummy_handle;
struct pci_bus *pci_bus;
+ char objname[64];
+ struct acpi_buffer buffer = { .length = sizeof(objname),
+ .pointer = objname };
/* if the bridge doesn't have _STA, we assume it is always there */
status = acpi_get_handle(handle, "_STA", &dummy_handle);
@@ -539,6 +554,9 @@
return 0;
}
+ acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
+ printk(KERN_INFO "%s: Detecting slots under root bridge (%s)\n",
+ __func__, objname);
/* check if this bridge has ejectable slots */
if (detect_ejectable_slots(pci_bus) > 0) {
dbg("found PCI host-bus bridge with hot-pluggable slots\n");
[-- Attachment #2: debug.patch --]
[-- Type: text/plain, Size: 3569 bytes --]
drivers/pci/hotplug/acpiphp_glue.c | 18 ++++++++++++++++++
include/linux/pci-acpi.h | 25 ++++++++++++++++++++++---
2 files changed, 40 insertions(+), 3 deletions(-)
Index: linux-2.6.29-rc1/include/linux/pci-acpi.h
===================================================================
--- linux-2.6.29-rc1.orig/include/linux/pci-acpi.h 2008-12-01 22:59:52.000000000 +0900
+++ linux-2.6.29-rc1/include/linux/pci-acpi.h 2009-01-19 10:27:13.000000000 +0900
@@ -65,9 +65,28 @@
{
int seg = pci_domain_nr(pbus), busnr = pbus->number;
struct pci_dev *bridge = pbus->self;
- if (bridge)
- return DEVICE_ACPI_HANDLE(&(bridge->dev));
- return acpi_get_pci_rootbridge_handle(seg, busnr);
+ acpi_handle handle;
+ char objname[64] = "<NULL>";
+ struct acpi_buffer buffer = { .length = sizeof(objname),
+ .pointer = objname };
+
+ printk(KERN_INFO "%s: bridge(pbus->self) = %p, pbus->parent = %p\n",
+ __func__, bridge, pbus->parent);
+
+ if (bridge) {
+ printk(KERN_INFO "%s: handle the bridge as PtoP.\n", __func__);
+ handle = DEVICE_ACPI_HANDLE(&(bridge->dev));
+ } else {
+ printk(KERN_INFO "%s: handle the bridge as root.\n", __func__);
+ handle = acpi_get_pci_rootbridge_handle(seg, busnr);
+ }
+
+ if (handle)
+ acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
+ printk(KERN_INFO "%s: ACPI handle of the bridge for %04x:%02x: %p %s\n",
+ __func__, seg, busnr, handle, objname);
+
+ return handle;
}
#else
#if !defined(AE_ERROR)
Index: linux-2.6.29-rc1/drivers/pci/hotplug/acpiphp_glue.c
===================================================================
--- linux-2.6.29-rc1.orig/drivers/pci/hotplug/acpiphp_glue.c 2008-12-01 22:59:46.000000000 +0900
+++ linux-2.6.29-rc1/drivers/pci/hotplug/acpiphp_glue.c 2009-01-19 10:32:05.000000000 +0900
@@ -266,6 +266,12 @@
int found = acpi_pci_detect_ejectable(pbus);
if (!found) {
acpi_handle bridge_handle = acpi_pci_get_bridge_handle(pbus);
+ if (!bridge_handle) {
+ printk(KERN_INFO
+ "%s: NULL handle returned!!!\n", __func__);
+ WARN_ON(1);
+ return 0;
+ }
acpi_walk_namespace(ACPI_TYPE_DEVICE, bridge_handle, (u32)1,
is_pci_dock_device, (void *)&found, NULL);
}
@@ -459,6 +465,9 @@
int device, function;
struct pci_dev *dev;
struct pci_bus *pci_bus = context;
+ char objname[64];
+ struct acpi_buffer buffer = { .length = sizeof(objname),
+ .pointer = objname };
status = acpi_get_handle(handle, "_ADR", &dummy_handle);
if (ACPI_FAILURE(status))
@@ -478,6 +487,9 @@
if (!dev || !dev->subordinate)
goto out;
+ acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
+ printk(KERN_INFO "%s: Detecting slots under PtoP bridge (%s)\n",
+ __func__, objname);
/* check if this bridge has ejectable slots */
if ((detect_ejectable_slots(dev->subordinate) > 0)) {
dbg("found PCI-to-PCI bridge at PCI %s\n", pci_name(dev));
@@ -504,6 +516,9 @@
int seg, bus;
acpi_handle dummy_handle;
struct pci_bus *pci_bus;
+ char objname[64];
+ struct acpi_buffer buffer = { .length = sizeof(objname),
+ .pointer = objname };
/* if the bridge doesn't have _STA, we assume it is always there */
status = acpi_get_handle(handle, "_STA", &dummy_handle);
@@ -539,6 +554,9 @@
return 0;
}
+ acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
+ printk(KERN_INFO "%s: Detecting slots under root bridge (%s)\n",
+ __func__, objname);
/* check if this bridge has ejectable slots */
if (detect_ejectable_slots(pci_bus) > 0) {
dbg("found PCI host-bus bridge with hot-pluggable slots\n");
next prev parent reply other threads:[~2009-01-19 3:11 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-10 16:17 ACPI hotplug panic with current git head James Bottomley
2009-01-12 21:16 ` Len Brown
2009-01-13 0:48 ` James Bottomley
2009-01-13 3:40 ` Len Brown
2009-01-15 19:01 ` James Bottomley
2009-01-15 19:22 ` Len Brown
2009-01-15 19:54 ` James Bottomley
2009-01-15 20:12 ` James Bottomley
2009-01-16 6:07 ` Kenji Kaneshige
2009-01-16 14:19 ` James Bottomley
2009-01-19 1:10 ` Kenji Kaneshige
2009-01-19 1:23 ` James Bottomley
2009-01-19 3:11 ` Kenji Kaneshige [this message]
2009-01-21 17:26 ` James Bottomley
2009-01-26 2:11 ` Kenji Kaneshige
2009-01-26 6:21 ` Grant Grundler
2009-01-26 12:27 ` Kenji Kaneshige
2009-01-28 11:47 ` Kenji Kaneshige
2009-01-28 11:48 ` [PATCH 1/8] PCI/ACPI: fix wrong assumption in acpi_pci_get_bridge_handle Kenji Kaneshige
2009-01-28 11:50 ` [PATCH 2/8] PCI/ACPI: fix wrong assumption in acpi_find_root_bridge_handle Kenji Kaneshige
2009-01-28 11:51 ` [PATCH 3/8] PCI hotplug: fix wrong assumption in acpi_get_hp_params_from_firmware Kenji Kaneshige
2009-01-28 11:55 ` [PATCH 4/8] PCI hotplug: fix wrong assumption in acpi_get_hp_hw_control_from_firmware Kenji Kaneshige
2009-01-28 11:56 ` [PATCH 5/8] PCI: fix wrong assumption in pci_find_upstream_pcie_bridge Kenji Kaneshige
2009-01-28 11:57 ` [PATCH 6/8] PCI: fix wrong assumption in pci_read_bridge_bases Kenji Kaneshige
2009-01-28 11:58 ` [PATCH 7/8] PCI: fix wrong assumption in pci_get_interrupt_pin Kenji Kaneshige
2009-01-28 11:59 ` [PATCH 8/8] PCI: fix wrong assumption in pci_common_swizzle Kenji Kaneshige
2009-01-28 12:05 ` ACPI hotplug panic with current git head Kenji Kaneshige
2009-02-14 0:30 ` Jesse Barnes
[not found] ` <499A46CC.1020102@jp.fujitsu.com>
2009-02-18 18:59 ` Jesse Barnes
2009-02-18 19:08 ` James Bottomley
2009-02-18 19:41 ` Jesse Barnes
2009-03-02 17:07 ` James Bottomley
2009-01-16 20:08 ` Len Brown
2009-01-16 20:22 ` Jesse Barnes
2009-01-19 1:15 ` Kenji Kaneshige
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4973EF64.2050404@jp.fujitsu.com \
--to=kaneshige.kenji@jp.fujitsu.com \
--cc=James.Bottomley@HansenPartnership.com \
--cc=jesse.barnes@intel.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=shaohua.li@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.