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

2013-05-15 Thread Liu Jiang

On Wed 15 May 2013 02:52:51 AM CST, Yinghai Lu wrote:

On Tue, May 14, 2013 at 9:57 AM, Liu Jiang liu...@gmail.com wrote:

On Tue 14 May 2013 11:10:33 PM CST, Yinghai Lu wrote:


On Tue, May 14, 2013 at 7:59 AM, Liu Jiang liu...@gmail.com wrote:


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().
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


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

2013-05-15 Thread Yinghai Lu
On Wed, May 15, 2013 at 7:39 AM, Liu Jiang liu...@gmail.com wrote:
 On Wed 15 May 2013 02:52:51 AM CST, Yinghai Lu wrote:

 On Tue, May 14, 2013 at 9:57 AM, Liu Jiang liu...@gmail.com wrote:

 On Tue 14 May 2013 11:10:33 PM CST, Yinghai Lu wrote:


 On Tue, May 14, 2013 at 7:59 AM, Liu Jiang liu...@gmail.com wrote:


 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
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


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

2013-05-15 Thread Liu Jiang

On Wed 15 May 2013 10:43:02 PM CST, Yinghai Lu wrote:

On Wed, May 15, 2013 at 7:39 AM, Liu Jiang liu...@gmail.com wrote:

On Wed 15 May 2013 02:52:51 AM CST, Yinghai Lu wrote:


On Tue, May 14, 2013 at 9:57 AM, Liu Jiang liu...@gmail.com wrote:


On Tue 14 May 2013 11:10:33 PM CST, Yinghai Lu wrote:



On Tue, May 14, 2013 at 7:59 AM, Liu Jiang liu...@gmail.com wrote:



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

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

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


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

2013-05-15 Thread Yinghai Lu
On Wed, May 15, 2013 at 7:46 AM, Liu Jiang liu...@gmail.com wrote:
 On Wed 15 May 2013 10:43:02 PM CST, Yinghai Lu wrote:


 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
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


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

2013-05-15 Thread Benjamin Herrenschmidt
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.


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


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

2013-05-15 Thread Benjamin Herrenschmidt
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.



___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


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

2013-05-15 Thread Yinghai Lu
On Wed, May 15, 2013 at 2:32 PM, Benjamin Herrenschmidt
b...@kernel.crashing.org wrote:
 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).


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
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


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

2013-05-15 Thread Liu Jiang

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:

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

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


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

2013-05-14 Thread Liu Jiang

On 05/14/2013 04:26 PM, Gu Zheng wrote:

On 05/14/2013 01:23 AM, Yinghai Lu wrote:


On Mon, May 13, 2013 at 9:08 AM, Jiang Liu liu...@gmail.com wrote:

From: Gu Zheng guz.f...@cn.fujitsu.com
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  0x;
 dev-device = (l  16)  0x;

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


Yinghai





___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


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

2013-05-14 Thread Yinghai Lu
On Tue, May 14, 2013 at 7:59 AM, Liu Jiang liu...@gmail.com wrote:
 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
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


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

2013-05-14 Thread Liu Jiang

On Tue 14 May 2013 11:10:33 PM CST, Yinghai Lu wrote:

On Tue, May 14, 2013 at 7:59 AM, Liu Jiang liu...@gmail.com wrote:

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?
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


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

2013-05-14 Thread Yinghai Lu
On Tue, May 14, 2013 at 9:57 AM, Liu Jiang liu...@gmail.com wrote:
 On Tue 14 May 2013 11:10:33 PM CST, Yinghai Lu wrote:

 On Tue, May 14, 2013 at 7:59 AM, Liu Jiang liu...@gmail.com wrote:

 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
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


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

2013-05-14 Thread Gu Zheng
On 05/14/2013 01:23 AM, Yinghai Lu wrote:

 On Mon, May 13, 2013 at 9:08 AM, Jiang Liu liu...@gmail.com wrote:
 From: Gu Zheng guz.f...@cn.fujitsu.com
 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  0x;
 dev-device = (l  16)  0x;
 
 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
 


From 7add6d9e70919b95be2debde2f58fc31d26c75bf Mon Sep 17 00:00:00 2001
From: Gu Zheng guz.f...@cn.fujitsu.com
Date: Tue, 14 May 2013 16:11:07 +0800
Subject: [PATCH v3] PCI: Convert alloc_pci_dev(void) to pci_alloc_dev(bus) 
instead

v3:
  Follow Yinghai's correction to release the bus' ref
  in pci_setup_device() fail path.

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

Signed-off-by: Gu Zheng guz.f...@cn.fujitsu.com
---
 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   |5 +++--
 drivers/scsi/megaraid.c   |2 +-
 7 files changed, 13 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 = 0x;
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 c93071d..2652ca0 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 

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

2013-05-13 Thread Jiang Liu
From: Gu Zheng guz.f...@cn.fujitsu.com

marker to prevent gmail from removing below From:
From: Gu Zheng guz.f...@cn.fujitsu.com

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 guz.f...@cn.fujitsu.com
Cc: Benjamin Herrenschmidt b...@kernel.crashing.org
Cc: Paul Mackerras pau...@samba.org
Cc: David S. Miller da...@davemloft.net
Cc: David Airlie airl...@linux.ie
Cc: Neela Syam Kolli megaraidli...@lsi.com
Cc: James E.J. Bottomley jbottom...@parallels.com
Cc: Yinghai Lu ying...@kernel.org
Cc: Greg Kroah-Hartman gre...@linuxfoundation.org
Cc: Andrew Morton a...@linux-foundation.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-ker...@vger.kernel.org
Cc: sparcli...@vger.kernel.org
Cc: linux-...@vger.kernel.org
Cc: linux-s...@vger.kernel.org
Signed-off-by: Jiang Liu jiang@huawei.com
---
 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 = 0x;
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 

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

2013-05-13 Thread Yinghai Lu
On Mon, May 13, 2013 at 9:08 AM, Jiang Liu liu...@gmail.com wrote:
 From: Gu Zheng guz.f...@cn.fujitsu.com
 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  0x;
 dev-device = (l  16)  0x;

in pci_setup_device() fail path, it release the ref to that bus.

Yinghai
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev