[PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

Subsystems: agpgart driver, linux for powerpc (32-bit and 64-bit), megaraid scsi/sas drivers, parisc architecture, pci subsystem, scsi subsystem, sparc + ultrasparc (sparc/sparc64), the rest

STALE4833d

Revision v2 of 2 in this series.

15 messages, 4 authors, 2013-05-15 · open the first message on its own page

[PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Jiang Liu <hidden>
Date: 2013-05-13 16:09:13

From: Gu Zheng <redacted>

<marker to prevent gmail from removing below "From:">
From: Gu Zheng <redacted>

Use the new pci_alloc_dev(bus) to replace the existing using of
alloc_pci_dev(void).

v2:
  Follow Bjorn's correction to move pci_bus_put() to
  pci_release_dev() instead.

Signed-off-by: Gu Zheng <redacted>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <redacted>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: David Airlie <redacted>
Cc: Neela Syam Kolli <redacted>
Cc: "James E.J. Bottomley" <redacted>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-kernel@vger.kernel.org
Cc: sparclinux@vger.kernel.org
Cc: linux-pci@vger.kernel.org
Cc: linux-scsi@vger.kernel.org
Signed-off-by: Jiang Liu <redacted>
---
 arch/powerpc/kernel/pci_of_scan.c | 3 +--
 arch/sparc/kernel/pci.c           | 3 +--
 drivers/char/agp/alpha-agp.c      | 2 +-
 drivers/char/agp/parisc-agp.c     | 2 +-
 drivers/pci/iov.c                 | 8 +++++---
 drivers/pci/probe.c               | 4 ++--
 drivers/scsi/megaraid.c           | 2 +-
 7 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/arch/powerpc/kernel/pci_of_scan.c b/arch/powerpc/kernel/pci_of_scan.c
index 2a67e9b..24d01c4 100644
--- a/arch/powerpc/kernel/pci_of_scan.c
+++ b/arch/powerpc/kernel/pci_of_scan.c
@@ -128,7 +128,7 @@ struct pci_dev *of_create_pci_dev(struct device_node *node,
 	const char *type;
 	struct pci_slot *slot;
 
-	dev = alloc_pci_dev();
+	dev = pci_alloc_dev(bus);
 	if (!dev)
 		return NULL;
 	type = of_get_property(node, "device_type", NULL);
@@ -137,7 +137,6 @@ struct pci_dev *of_create_pci_dev(struct device_node *node,
 
 	pr_debug("    create device, devfn: %x, type: %s\n", devfn, type);
 
-	dev->bus = bus;
 	dev->dev.of_node = of_node_get(node);
 	dev->dev.parent = bus->bridge;
 	dev->dev.bus = &pci_bus_type;
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c
index baf4366..e5871fb 100644
--- a/arch/sparc/kernel/pci.c
+++ b/arch/sparc/kernel/pci.c
@@ -254,7 +254,7 @@ static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
 	const char *type;
 	u32 class;
 
-	dev = alloc_pci_dev();
+	dev = pci_alloc_dev(bus);
 	if (!dev)
 		return NULL;
 
@@ -281,7 +281,6 @@ static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
 		printk("    create device, devfn: %x, type: %s\n",
 		       devfn, type);
 
-	dev->bus = bus;
 	dev->sysdata = node;
 	dev->dev.parent = bus->bridge;
 	dev->dev.bus = &pci_bus_type;
diff --git a/drivers/char/agp/alpha-agp.c b/drivers/char/agp/alpha-agp.c
index dd84af4..199b8e9 100644
--- a/drivers/char/agp/alpha-agp.c
+++ b/drivers/char/agp/alpha-agp.c
@@ -174,7 +174,7 @@ alpha_core_agp_setup(void)
 	/*
 	 * Build a fake pci_dev struct
 	 */
-	pdev = alloc_pci_dev();
+	pdev = pci_alloc_dev(NULL);
 	if (!pdev)
 		return -ENOMEM;
 	pdev->vendor = 0xffff;
diff --git a/drivers/char/agp/parisc-agp.c b/drivers/char/agp/parisc-agp.c
index 94821ab..bf5d247 100644
--- a/drivers/char/agp/parisc-agp.c
+++ b/drivers/char/agp/parisc-agp.c
@@ -333,7 +333,7 @@ parisc_agp_setup(void __iomem *ioc_hpa, void __iomem *lba_hpa)
 	struct agp_bridge_data *bridge;
 	int error = 0;
 
-	fake_bridge_dev = alloc_pci_dev();
+	fake_bridge_dev = pci_alloc_dev(NULL);
 	if (!fake_bridge_dev) {
 		error = -ENOMEM;
 		goto fail;
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index ee599f2..24134cd 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -75,18 +75,20 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset)
 	struct pci_dev *virtfn;
 	struct resource *res;
 	struct pci_sriov *iov = dev->sriov;
+	struct pci_bus *bus;
 
-	virtfn = alloc_pci_dev();
+	virtfn = pci_alloc_dev(NULL);
 	if (!virtfn)
 		return -ENOMEM;
 
 	mutex_lock(&iov->dev->sriov->lock);
-	virtfn->bus = virtfn_add_bus(dev->bus, virtfn_bus(dev, id));
-	if (!virtfn->bus) {
+	bus = virtfn_add_bus(dev->bus, virtfn_bus(dev, id));
+	if (!bus) {
 		kfree(virtfn);
 		mutex_unlock(&iov->dev->sriov->lock);
 		return -ENOMEM;
 	}
+	virtfn->bus = pci_bus_get(bus);
 	virtfn->devfn = virtfn_devfn(dev, id);
 	virtfn->vendor = dev->vendor;
 	pci_read_config_word(dev, iov->pos + PCI_SRIOV_VF_DID, &virtfn->device);
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 4f0bc0a..bc075a3 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1131,6 +1131,7 @@ static void pci_release_dev(struct device *dev)
 	struct pci_dev *pci_dev;
 
 	pci_dev = to_pci_dev(dev);
+	pci_bus_put(pci_dev->bus);
 	pci_release_capabilities(pci_dev);
 	pci_release_of_node(pci_dev);
 	kfree(pci_dev);
@@ -1269,11 +1270,10 @@ static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
 	if (!pci_bus_read_dev_vendor_id(bus, devfn, &l, 60*1000))
 		return NULL;
 
-	dev = alloc_pci_dev();
+	dev = pci_alloc_dev(bus);
 	if (!dev)
 		return NULL;
 
-	dev->bus = bus;
 	dev->devfn = devfn;
 	dev->vendor = l & 0xffff;
 	dev->device = (l >> 16) & 0xffff;
diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
index 9504ec0..e1660ca 100644
--- a/drivers/scsi/megaraid.c
+++ b/drivers/scsi/megaraid.c
@@ -2025,7 +2025,7 @@ megaraid_abort_and_reset(adapter_t *adapter, Scsi_Cmnd *cmd, int aor)
 static inline int
 make_local_pdev(adapter_t *adapter, struct pci_dev **pdev)
 {
-	*pdev = alloc_pci_dev();
+	*pdev = pci_alloc_dev(NULL);
 
 	if( *pdev == NULL ) return -1;
 
-- 
1.8.1.2

Re: [PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Yinghai Lu <yinghai@kernel.org>
Date: 2013-05-13 17:23:32

On Mon, May 13, 2013 at 9:08 AM, Jiang Liu [off-list ref] wrote:
quoted hunk
From: Gu Zheng <redacted>
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 4f0bc0a..bc075a3 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1131,6 +1131,7 @@ static void pci_release_dev(struct device *dev)
        struct pci_dev *pci_dev;

        pci_dev = to_pci_dev(dev);
+       pci_bus_put(pci_dev->bus);
        pci_release_capabilities(pci_dev);
        pci_release_of_node(pci_dev);
        kfree(pci_dev);
@@ -1269,11 +1270,10 @@ static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
        if (!pci_bus_read_dev_vendor_id(bus, devfn, &l, 60*1000))
                return NULL;

-       dev = alloc_pci_dev();
+       dev = pci_alloc_dev(bus);
        if (!dev)
                return NULL;

-       dev->bus = bus;
        dev->devfn = devfn;
        dev->vendor = l & 0xffff;
        dev->device = (l >> 16) & 0xffff;
in pci_setup_device() fail path, it release the ref to that bus.

Yinghai

Re: [PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Gu Zheng <hidden>
Date: 2013-05-14 08:29:18

On 05/14/2013 01:23 AM, Yinghai Lu wrote:
On Mon, May 13, 2013 at 9:08 AM, Jiang Liu [off-list ref] wrote:
quoted
From: Gu Zheng <redacted>
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 4f0bc0a..bc075a3 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1131,6 +1131,7 @@ static void pci_release_dev(struct device *dev)
        struct pci_dev *pci_dev;

        pci_dev = to_pci_dev(dev);
+       pci_bus_put(pci_dev->bus);
        pci_release_capabilities(pci_dev);
        pci_release_of_node(pci_dev);
        kfree(pci_dev);
@@ -1269,11 +1270,10 @@ static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
        if (!pci_bus_read_dev_vendor_id(bus, devfn, &l, 60*1000))
                return NULL;

-       dev = alloc_pci_dev();
+       dev = pci_alloc_dev(bus);
        if (!dev)
                return NULL;

-       dev->bus = bus;
        dev->devfn = devfn;
        dev->vendor = l & 0xffff;
        dev->device = (l >> 16) & 0xffff;
in pci_setup_device() fail path, it release the ref to that bus.
Yes, you're right, we need to release the bus' ref if pci_setup_device() failed.
Thanks for your correction.:)

Best regards,
Gu
Yinghai

Re: [PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Liu Jiang <hidden>
Date: 2013-05-14 14:59:14

On 05/14/2013 04:26 PM, Gu Zheng wrote:
On 05/14/2013 01:23 AM, Yinghai Lu wrote:
quoted
On Mon, May 13, 2013 at 9:08 AM, Jiang Liu [off-list ref] wrote:
quoted
From: Gu Zheng <redacted>
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 4f0bc0a..bc075a3 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1131,6 +1131,7 @@ static void pci_release_dev(struct device *dev)
         struct pci_dev *pci_dev;

         pci_dev = to_pci_dev(dev);
+       pci_bus_put(pci_dev->bus);
         pci_release_capabilities(pci_dev);
         pci_release_of_node(pci_dev);
         kfree(pci_dev);
@@ -1269,11 +1270,10 @@ static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
         if (!pci_bus_read_dev_vendor_id(bus, devfn, &l, 60*1000))
                 return NULL;

-       dev = alloc_pci_dev();
+       dev = pci_alloc_dev(bus);
         if (!dev)
                 return NULL;

-       dev->bus = bus;
         dev->devfn = devfn;
         dev->vendor = l & 0xffff;
         dev->device = (l >> 16) & 0xffff;
in pci_setup_device() fail path, it release the ref to that bus.
Yes, you're right, we need to release the bus' ref if pci_setup_device() failed.
Hi Zheng,
     I suggest to use pci_release_dev() instead because it also needs to 
release OF related resources.
I will update it in next version.
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index bc075a3..2ac6338 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1281,7 +1281,7 @@ static struct pci_dev *pci_scan_device(struct 
pci_bus *bus
         pci_set_of_node(dev);

         if (pci_setup_device(dev)) {
-               kfree(dev);
+               pci_release_dev(&dev->dev);
                 return NULL;
         }

hanks for your correction.:)

Best regards,
Gu
quoted
Yinghai

Re: [PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Yinghai Lu <yinghai@kernel.org>
Date: 2013-05-14 15:10:37

On Tue, May 14, 2013 at 7:59 AM, Liu Jiang [off-list ref] wrote:
quoted hunk
On 05/14/2013 04:26 PM, Gu Zheng wrote:
    I suggest to use pci_release_dev() instead because it also needs to
release OF related resources.
I will update it in next version.
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index bc075a3..2ac6338 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1281,7 +1281,7 @@ static struct pci_dev *pci_scan_device(struct pci_bus
*bus
        pci_set_of_node(dev);

        if (pci_setup_device(dev)) {
-               kfree(dev);
+               pci_release_dev(&dev->dev);
                return NULL;
no, should move pci_set_of_node calling into pci_setup_device.

Yinghai

Re: [PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Liu Jiang <hidden>
Date: 2013-05-14 16:57:36

On Tue 14 May 2013 11:10:33 PM CST, Yinghai Lu wrote:
On Tue, May 14, 2013 at 7:59 AM, Liu Jiang [off-list ref] wrote:
quoted
On 05/14/2013 04:26 PM, Gu Zheng wrote:
     I suggest to use pci_release_dev() instead because it also needs to
release OF related resources.
I will update it in next version.
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index bc075a3..2ac6338 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1281,7 +1281,7 @@ static struct pci_dev *pci_scan_device(struct pci_bus
*bus
         pci_set_of_node(dev);

         if (pci_setup_device(dev)) {
-               kfree(dev);
+               pci_release_dev(&dev->dev);
                 return NULL;
no, should move pci_set_of_node calling into pci_setup_device.

Yinghai
I'm not sure whether we should call pci_set_of_node() for SR-IOV 
devices too,
any suggestions here?

Re: [PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Yinghai Lu <yinghai@kernel.org>
Date: 2013-05-14 18:52:55

On Tue, May 14, 2013 at 9:57 AM, Liu Jiang [off-list ref] wrote:
On Tue 14 May 2013 11:10:33 PM CST, Yinghai Lu wrote:
quoted
On Tue, May 14, 2013 at 7:59 AM, Liu Jiang [off-list ref] wrote:
quoted
On 05/14/2013 04:26 PM, Gu Zheng wrote:
     I suggest to use pci_release_dev() instead because it also needs to
release OF related resources.
I will update it in next version.
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index bc075a3..2ac6338 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1281,7 +1281,7 @@ static struct pci_dev *pci_scan_device(struct
pci_bus
*bus
         pci_set_of_node(dev);

         if (pci_setup_device(dev)) {
-               kfree(dev);
+               pci_release_dev(&dev->dev);
                 return NULL;

no, should move pci_set_of_node calling into pci_setup_device.

Yinghai

I'm not sure whether we should call pci_set_of_node() for SR-IOV devices
too,
any suggestions here?
or just move down pci_set_of_node after pci_setup_device?

anyway that is another bug.

Yinghai

Re: [PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Liu Jiang <hidden>
Date: 2013-05-15 14:39:28

On Wed 15 May 2013 02:52:51 AM CST, Yinghai Lu wrote:
On Tue, May 14, 2013 at 9:57 AM, Liu Jiang [off-list ref] wrote:
quoted
On Tue 14 May 2013 11:10:33 PM CST, Yinghai Lu wrote:
quoted
On Tue, May 14, 2013 at 7:59 AM, Liu Jiang [off-list ref] wrote:
quoted
On 05/14/2013 04:26 PM, Gu Zheng wrote:
      I suggest to use pci_release_dev() instead because it also needs to
release OF related resources.
I will update it in next version.
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index bc075a3..2ac6338 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1281,7 +1281,7 @@ static struct pci_dev *pci_scan_device(struct
pci_bus
*bus
          pci_set_of_node(dev);

          if (pci_setup_device(dev)) {
-               kfree(dev);
+               pci_release_dev(&dev->dev);
                  return NULL;

no, should move pci_set_of_node calling into pci_setup_device.

Yinghai

I'm not sure whether we should call pci_set_of_node() for SR-IOV devices
too,
any suggestions here?
or just move down pci_set_of_node after pci_setup_device?

anyway that is another bug.

Yinghai
I'm not familiar with the OF logic and can't make sure whether 
pci_setup_device()
has dependency on dev->of_node. Feel it's more safe to call 
pci_release_of_node()
on failing path instead of tuning call-site of pci_set_of_node().

Re: [PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Yinghai Lu <yinghai@kernel.org>
Date: 2013-05-15 14:43:07

On Wed, May 15, 2013 at 7:39 AM, Liu Jiang [off-list ref] wrote:
On Wed 15 May 2013 02:52:51 AM CST, Yinghai Lu wrote:
quoted
On Tue, May 14, 2013 at 9:57 AM, Liu Jiang [off-list ref] wrote:
quoted
On Tue 14 May 2013 11:10:33 PM CST, Yinghai Lu wrote:
quoted

On Tue, May 14, 2013 at 7:59 AM, Liu Jiang [off-list ref] wrote:
quoted

On 05/14/2013 04:26 PM, Gu Zheng wrote:
      I suggest to use pci_release_dev() instead because it also needs
to
release OF related resources.
I will update it in next version.
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index bc075a3..2ac6338 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1281,7 +1281,7 @@ static struct pci_dev *pci_scan_device(struct
pci_bus
*bus
          pci_set_of_node(dev);

          if (pci_setup_device(dev)) {
-               kfree(dev);
+               pci_release_dev(&dev->dev);
                  return NULL;


no, should move pci_set_of_node calling into pci_setup_device.

Yinghai


I'm not sure whether we should call pci_set_of_node() for SR-IOV devices
too,
any suggestions here?

or just move down pci_set_of_node after pci_setup_device?

anyway that is another bug.
I'm not familiar with the OF logic and can't make sure whether
pci_setup_device()
has dependency on dev->of_node. Feel it's more safe to call
pci_release_of_node()
on failing path instead of tuning call-site of pci_set_of_node().
that is another bug, let of guy handle it.

Yinghai

Re: [PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Liu Jiang <hidden>
Date: 2013-05-15 14:46:21

On Wed 15 May 2013 10:43:02 PM CST, Yinghai Lu wrote:
On Wed, May 15, 2013 at 7:39 AM, Liu Jiang [off-list ref] wrote:
quoted
On Wed 15 May 2013 02:52:51 AM CST, Yinghai Lu wrote:
quoted
On Tue, May 14, 2013 at 9:57 AM, Liu Jiang [off-list ref] wrote:
quoted
On Tue 14 May 2013 11:10:33 PM CST, Yinghai Lu wrote:
quoted

On Tue, May 14, 2013 at 7:59 AM, Liu Jiang [off-list ref] wrote:
quoted

On 05/14/2013 04:26 PM, Gu Zheng wrote:
       I suggest to use pci_release_dev() instead because it also needs
to
release OF related resources.
I will update it in next version.
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index bc075a3..2ac6338 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1281,7 +1281,7 @@ static struct pci_dev *pci_scan_device(struct
pci_bus
*bus
           pci_set_of_node(dev);

           if (pci_setup_device(dev)) {
-               kfree(dev);
+               pci_release_dev(&dev->dev);
                   return NULL;


no, should move pci_set_of_node calling into pci_setup_device.

Yinghai


I'm not sure whether we should call pci_set_of_node() for SR-IOV devices
too,
any suggestions here?

or just move down pci_set_of_node after pci_setup_device?

anyway that is another bug.
quoted
I'm not familiar with the OF logic and can't make sure whether
pci_setup_device()
has dependency on dev->of_node. Feel it's more safe to call
pci_release_of_node()
on failing path instead of tuning call-site of pci_set_of_node().
that is another bug, let of guy handle it.

Yinghai
Hi Yinghai,
       I don't know any OF exports, could you please help to CC
some OF experts?
Thanks,
Gerry

Re: [PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Yinghai Lu <yinghai@kernel.org>
Date: 2013-05-15 14:58:48

On Wed, May 15, 2013 at 7:46 AM, Liu Jiang [off-list ref] wrote:
On Wed 15 May 2013 10:43:02 PM CST, Yinghai Lu wrote:
quoted
quoted
that is another bug, let of guy handle it.

Yinghai
Hi Yinghai,
      I don't know any OF exports, could you please help to CC
some OF experts?
powerpc and sparc are using that.

Ben,

in drivers/pci/probe.c::pci_scan_device() there is

        pci_set_of_node(dev);

        if (pci_setup_device(dev)) {
                kfree(dev);
                return NULL;
        }

so if pci_setup_device fails, there is one dev reference is not release.

please check you can just move down pci_set_of_node down after that
failing path, like


        if (pci_setup_device(dev)) {
                kfree(dev);
                return NULL;
        }

        pci_set_of_node(dev);

Yinghai

Re: [PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2013-05-15 21:31:34

On Wed, 2013-05-15 at 22:46 +0800, Liu Jiang wrote:
       I don't know any OF exports, could you please help to CC
some OF experts?
I wrote that code I think. Sorry, I've missed the beginning of the
thread, what is the problem ?

Cheers,
Ben.

Re: [PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2013-05-15 21:33:03

On Wed, 2013-05-15 at 07:58 -0700, Yinghai Lu wrote:
Ben,

in drivers/pci/probe.c::pci_scan_device() there is

        pci_set_of_node(dev);

        if (pci_setup_device(dev)) {
                kfree(dev);
                return NULL;
        }

so if pci_setup_device fails, there is one dev reference is not release.

please check you can just move down pci_set_of_node down after that
failing path, like


        if (pci_setup_device(dev)) {
                kfree(dev);
                return NULL;
        }

        pci_set_of_node(dev);
No, we want the OF node set when we run the quirks, we intentionally do
that early, the right thing to do is to to call pci_release_of_node()
in the error path (it's safe to call even if the node is NULL).

Cheers,
Ben.

Re: [PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Yinghai Lu <yinghai@kernel.org>
Date: 2013-05-15 21:52:26

On Wed, May 15, 2013 at 2:32 PM, Benjamin Herrenschmidt
[off-list ref] wrote:
On Wed, 2013-05-15 at 07:58 -0700, Yinghai Lu wrote:
quoted
Ben,

in drivers/pci/probe.c::pci_scan_device() there is

        pci_set_of_node(dev);

        if (pci_setup_device(dev)) {
                kfree(dev);
                return NULL;
        }

so if pci_setup_device fails, there is one dev reference is not release.

please check you can just move down pci_set_of_node down after that
failing path, like


        if (pci_setup_device(dev)) {
                kfree(dev);
                return NULL;
        }

        pci_set_of_node(dev);
No, we want the OF node set when we run the quirks, we intentionally do
that early, the right thing to do is to to call pci_release_of_node()
in the error path (it's safe to call even if the node is NULL).
Good.

We have two options.
1. can you please submit one complete patch, and get it merged into v3.10.
2. put it together with pci_alloc_dev patchset towards to v3.11?

Thanks

Yinghai

Re: [PATCH v2, part 1 3/9] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) instead

From: Liu Jiang <hidden>
Date: 2013-05-15 23:47:12

On Thu 16 May 2013 05:29:31 AM CST, Benjamin Herrenschmidt wrote:
On Wed, 2013-05-15 at 22:46 +0800, Liu Jiang wrote:
quoted
        I don't know any OF exports, could you please help to CC
some OF experts?
I wrote that code I think. Sorry, I've missed the beginning of the
thread, what is the problem ?

Cheers,
Ben.
Hi,
     Just found a little memory leak issue that we should call 
pci_release_of_node()
on error recovery path in function pci_scan_device().
        pci_set_of_node(dev);

        if (pci_setup_device(dev)) {
                kfree(dev);
                return NULL;
        }

Regards!
Gerry
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help