All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/3] PCI core logical hotplug cleanup
@ 2009-03-30 16:50 Alex Chiang
  2009-03-30 16:50 ` [PATCH v2 1/3] PCI: allow PCI core hotplug to remove PCI root bus Alex Chiang
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Alex Chiang @ 2009-03-30 16:50 UTC (permalink / raw)
  To: jbarnes; +Cc: linux-pci, linux-kernel

This is v2 of cleaning up the fallout between core logical hotplug and
physical hotplug drivers.

Thanks.

/ac

v1->v2:
	- clarify changelog
	- just use struct pci_slot->bus directly

---

Alex Chiang (3):
      PCI: pci_slot: grab refcount on slot's bus
      PCI Hotplug: acpiphp: grab refcount on p2p subordinate bus
      PCI: allow PCI core hotplug to remove PCI root bus


 drivers/acpi/pci_slot.c            |    5 +++++
 drivers/pci/hotplug/acpiphp_glue.c |   14 ++++++++++++++
 drivers/pci/pci-sysfs.c            |    4 ----
 3 files changed, 19 insertions(+), 4 deletions(-)


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 1/3] PCI: allow PCI core hotplug to remove PCI root bus
  2009-03-30 16:50 [PATCH v2 0/3] PCI core logical hotplug cleanup Alex Chiang
@ 2009-03-30 16:50 ` Alex Chiang
  2009-03-31  3:26   ` Kenji Kaneshige
  2009-04-06 18:45   ` Jesse Barnes
  2009-03-30 16:50 ` [PATCH v2 2/3] PCI Hotplug: acpiphp: grab refcount on p2p subordinate bus Alex Chiang
  2009-03-30 16:50 ` [PATCH v2 3/3] PCI: pci_slot: grab refcount on slot's bus Alex Chiang
  2 siblings, 2 replies; 8+ messages in thread
From: Alex Chiang @ 2009-03-30 16:50 UTC (permalink / raw)
  To: jbarnes; +Cc: linux-pci, linux-kernel

There is no reason to prevent removal of root bus devices. A subsequent
rescan will find them just fine.

Signed-off-by: Alex Chiang <achiang@hp.com>
---

 drivers/pci/pci-sysfs.c |    4 ----
 1 files changed, 0 insertions(+), 4 deletions(-)

diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
index e9a8706..7b2cb27 100644
--- a/drivers/pci/pci-sysfs.c
+++ b/drivers/pci/pci-sysfs.c
@@ -277,14 +277,10 @@ remove_store(struct device *dev, struct device_attribute *dummy,
 {
 	int ret = 0;
 	unsigned long val;
-	struct pci_dev *pdev = to_pci_dev(dev);
 
 	if (strict_strtoul(buf, 0, &val) < 0)
 		return -EINVAL;
 
-	if (pci_is_root_bus(pdev->bus))
-		return -EBUSY;
-
 	/* An attribute cannot be unregistered by one of its own methods,
 	 * so we have to use this roundabout approach.
 	 */


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 2/3] PCI Hotplug: acpiphp: grab refcount on p2p subordinate bus
  2009-03-30 16:50 [PATCH v2 0/3] PCI core logical hotplug cleanup Alex Chiang
  2009-03-30 16:50 ` [PATCH v2 1/3] PCI: allow PCI core hotplug to remove PCI root bus Alex Chiang
@ 2009-03-30 16:50 ` Alex Chiang
  2009-03-31  4:37   ` Kenji Kaneshige
  2009-03-30 16:50 ` [PATCH v2 3/3] PCI: pci_slot: grab refcount on slot's bus Alex Chiang
  2 siblings, 1 reply; 8+ messages in thread
From: Alex Chiang @ 2009-03-30 16:50 UTC (permalink / raw)
  To: jbarnes; +Cc: linux-pci, linux-kernel, Kenji Kaneshige

If a logical hot unplug (remove) is performed on a bridge claimed
by acpiphp and then acpiphp is unloaded, we will encounter an oops.

This is because acpiphp will access the bridge's subordinate bus,
which was released by the user's prior hot unplug.

The solution is to grab a reference on the subordinate PCI bus.
This will prevent the bus from release until acpiphp is unloaded.

Reported-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: Alex Chiang <achiang@hp.com>
---

 drivers/pci/hotplug/acpiphp_glue.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c
index 803d9dd..a33794d 100644
--- a/drivers/pci/hotplug/acpiphp_glue.c
+++ b/drivers/pci/hotplug/acpiphp_glue.c
@@ -38,6 +38,8 @@
  *  - The one in acpiphp_bridge has its refcount elevated by pci_get_slot()
  *    when the bridge is scanned and it loses a refcount when the bridge
  *    is removed.
+ *  - When a P2P bridge is present, we elevate the refcount on the subordinate
+ *    bus. It loses the refcount when the the driver unloads.
  */
 
 #include <linux/init.h>
@@ -440,6 +442,12 @@ static void add_p2p_bridge(acpi_handle *handle, struct pci_dev *pci_dev)
 		goto err;
 	}
 
+	/*
+	 * Grab a ref to the subordinate PCI bus in case the bus is
+	 * removed via PCI core logical hotplug. The ref pins the bus
+	 * (which we access during module unload).
+	 */
+	get_device(&bridge->pci_bus->dev);
 	spin_lock_init(&bridge->res_lock);
 
 	init_bridge_misc(bridge);
@@ -619,6 +627,12 @@ static void cleanup_bridge(struct acpiphp_bridge *bridge)
 		slot = next;
 	}
 
+	/*
+	 * Only P2P bridges have a pci_dev
+	 */
+	if (bridge->pci_dev)
+		put_device(&bridge->pci_bus->dev);
+
 	pci_dev_put(bridge->pci_dev);
 	list_del(&bridge->list);
 	kfree(bridge);


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 3/3] PCI: pci_slot: grab refcount on slot's bus
  2009-03-30 16:50 [PATCH v2 0/3] PCI core logical hotplug cleanup Alex Chiang
  2009-03-30 16:50 ` [PATCH v2 1/3] PCI: allow PCI core hotplug to remove PCI root bus Alex Chiang
  2009-03-30 16:50 ` [PATCH v2 2/3] PCI Hotplug: acpiphp: grab refcount on p2p subordinate bus Alex Chiang
@ 2009-03-30 16:50 ` Alex Chiang
  2009-03-31  5:00   ` Kenji Kaneshige
  2 siblings, 1 reply; 8+ messages in thread
From: Alex Chiang @ 2009-03-30 16:50 UTC (permalink / raw)
  To: jbarnes; +Cc: linux-pci, Kenji Kaneshige, linux-kernel, lenb

If a logical hot unplug (remove) is performed on a physical PCI slot's
parent bridge, and then pci_slot is unloaded, we will encounter an oops:

  [<ffffffff803a788a>] kobject_release+0x9a/0x290
  [<ffffffff803a77f0>] ? kobject_release+0x0/0x290
  [<ffffffff803a8ce7>] kref_put+0x37/0x80
  [<ffffffff803a76f7>] kobject_put+0x27/0x60
  [<ffffffff803bebcc>] ? pci_destroy_slot+0x3c/0xc0
  [<ffffffff803bebd5>] pci_destroy_slot+0x45/0xc0
  [<ffffffffa000f05c>] acpi_pci_slot_remove+0x5c/0x91 [pci_slot]
  [<ffffffff8040064b>] acpi_pci_unregister_driver+0x4b/0x62
  [<ffffffffa000f5c8>] acpi_pci_slot_exit+0x10/0x12 [pci_slot]
  [<ffffffff80276ce1>] sys_delete_module+0x161/0x250

We need to grab a reference to the parent PCI bus, which will pin
the bus and prevent it from being released until pci_slot is unloaded.

