PCI: fix cardbus and sriov regressions
v3 cover PCI: fix cardbus and sriov regressions
The following patch-set fixes regressions caused by:
the commit "PCI: update bridge resources to get more big ranges when allocating space (again)"
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=da7822e5ad71ec9b745b412639f1e5e0ba795a20
patch 1/5: fix calculation of additional resource size for hotplug bridges patch 2/5: ability to resize assigned pci-resource
patch 3/5: make SRIOV BARs resources optional
patch 4/5: make cardbus bridge resources optional
patch 5/5: code and terminology cleanup
The regression was caused on some platforms with limited i/o and memory resources, the optional resources were allocated ahead of required resources, thus starving the latter. The patchset ensures that all the required resources are satisfied before any optional resources are satisfied.
Changelog: patch 2/5 is split into two patches. The changes corresponding to
resource.c is upstream; commit 23c570a67448e803408191f529ed9a83fd34a25a. This patch has the remaining changes.
PATCH v3 1/5 PCI: honor child buses add_size in hot plug configuration
From: Yinghai Lu <[email protected]>
git commit c8adf9a3e873eddaaec11ac410a99ef6b9656938
"PCI: pre-allocate additional resources to devices only after
successful allocation of essential resources."
fails to take into consideration the optional-resources needed by children devices while calculating the optional-resource needed by the bridge.
This can be a problem on some setup. For example, if a hotplug bridge has 8 children hotplug bridges, the bridge should have enough resources to accomodate the hotplug requirements for each of its children hotplug bridges. Currently this is not the case.
This patch fixes the problem.
--- drivers/pci/setup-bus.c | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+), 0 deletions(-)
drivers/pci/setup-bus.c +26 -0
@@ -543,6 +543,20 @@ static resource_size_t calculate_memsize(resource_size_t size,return size; } +static resource_size_t get_res_add_size (struct resource_list_x *add_head, +struct resource *res) +{ +struct resource_list_x *list; + +/* check if it is in add_head list */ +for (list = add_head->next; list && list->res != res; + list = list->next); +if (list) +return list->add_size; + +return 0 ; +} +/** * pbus_size_io() - size the io window of a given bus *
@@ -562,6 +576,7 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size,struct pci_dev *dev;struct resource *b_res =find_free_bus_resource (bus,IORESOURCE_IO );unsigned long size =0 , size0 =0 , size1 =0 ; +resource_size_t children_add_size =0 ;if (!b_res)return ;
@@ -582,10 +597,15 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size, size += r_size; else size1 += r_size; + +if (add_head) + children_add_size +=get_res_add_size (add_head, r); } } size0 =calculate_iosize (size, min_size, size1,resource_size (b_res),4096 ); +if (children_add_size > add_size) + add_size = children_add_size; size1 = (!add_head || (add_head && !add_size)) ? size0 :calculate_iosize (size, min_size+add_size, size1,resource_size (b_res),4096 );
@@ -627,6 +647,7 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,int order, max_order;struct resource *b_res =find_free_bus_resource (bus, type);unsigned int mem64_mask =0 ; +resource_size_t children_add_size =0 ;if (!b_res)return 0 ;
@@ -668,6 +689,9 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,if (order > max_order) max_order = order; mem64_mask &= r->flags &IORESOURCE_MEM_64 ; + +if (add_head) + children_add_size +=get_res_add_size (add_head, r); } } align =0 ;
@@ -684,6 +708,8 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, align += aligns[order]; } size0 =calculate_memsize (size, min_size,0 ,resource_size (b_res), min_align); +if (children_add_size > add_size) + add_size = children_add_size; size1 = (!add_head || (add_head && !add_size)) ? size0 :calculate_memsize (size, min_size+add_size,0 ,resource_size (b_res), min_align);
Signature · 1 line
1.7.4.1
Re: [PATCH 1/5 v3] PCI: honor child buses add_size in hot plug configuration
Quoted 9 lines · On Mon, 25 Jul 2011 13:08:38 -0700 Ram Pai <[email protected]> wrote:
From: Yinghai Lu <[email protected]>
git commit
c8adf9a3e873eddaaec11ac410a99ef6b9656938
"PCI: pre-allocate additional resources to devices only after
successful allocation of essential resources."fails to take into consideration the optional-resources needed by children devices while calculating the optional-resource needed by the bridge.
Quoted 6 lines
This can be a problem on some setup. For example, if a hotplug bridge has 8 children hotplug bridges, the bridge should have enough resources to accomodate the hotplug requirements for each of its children hotplug bridges. Currently this is not the case.
This patch fixes the problem.
Just pulled these guys into my for-linus branch. They should be safe since they're behind the new =realloc param, but please test.
Thanks,
Signature · 1 line
Jesse Barnes, Intel Open Source Technology Center
PATCH v3 2/5 PCI : ability to relocate assigned pci-resources
In reply to Ram PaiCurrently pci-bridges are allocated enough resources to satisfy their immediate requirements. Any additional resource-requests fail if additional free space, contiguous to the one already allocated, is not available. This behavior is not reasonable since sufficient contiguous resources, that can satisfy the request, are available at a different location.
This patch provides the ability to expand and relocate a allocated resource.
v2: Changelog: Fixed size calculation in pci_reassign_resource()
v3: Changelog : Split this patch. The resource.c changes are already
upstream. All the pci driver changes are in here.
--- drivers/pci/setup-bus.c | 27 +++++--- drivers/pci/setup-res.c | 152 +++++++++++++++++++++++++++++------------------ include/linux/pci.h | 1 + 3 files changed, 113 insertions(+), 67 deletions(-)
drivers/pci/setup-bus.c +17 -10
@@ -34,6 +34,7 @@ struct resource_list_x {resource_size_t start;resource_size_t end;resource_size_t add_size; +resource_size_t min_align;unsigned long flags; };
@@ -65,7 +66,7 @@ void pci_realloc(void)*/ static void add_to_list (struct resource_list_x *head,struct pci_dev *dev,struct resource *res, -resource_size_t add_size) +resource_size_t add_size,resource_size_t min_align) {struct resource_list_x *list = head;struct resource_list_x *ln = list->next;
@@ -84,13 +85,16 @@ static void add_to_list(struct resource_list_x *head, tmp->end = res->end; tmp->flags = res->flags; tmp->add_size = add_size; + tmp->min_align = min_align; list->next = tmp; }static void add_to_failed_list (struct resource_list_x *head,struct pci_dev *dev,struct resource *res) { -add_to_list (head, dev, res,0 ); +add_to_list (head, dev, res, +0 /* dont care */ , +0 /* dont care */ ); } static void __dev_sort_resources(struct pci_dev *dev,
@@ -159,13 +163,16 @@ static void adjust_resources_sorted(struct resource_list_x *add_head, idx = res - &list->dev->resource[0 ]; add_size=list->add_size; -if (!resource_size (res) && add_size) { - res->end = res->start + add_size -1 ; -if (pci_assign_resource (list->dev, idx)) +if (!resource_size (res)) { + res->end = res->start + add_size -1 ; +if (pci_assign_resource (list->dev, idx))reset_resource (res); - }else if (add_size) { -adjust_resource (res, res->start, -resource_size (res) + add_size); + }else { +resource_size_t align = list->min_align; + res->flags |= list->flags & (IORESOURCE_STARTALIGN |IORESOURCE_SIZEALIGN ); +if (pci_reassign_resource (list->dev, idx, add_size, align)) +dev_printk (KERN_DEBUG , &list->dev->dev,"failed to add optional resources res=%pR\n" , + res); } out: tmp = list;
@@ -622,7 +629,7 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size, b_res->end = b_res->start + size0 -1 ; b_res->flags |=IORESOURCE_STARTALIGN ;if (size1 > size0 && add_head) -add_to_list (add_head, bus->self, b_res, size1-size0); +add_to_list (add_head, bus->self, b_res, size1-size0,4096 ); }/**
@@ -725,7 +732,7 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, b_res->end = size0 + min_align -1 ; b_res->flags |=IORESOURCE_STARTALIGN | mem64_mask;if (size1 > size0 && add_head) -add_to_list (add_head, bus->self, b_res, size1-size0); +add_to_list (add_head, bus->self, b_res, size1-size0, min_align);return 1 ; }
drivers/pci/setup-res.c +95 -57
201 lines not on this page · raw message
include/linux/pci.h +1 -0
@@ -800,6 +800,7 @@ int __pci_reset_function(struct pci_dev *dev);int pci_reset_function (struct pci_dev *dev);void pci_update_resource (struct pci_dev *dev,int resno);int __must_check pci_assign_resource (struct pci_dev *dev,int i); +int __must_check pci_reassign_resource (struct pci_dev *dev,int i,resource_size_t add_size,resource_size_t align);int pci_select_bars (struct pci_dev *dev,unsigned long flags);/* ROM control related routines */
Signature · 1 line
1.7.4.1
PATCH v3 3/5 PCI: make SRIOV resources optional
In reply to Ram PaiFrom: Yinghai Lu <[email protected]>
From: Yinghai Lu <[email protected]>
Allocate resources to SRIOV BARs only after all other required resource-requests are satisfied. Dont retry if resource allocation for SRIOV BARs fail.
--- drivers/pci/setup-bus.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-)
drivers/pci/setup-bus.c +10 -0
@@ -676,6 +676,16 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,if (r->parent || (r->flags & mask) != type)continue ; r_size =resource_size (r); +#ifdef CONFIG_PCI_IOV +/* put SRIOV requested res to the optional list */ +if (add_head && i >=PCI_IOV_RESOURCES && + i <=PCI_IOV_RESOURCE_END ) { + r->end = r->start -1 ; +add_to_list (add_head, dev, r, r_size,1 ); + children_add_size += r_size; +continue ; + } +#endif /* For bridges size != alignment */ align =pci_resource_alignment (dev, r); order =__ffs (align) -20 ;
Signature · 1 line
1.7.4.1
PATCH v3 4/5 PCI: make cardbus-bridge resources optional
In reply to Ram PaiAllocate resources to cardbus bridge only after all other genuine resources requests are satisfied. Dont retry if resource allocation for cardbus-bridges fail.
--- drivers/pci/pci.h | 4 ++++ drivers/pci/setup-bus.c | 41 ++++++++++++++++++++++++++++++++--------- 2 files changed, 36 insertions(+), 9 deletions(-)
drivers/pci/pci.h +4 -0
@@ -285,6 +285,8 @@ static inline int pci_iov_bus_range(struct pci_bus *bus)#endif /* CONFIG_PCI_IOV */ +extern unsigned long pci_cardbus_resource_alignment (struct resource *); +static inline resource_size_t pci_resource_alignment (struct pci_dev *dev,struct resource *res) {
@@ -294,6 +296,8 @@ static inline resource_size_t pci_resource_alignment(struct pci_dev *dev,if (resno >=PCI_IOV_RESOURCES && resno <=PCI_IOV_RESOURCE_END )return pci_sriov_resource_alignment (dev, resno);#endif +if (dev->class >>8 ==PCI_CLASS_BRIDGE_CARDBUS ) +return pci_cardbus_resource_alignment (res);return resource_alignment (res); }
drivers/pci/setup-bus.c +32 -9
95 lines not on this page · raw message
Signature · 1 line
1.7.4.1
PATCH v3 5/5 PCI: code and comments cleanup
In reply to Ram Paia) adjust_resource_sorted() is now called reassign_resource_sorted()
b) nice-to-have is now called optional
c) add_list is now called realloc_list.
--- drivers/pci/setup-bus.c | 110 +++++++++++++++++++++++----------------------- 1 files changed, 55 insertions(+), 55 deletions(-)
drivers/pci/setup-bus.c +55 -55
@@ -125,18 +125,18 @@ static inline void reset_resource(struct resource *res) }/** -* adjust_resources_sorted() - satisfy any additional resource requests +* reassign_resources_sorted() - satisfy any additional resource requests * -* @add_head : head of the list tracking requests requiring additional +* @realloc_head : head of the list tracking requests requiring additional * resources * @head : head of the list tracking requests with allocated * resources * -* Walk through each element of the add_head and try to procure +* Walk through each element of the realloc_head and try to procure * additional resources for the element, provided the element * is in the head list. */ -static void adjust_resources_sorted (struct resource_list_x *add_head, +static void reassign_resources_sorted (struct resource_list_x *realloc_head,struct resource_list *head) {struct resource *res;
@@ -145,8 +145,8 @@ static void adjust_resources_sorted(struct resource_list_x *add_head,resource_size_t add_size;int idx; - prev = add_head; -for (list = add_head->next; list;) { + prev = realloc_head; +for (list = realloc_head->next; list;) { res = list->res;/* skip resource that has been reset */ if (!res->flags)
@@ -218,7 +218,7 @@ static void assign_requested_resources_sorted(struct resource_list *head, }static void __assign_resources_sorted (struct resource_list *head, -struct resource_list_x *add_head, +struct resource_list_x *realloc_head,struct resource_list_x *fail_head) {/* Satisfy the must-have resource requests */
@@ -226,8 +226,8 @@ static void __assign_resources_sorted(struct resource_list *head,/* Try to satisfy any additional optional resource requests */ -if (add_head) -adjust_resources_sorted (add_head, head); +if (realloc_head) +reassign_resources_sorted (realloc_head, head);free_list (resource_list, head); }
@@ -243,7 +243,7 @@ static void pdev_assign_resources_sorted(struct pci_dev *dev, }static void pbus_assign_resources_sorted (const struct pci_bus *bus, -struct resource_list_x *add_head, +struct resource_list_x *realloc_head,struct resource_list_x *fail_head) {struct pci_dev *dev;
@@ -253,7 +253,7 @@ static void pbus_assign_resources_sorted(const struct pci_bus *bus,list_for_each_entry (dev, &bus->devices, bus_list)__dev_sort_resources (dev, &head); -__assign_resources_sorted (&head, add_head, fail_head); +__assign_resources_sorted (&head, realloc_head, fail_head); }void pci_setup_cardbus (struct pci_bus *bus)
@@ -551,13 +551,13 @@ static resource_size_t calculate_memsize(resource_size_t size,return size; } -static resource_size_t get_res_add_size (struct resource_list_x *add_head, +static resource_size_t get_res_add_size (struct resource_list_x *realloc_head,struct resource *res) {struct resource_list_x *list; -/* check if it is in add_head list */ -for (list = add_head->next; list && list->res != res; +/* check if it is in realloc_head list */ +for (list = realloc_head->next; list && list->res != res; list = list->next);if (list)return list->add_size;
@@ -571,7 +571,7 @@ static resource_size_t get_res_add_size(struct resource_list_x *add_head,* @bus : the bus * @min_size : the minimum io window that must to be allocated * @add_size : additional optional io window -* @add_head : track the additional io window on this list +* @realloc_head : track the additional io window on this list * * Sizing the IO windows of the PCI-PCI bridge is trivial, * since these windows have 4K granularity and the IO ranges
@@ -579,7 +579,7 @@ static resource_size_t get_res_add_size(struct resource_list_x *add_head,* We must be careful with the ISA aliasing though. */ static void pbus_size_io (struct pci_bus *bus,resource_size_t min_size, -resource_size_t add_size,struct resource_list_x *add_head) +resource_size_t add_size,struct resource_list_x *realloc_head) {struct pci_dev *dev;struct resource *b_res =find_free_bus_resource (bus,IORESOURCE_IO );
@@ -606,15 +606,15 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size,else size1 += r_size; -if (add_head) - children_add_size +=get_res_add_size (add_head, r); +if (realloc_head) + children_add_size +=get_res_add_size (realloc_head, r); } } size0 =calculate_iosize (size, min_size, size1,resource_size (b_res),4096 );if (children_add_size > add_size) add_size = children_add_size; - size1 = (!add_head || (add_head && !add_size)) ? size0 : + size1 = (!realloc_head || (realloc_head && !add_size)) ? size0 :calculate_iosize (size, min_size+add_size, size1,resource_size (b_res),4096 );if (!size0 && !size1) {
@@ -629,8 +629,8 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size, b_res->start =4096 ; b_res->end = b_res->start + size0 -1 ; b_res->flags |=IORESOURCE_STARTALIGN ; -if (size1 > size0 && add_head) -add_to_list (add_head, bus->self, b_res, size1-size0,4096 ); +if (size1 > size0 && realloc_head) +add_to_list (realloc_head, bus->self, b_res, size1-size0,4096 ); }/**
@@ -639,7 +639,7 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size,* @bus : the bus * @min_size : the minimum memory window that must to be allocated * @add_size : additional optional memory window -* @add_head : track the additional memory window on this list +* @realloc_head : track the additional memory window on this list * * Calculate the size of the bus and minimal alignment which * guarantees that all child resources fit in this size.
@@ -647,7 +647,7 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size,static int pbus_size_mem (struct pci_bus *bus,unsigned long mask,unsigned long type,resource_size_t min_size,resource_size_t add_size, -struct resource_list_x *add_head) +struct resource_list_x *realloc_head) {struct pci_dev *dev;resource_size_t min_align, align, size, size0, size1;
@@ -679,10 +679,10 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, r_size =resource_size (r);#ifdef CONFIG_PCI_IOV /* put SRIOV requested res to the optional list */ -if (add_head && i >=PCI_IOV_RESOURCES && +if (realloc_head && i >=PCI_IOV_RESOURCES && i <=PCI_IOV_RESOURCE_END ) { r->end = r->start -1 ; -add_to_list (add_head, dev, r, r_size,0 /* dont' care */ ); +add_to_list (realloc_head, dev, r, r_size,0 /* dont' care */ ); children_add_size += r_size;continue ; }
@@ -708,8 +708,8 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, max_order = order; mem64_mask &= r->flags &IORESOURCE_MEM_64 ; -if (add_head) - children_add_size +=get_res_add_size (add_head, r); +if (realloc_head) + children_add_size +=get_res_add_size (realloc_head, r); } } align =0 ;
@@ -728,7 +728,7 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, size0 =calculate_memsize (size, min_size,0 ,resource_size (b_res), min_align);if (children_add_size > add_size) add_size = children_add_size; - size1 = (!add_head || (add_head && !add_size)) ? size0 : + size1 = (!realloc_head || (realloc_head && !add_size)) ? size0 :calculate_memsize (size, min_size+add_size,0 ,resource_size (b_res), min_align);if (!size0 && !size1) {
@@ -742,8 +742,8 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, b_res->start = min_align; b_res->end = size0 + min_align -1 ; b_res->flags |=IORESOURCE_STARTALIGN | mem64_mask; -if (size1 > size0 && add_head) -add_to_list (add_head, bus->self, b_res, size1-size0, min_align); +if (size1 > size0 && realloc_head) +add_to_list (realloc_head, bus->self, b_res, size1-size0, min_align);return 1 ; }
@@ -757,7 +757,7 @@ unsigned long pci_cardbus_resource_alignment(struct resource *res) }static void pci_bus_size_cardbus (struct pci_bus *bus, -struct resource_list_x *add_head) +struct resource_list_x *realloc_head) {struct pci_dev *bridge = bus->self;struct resource *b_res = &bridge->resource[PCI_BRIDGE_RESOURCES ];
@@ -769,13 +769,13 @@ static void pci_bus_size_cardbus(struct pci_bus *bus,*/ b_res[0 ].start =0 ; b_res[0 ].flags |=IORESOURCE_IO |IORESOURCE_SIZEALIGN ; -if (add_head) -add_to_list (add_head, bridge, b_res, pci_cardbus_io_size,0 /* dont care */ ); +if (realloc_head) +add_to_list (realloc_head, bridge, b_res, pci_cardbus_io_size,0 /* dont care */ ); b_res[1 ].start =0 ; b_res[1 ].flags |=IORESOURCE_IO |IORESOURCE_SIZEALIGN ; -if (add_head) -add_to_list (add_head, bridge, b_res+1 , pci_cardbus_io_size,0 /* dont care */ ); +if (realloc_head) +add_to_list (realloc_head, bridge, b_res+1 , pci_cardbus_io_size,0 /* dont care */ );/* * Check whether prefetchable memory is supported
@@ -796,18 +796,18 @@ static void pci_bus_size_cardbus(struct pci_bus *bus,if (ctrl &PCI_CB_BRIDGE_CTL_PREFETCH_MEM0 ) { b_res[2 ].start =0 ; b_res[2 ].flags |=IORESOURCE_MEM |IORESOURCE_PREFETCH |IORESOURCE_SIZEALIGN ; -if (add_head) -add_to_list (add_head, bridge, b_res+2 , pci_cardbus_mem_size,0 /* dont care */ ); +if (realloc_head) +add_to_list (realloc_head, bridge, b_res+2 , pci_cardbus_mem_size,0 /* dont care */ ); b_res[3 ].start =0 ; b_res[3 ].flags |=IORESOURCE_MEM |IORESOURCE_SIZEALIGN ; -if (add_head) -add_to_list (add_head, bridge, b_res+3 , pci_cardbus_mem_size,0 /* dont care */ ); +if (realloc_head) +add_to_list (realloc_head, bridge, b_res+3 , pci_cardbus_mem_size,0 /* dont care */ ); }else { b_res[3 ].start =0 ; b_res[3 ].flags |=IORESOURCE_MEM |IORESOURCE_SIZEALIGN ; -if (add_head) -add_to_list (add_head, bridge, b_res+3 , pci_cardbus_mem_size *2 ,0 /* dont care */ ); +if (realloc_head) +add_to_list (realloc_head, bridge, b_res+3 , pci_cardbus_mem_size *2 ,0 /* dont care */ ); }/* set the size of the resource to zero, so that the resource does not
@@ -819,7 +819,7 @@ static void pci_bus_size_cardbus(struct pci_bus *bus, }void __ref __pci_bus_size_bridges (struct pci_bus *bus, -struct resource_list_x *add_head) +struct resource_list_x *realloc_head) {struct pci_dev *dev;unsigned long mask, prefmask;
@@ -832,12 +832,12 @@ void __ref __pci_bus_size_bridges(struct pci_bus *bus,switch (dev->class >>8 ) {case PCI_CLASS_BRIDGE_CARDBUS : -pci_bus_size_cardbus (b, add_head); +pci_bus_size_cardbus (b, realloc_head);break ;case PCI_CLASS_BRIDGE_PCI :default : -__pci_bus_size_bridges (b, add_head); +__pci_bus_size_bridges (b, realloc_head);break ; } }
@@ -861,7 +861,7 @@ void __ref __pci_bus_size_bridges(struct pci_bus *bus,* Follow thru */ default : -pbus_size_io (bus,0 , additional_io_size, add_head); +pbus_size_io (bus,0 , additional_io_size, realloc_head);/* If the bridge supports prefetchable range, size it separately. If it doesn't, or its prefetchable window has already been allocated by arch code, try
@@ -869,11 +869,11 @@ void __ref __pci_bus_size_bridges(struct pci_bus *bus,resources. */ mask =IORESOURCE_MEM ; prefmask =IORESOURCE_MEM |IORESOURCE_PREFETCH ; -if (pbus_size_mem (bus, prefmask, prefmask,0 , additional_mem_size, add_head)) +if (pbus_size_mem (bus, prefmask, prefmask,0 , additional_mem_size, realloc_head)) mask = prefmask;/* Success, size non-prefetch only. */ else additional_mem_size += additional_mem_size; -pbus_size_mem (bus, mask,IORESOURCE_MEM ,0 , additional_mem_size, add_head); +pbus_size_mem (bus, mask,IORESOURCE_MEM ,0 , additional_mem_size, realloc_head);break ; } }
@@ -885,20 +885,20 @@ void __ref pci_bus_size_bridges(struct pci_bus *bus)EXPORT_SYMBOL (pci_bus_size_bridges);static void __ref __pci_bus_assign_resources (const struct pci_bus *bus, -struct resource_list_x *add_head, +struct resource_list_x *realloc_head,struct resource_list_x *fail_head) {struct pci_bus *b;struct pci_dev *dev; -pbus_assign_resources_sorted (bus, add_head, fail_head); +pbus_assign_resources_sorted (bus, realloc_head, fail_head);list_for_each_entry (dev, &bus->devices, bus_list) { b = dev->subordinate;if (!b)continue ; -__pci_bus_assign_resources (b, add_head, fail_head); +__pci_bus_assign_resources (b, realloc_head, fail_head);switch (dev->class >>8 ) {case PCI_CLASS_BRIDGE_PCI :
@@ -1108,7 +1108,7 @@ void __initpci_assign_unassigned_resources (void) {struct pci_bus *bus; -struct resource_list_x add_list;/* list of resources that +struct resource_list_x realloc_list;/* list of resources that want additional resources */ int tried_times =0 ;enum release_type rel_type = leaf_only;
@@ -1121,7 +1121,7 @@ pci_assign_unassigned_resources(void) head.next =NULL ; - add_list.next =NULL ; + realloc_list.next =NULL ; pci_try_num = max_depth +1 ; printk(KERN_DEBUG "PCI: max bus depth: %d pci_try_num: %d\n",
@@ -1131,12 +1131,12 @@ again:/* Depth first, calculate sizes and alignments of all subordinate buses. */ list_for_each_entry (bus, &pci_root_buses, node) -__pci_bus_size_bridges (bus, &add_list); +__pci_bus_size_bridges (bus, &realloc_list);/* Depth last, allocate resources and update the hardware. */ list_for_each_entry (bus, &pci_root_buses, node) -__pci_bus_assign_resources (bus, &add_list, &head); -BUG_ON (add_list.next); +__pci_bus_assign_resources (bus, &realloc_list, &head); +BUG_ON (realloc_list.next); tried_times++;/* any device complain? */
Signature · 1 line
1.7.4.1