diff mbox

[v6,03/30] PCI: Export busn_resource to drivers/pci

Message ID 1425868467-9667-4-git-send-email-wangyijing@huawei.com (mailing list archive)
State New, archived
Delegated to: Bjorn Helgaas
Headers show

Commit Message

Yijing Wang March 9, 2015, 2:34 a.m. UTC
Export out busn_resource. Xen pcifront module need it.

Signed-off-by: Yijing Wang <wangyijing@huawei.com>
---
 drivers/pci/pci.h   |    2 ++
 drivers/pci/probe.c |    3 ++-
 2 files changed, 4 insertions(+), 1 deletions(-)

Comments

Bjorn Helgaas March 11, 2015, 10:28 p.m. UTC | #1
On Mon, Mar 09, 2015 at 10:34:00AM +0800, Yijing Wang wrote:
> Export out busn_resource. Xen pcifront module need it.
> 
> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
> ---
>  drivers/pci/pci.h   |    2 ++
>  drivers/pci/probe.c |    3 ++-
>  2 files changed, 4 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index 4091f82..eeacab9 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -10,6 +10,8 @@ bool pcie_cap_has_lnkctl(const struct pci_dev *dev);
>  
>  /* Functions internal to the PCI core code */
>  
> +extern struct resource busn_resource;
> +
>  int pci_create_sysfs_dev_files(struct pci_dev *pdev);
>  void pci_remove_sysfs_dev_files(struct pci_dev *pdev);
>  #if !defined(CONFIG_DMI) && !defined(CONFIG_ACPI)
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index 8ef0375..b97ea81 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -17,12 +17,13 @@
>  #define CARDBUS_LATENCY_TIMER	176	/* secondary latency timer */
>  #define CARDBUS_RESERVE_BUSNR	3
>  
> -static struct resource busn_resource = {
> +struct resource busn_resource = {
>  	.name	= "PCI busn",
>  	.start	= 0,
>  	.end	= 255,
>  	.flags	= IORESOURCE_BUS,
>  };
> +EXPORT_SYMBOL(busn_resource);

I don't think this is a good idea.  We support multiple PCI domains, and
each domain has its own 0-255 bus number range.  This busn_resource is
only for domain 0 and probably should be handled in arch code instead of
the PCI core.

Right now, I think it's possible to call pci_scan_bus_parented() or
pci_scan_bus() several times for buses in different domains, and they would
all share the same busn_resource, which would cause corruption.

So it's already broken, but I don't want to make it harder to fix by
exporting this stuff.

>  
>  /* Ugh.  Need to stop exporting this to modules. */
>  LIST_HEAD(pci_root_buses);
> -- 
> 1.7.1
> 
--
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
Yijing Wang March 12, 2015, 11:42 a.m. UTC | #2
>> -static struct resource busn_resource = {
>> +struct resource busn_resource = {
>>  	.name	= "PCI busn",
>>  	.start	= 0,
>>  	.end	= 255,
>>  	.flags	= IORESOURCE_BUS,
>>  };
>> +EXPORT_SYMBOL(busn_resource);
> 
> I don't think this is a good idea.  We support multiple PCI domains, and
> each domain has its own 0-255 bus number range.  This busn_resource is
> only for domain 0 and probably should be handled in arch code instead of
> the PCI core.
> 
> Right now, I think it's possible to call pci_scan_bus_parented() or
> pci_scan_bus() several times for buses in different domains, and they would
> all share the same busn_resource, which would cause corruption.
> 
> So it's already broken, but I don't want to make it harder to fix by
> exporting this stuff.

Hi Bjorn, busn_resource may would not be shared by multi domains,

We insert bus number resource like:

pci_add_resource(&resources, &busn_resource);	
	pci_bus_insert_busn_res(root_bus, start, bus_max);	//start is the root bus number provided by arch pci host driver, bus max here == 255
		get_pci_domain_busn_res(domain)	//for root bus	//try to get a domain specific pci_domain_busn_res, if not exist, create it.
			request_resource_conflict(domain_specific_busn_res, res)   //request busn res(start, bus_max) from the pci_domain_busn_res.

So every domain has its own pci_domain_busn_res , different domain would not share the same bus number resource.

Do I understand correct ?

Thanks!
Yijing.

> 
>>  
>>  /* Ugh.  Need to stop exporting this to modules. */
>>  LIST_HEAD(pci_root_buses);
>> -- 
>> 1.7.1
>>
> 
> .
>
Bjorn Helgaas March 12, 2015, 7:32 p.m. UTC | #3
On Thu, Mar 12, 2015 at 07:42:25PM +0800, Yijing Wang wrote:
> >> -static struct resource busn_resource = {
> >> +struct resource busn_resource = {
> >>  	.name	= "PCI busn",
> >>  	.start	= 0,
> >>  	.end	= 255,
> >>  	.flags	= IORESOURCE_BUS,
> >>  };
> >> +EXPORT_SYMBOL(busn_resource);
> > 
> > I don't think this is a good idea.  We support multiple PCI domains, and
> > each domain has its own 0-255 bus number range.  This busn_resource is
> > only for domain 0 and probably should be handled in arch code instead of
> > the PCI core.
> > 
> > Right now, I think it's possible to call pci_scan_bus_parented() or
> > pci_scan_bus() several times for buses in different domains, and they would
> > all share the same busn_resource, which would cause corruption.
> > 
> > So it's already broken, but I don't want to make it harder to fix by
> > exporting this stuff.
> 
> Hi Bjorn, busn_resource may would not be shared by multi domains,
> 
> We insert bus number resource like:
> 
> pci_add_resource(&resources, &busn_resource);	
> 	pci_bus_insert_busn_res(root_bus, start, bus_max);	//start is the root bus number provided by arch pci host driver, bus max here == 255
> 		get_pci_domain_busn_res(domain)	//for root bus	//try to get a domain specific pci_domain_busn_res, if not exist, create it.
> 			request_resource_conflict(domain_specific_busn_res, res)   //request busn res(start, bus_max) from the pci_domain_busn_res.
> 
> So every domain has its own pci_domain_busn_res , different domain would not share the same bus number resource.

The intent of pci_add_resource() and passing the resulting resource list
into pci_scan_root_bus(), etc., is that the host bridge may consume any
resources described by the list.  If we pass the same resource to multiple
calls, that means the resource must be shared between the multiple host
bridges involved.  For bus numbers, that makes some sense if the platform
considers the bridges to be in the same domain, but not if they are in
different domains.

If we export busn_resource, we have no control over what domains it becomes
associated with because the domain is passed into pci_scan_root_bus() by
the caller.

Bjorn
--
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
Yijing Wang March 13, 2015, 1:57 a.m. UTC | #4
>> Hi Bjorn, busn_resource may would not be shared by multi domains,
>>
>> We insert bus number resource like:
>>
>> pci_add_resource(&resources, &busn_resource);	
>> 	pci_bus_insert_busn_res(root_bus, start, bus_max);	//start is the root bus number provided by arch pci host driver, bus max here == 255
>> 		get_pci_domain_busn_res(domain)	//for root bus	//try to get a domain specific pci_domain_busn_res, if not exist, create it.
>> 			request_resource_conflict(domain_specific_busn_res, res)   //request busn res(start, bus_max) from the pci_domain_busn_res.
>>
>> So every domain has its own pci_domain_busn_res , different domain would not share the same bus number resource.
> 
> The intent of pci_add_resource() and passing the resulting resource list
> into pci_scan_root_bus(), etc., is that the host bridge may consume any
> resources described by the list.  If we pass the same resource to multiple
> calls, that means the resource must be shared between the multiple host
> bridges involved.  For bus numbers, that makes some sense if the platform
> considers the bridges to be in the same domain, but not if they are in
> different domains.
> 
> If we export busn_resource, we have no control over what domains it becomes
> associated with because the domain is passed into pci_scan_root_bus() by
> the caller.

Agree, I will drop this patch, thanks!

> 
> Bjorn
> 
> .
>
diff mbox

Patch

diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 4091f82..eeacab9 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -10,6 +10,8 @@  bool pcie_cap_has_lnkctl(const struct pci_dev *dev);
 
 /* Functions internal to the PCI core code */
 
+extern struct resource busn_resource;
+
 int pci_create_sysfs_dev_files(struct pci_dev *pdev);
 void pci_remove_sysfs_dev_files(struct pci_dev *pdev);
 #if !defined(CONFIG_DMI) && !defined(CONFIG_ACPI)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 8ef0375..b97ea81 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -17,12 +17,13 @@ 
 #define CARDBUS_LATENCY_TIMER	176	/* secondary latency timer */
 #define CARDBUS_RESERVE_BUSNR	3
 
-static struct resource busn_resource = {
+struct resource busn_resource = {
 	.name	= "PCI busn",
 	.start	= 0,
 	.end	= 255,
 	.flags	= IORESOURCE_BUS,
 };
+EXPORT_SYMBOL(busn_resource);
 
 /* Ugh.  Need to stop exporting this to modules. */
 LIST_HEAD(pci_root_buses);