Cc: lenb@kernel.org
Reported-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: Alex Chiang <achiang@hp.com>
---

 drivers/acpi/pci_slot.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/drivers/acpi/pci_slot.c b/drivers/acpi/pci_slot.c
index cd1f446..12158e0 100644
--- a/drivers/acpi/pci_slot.c
+++ b/drivers/acpi/pci_slot.c
@@ -164,6 +164,8 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
 	list_add(&slot->list, &slot_list);
 	mutex_unlock(&slot_list_lock);
 
+	get_device(&pci_bus->dev);
+
 	dbg("pci_slot: %p, pci_bus: %x, device: %d, name: %s\n",
 		pci_slot, pci_bus->number, device, name);
 
@@ -310,12 +312,15 @@ static void
 acpi_pci_slot_remove(acpi_handle handle)
 {
 	struct acpi_pci_slot *slot, *tmp;
+	struct pci_bus *pbus;
 
 	mutex_lock(&slot_list_lock);
 	list_for_each_entry_safe(slot, tmp, &slot_list, list) {
 		if (slot->root_handle == handle) {
 			list_del(&slot->list);
+			pbus = slot->pci_slot->bus;
 			pci_destroy_slot(slot->pci_slot);
+			put_device(&pbus->dev);
 			kfree(slot);
 		}
 	}


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/3] PCI: allow PCI core hotplug to remove PCI root bus
  2009-03-30 16:50 ` [PATCH v2 1/3] PCI: allow PCI core hotplug to remove PCI root bus Alex Chiang
@ 2009-03-31  3:26   ` Kenji Kaneshige
  2009-04-06 18:45   ` Jesse Barnes
  1 sibling, 0 replies; 8+ messages in thread
From: Kenji Kaneshige @ 2009-03-31  3:26 UTC (permalink / raw)
  To: Alex Chiang; +Cc: jbarnes, linux-pci, linux-kernel

Reviewed-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>

Thanks,
Kenji Kaneshige


Alex Chiang wrote:
> There is no reason to prevent removal of root bus devices. A subsequent
> rescan will find them just fine.
> 
> Signed-off-by: Alex Chiang <achiang@hp.com>
> ---
> 
>  drivers/pci/pci-sysfs.c |    4 ----
>  1 files changed, 0 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
> index e9a8706..7b2cb27 100644
> --- a/drivers/pci/pci-sysfs.c
> +++ b/drivers/pci/pci-sysfs.c
> @@ -277,14 +277,10 @@ remove_store(struct device *dev, struct device_attribute *dummy,
>  {
>  	int ret = 0;
>  	unsigned long val;
> -	struct pci_dev *pdev = to_pci_dev(dev);
>  
>  	if (strict_strtoul(buf, 0, &val) < 0)
>  		return -EINVAL;
>  
> -	if (pci_is_root_bus(pdev->bus))
> -		return -EBUSY;
> -
>  	/* An attribute cannot be unregistered by one of its own methods,
>  	 * so we have to use this roundabout approach.
>  	 */
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/3] PCI Hotplug: acpiphp: grab refcount on p2p subordinate bus
  2009-03-30 16:50 ` [PATCH v2 2/3] PCI Hotplug: acpiphp: grab refcount on p2p subordinate bus Alex Chiang
@ 2009-03-31  4:37   ` Kenji Kaneshige
  0 siblings, 0 replies; 8+ messages in thread
From: Kenji Kaneshige @ 2009-03-31  4:37 UTC (permalink / raw)
  To: Alex Chiang; +Cc: jbarnes, linux-pci, linux-kernel

I confirmed this patch fix the kernel oops problem I reported.

Reviewed-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Tested-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>

By the way, /sys/bus/pci/slots/<slot> directory by acpiphp are
remaining even after the parent bridge/bus of the slots are
removed. At this point, acpiphp is working with struct pci_bus
for the already disabled pci bus. I guess some operation against
the files under /sys/bus/pci/slots/<slot> directory would cause
something problems. So I think we also need something mechanism
to unregister acpiphp slots when the parent bus is removed.

Thanks,
Kenji Kaneshige


Alex Chiang wrote:
> If a logical hot unplug (remove) is performed on a bridge claimed
> by acpiphp and then acpiphp is unloaded, we will encounter an oops.
> 
> This is because acpiphp will access the bridge's subordinate bus,
> which was released by the user's prior hot unplug.
> 
> The solution is to grab a reference on the subordinate PCI bus.
> This will prevent the bus from release until acpiphp is unloaded.
> 
> Reported-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
> Signed-off-by: Alex Chiang <achiang@hp.com>
> ---
> 
>  drivers/pci/hotplug/acpiphp_glue.c |   14 ++++++++++++++
>  1 files changed, 14 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c
> index 803d9dd..a33794d 100644
> --- a/drivers/pci/hotplug/acpiphp_glue.c
> +++ b/drivers/pci/hotplug/acpiphp_glue.c
> @@ -38,6 +38,8 @@
>   *  - The one in acpiphp_bridge has its refcount elevated by pci_get_slot()
>   *    when the bridge is scanned and it loses a refcount when the bridge
>   *    is removed.
> + *  - When a P2P bridge is present, we elevate the refcount on the subordinate
> + *    bus. It loses the refcount when the the driver unloads.
>   */
>  
>  #include <linux/init.h>
> @@ -440,6 +442,12 @@ static void add_p2p_bridge(acpi_handle *handle, struct pci_dev *pci_dev)
>  		goto err;
>  	}
>  
> +	/*
> +	 * Grab a ref to the subordinate PCI bus in case the bus is
> +	 * removed via PCI core logical hotplug. The ref pins the bus
> +	 * (which we access during module unload).
> +	 */
> +	get_device(&bridge->pci_bus->dev);
>  	spin_lock_init(&bridge->res_lock);
>  
>  	init_bridge_misc(bridge);
> @@ -619,6 +627,12 @@ static void cleanup_bridge(struct acpiphp_bridge *bridge)
>  		slot = next;
>  	}
>  
> +	/*
> +	 * Only P2P bridges have a pci_dev
> +	 */
> +	if (bridge->pci_dev)
> +		put_device(&bridge->pci_bus->dev);
> +
>  	pci_dev_put(bridge->pci_dev);
>  	list_del(&bridge->list);
>  	kfree(bridge);
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 3/3] PCI: pci_slot: grab refcount on slot's bus
  2009-03-30 16:50 ` [PATCH v2 3/3] PCI: pci_slot: grab refcount on slot's bus Alex Chiang
@ 2009-03-31  5:00   ` Kenji Kaneshige
  0 siblings, 0 replies; 8+ messages in thread
From: Kenji Kaneshige @ 2009-03-31  5:00 UTC (permalink / raw)
  To: Alex Chiang; +Cc: jbarnes, linux-pci, linux-kernel, lenb

I confirmed this patch fix the kernel oops problem I reported.

Reviewed-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Tested-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>

By the way, /sys/bus/pci/slots/<slot> directory by pci_slot are
remaining even after the parent bridge/bus of the slots are
removed. At this point, pci_slot is working with struct pci_bus
for the already disabled pci bus. This might cause something
problem. So I think we also need something mechanism to
unregister slots by pci_slot when the parent bus is removed.

Thanks,
Kenji Kaneshige


Alex Chiang wrote:
> If a logical hot unplug (remove) is performed on a physical PCI slot's
> parent bridge, and then pci_slot is unloaded, we will encounter an oops:
> 
>   [<ffffffff803a788a>] kobject_release+0x9a/0x290
>   [<ffffffff803a77f0>] ? kobject_release+0x0/0x290
>   [<ffffffff803a8ce7>] kref_put+0x37/0x80
>   [<ffffffff803a76f7>] kobject_put+0x27/0x60
>   [<ffffffff803bebcc>] ? pci_destroy_slot+0x3c/0xc0
>   [<ffffffff803bebd5>] pci_destroy_slot+0x45/0xc0
>   [<ffffffffa000f05c>] acpi_pci_slot_remove+0x5c/0x91 [pci_slot]
>   [<ffffffff8040064b>] acpi_pci_unregister_driver+0x4b/0x62
>   [<ffffffffa000f5c8>] acpi_pci_slot_exit+0x10/0x12 [pci_slot]
>   [<ffffffff80276ce1>] sys_delete_module+0x161/0x250
> 
> We need to grab a reference to the parent PCI bus, which will pin
> the bus and prevent it from being released until pci_slot is unloaded.
> 
> Cc: lenb@kernel.org
> Reported-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
> Signed-off-by: Alex Chiang <achiang@hp.com>
> ---
> 
>  drivers/acpi/pci_slot.c |    5 +++++
>  1 files changed, 5 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/acpi/pci_slot.c b/drivers/acpi/pci_slot.c
> index cd1f446..12158e0 100644
> --- a/drivers/acpi/pci_slot.c
> +++ b/drivers/acpi/pci_slot.c
> @@ -164,6 +164,8 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
>  	list_add(&slot->list, &slot_list);
>  	mutex_unlock(&slot_list_lock);
>  
> +	get_device(&pci_bus->dev);
> +
>  	dbg("pci_slot: %p, pci_bus: %x, device: %d, name: %s\n",
>  		pci_slot, pci_bus->number, device, name);
>  
> @@ -310,12 +312,15 @@ static void
>  acpi_pci_slot_remove(acpi_handle handle)
>  {
>  	struct acpi_pci_slot *slot, *tmp;
> +	struct pci_bus *pbus;
>  
>  	mutex_lock(&slot_list_lock);
>  	list_for_each_entry_safe(slot, tmp, &slot_list, list) {
>  		if (slot->root_handle == handle) {
>  			list_del(&slot->list);
> +			pbus = slot->pci_slot->bus;
>  			pci_destroy_slot(slot->pci_slot);
> +			put_device(&pbus->dev);
>  			kfree(slot);
>  		}
>  	}
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/3] PCI: allow PCI core hotplug to remove PCI root bus
  2009-03-30 16:50 ` [PATCH v2 1/3] PCI: allow PCI core hotplug to remove PCI root bus Alex Chiang
  2009-03-31  3:26   ` Kenji Kaneshige
@ 2009-04-06 18:45   ` Jesse Barnes
  1 sibling, 0 replies; 8+ messages in thread
From: Jesse Barnes @ 2009-04-06 18:45 UTC (permalink / raw)
  To: Alex Chiang; +Cc: jbarnes, linux-pci, linux-kernel

On Mon, 30 Mar 2009 10:50:09 -0600
Alex Chiang <achiang@hp.com> wrote:

> There is no reason to prevent removal of root bus devices. A
> subsequent rescan will find them just fine.
> 
> Signed-off-by: Alex Chiang <achiang@hp.com>

Applied this series, thanks.

-- 
Jesse Barnes, Intel Open Source Technology Center

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2009-04-06 18:45 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-30 16:50 [PATCH v2 0/3] PCI core logical hotplug cleanup Alex Chiang
2009-03-30 16:50 ` [PATCH v2 1/3] PCI: allow PCI core hotplug to remove PCI root bus Alex Chiang
2009-03-31  3:26   ` Kenji Kaneshige
2009-04-06 18:45   ` Jesse Barnes
2009-03-30 16:50 ` [PATCH v2 2/3] PCI Hotplug: acpiphp: grab refcount on p2p subordinate bus Alex Chiang
2009-03-31  4:37   ` Kenji Kaneshige
2009-03-30 16:50 ` [PATCH v2 3/3] PCI: pci_slot: grab refcount on slot's bus Alex Chiang
2009-03-31  5:00   ` Kenji Kaneshige

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.