Skip to content

Commit 7b54366

Browse files
Yinghai Lubjorn-helgaas
authored andcommitted
PCI: add generic device into pci_host_bridge struct
Use that device for pci_root_bus bridge pointer. Use pci_release_bus_bridge_dev() to release allocated pci_host_bridge in remove path. Use root bus bridge pointer to get host bridge pointer instead of searching host bridge list. That leaves the host bridge list unused, so remove it. Signed-off-by: Yinghai Lu <[email protected]> Signed-off-by: Bjorn Helgaas <[email protected]>
1 parent 459f58c commit 7b54366

File tree

4 files changed

+39
-48
lines changed

4 files changed

+39
-48
lines changed

drivers/pci/host-bridge.c

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,6 @@
99

1010
#include "pci.h"
1111

12-
static LIST_HEAD(pci_host_bridges);
13-
14-
void add_to_pci_host_bridges(struct pci_host_bridge *bridge)
15-
{
16-
list_add_tail(&bridge->list, &pci_host_bridges);
17-
}
18-
1912
static struct pci_bus *find_pci_root_bus(struct pci_dev *dev)
2013
{
2114
struct pci_bus *bus;
@@ -30,14 +23,8 @@ static struct pci_bus *find_pci_root_bus(struct pci_dev *dev)
3023
static struct pci_host_bridge *find_pci_host_bridge(struct pci_dev *dev)
3124
{
3225
struct pci_bus *bus = find_pci_root_bus(dev);
33-
struct pci_host_bridge *bridge;
34-
35-
list_for_each_entry(bridge, &pci_host_bridges, list) {
36-
if (bridge->bus == bus)
37-
return bridge;
38-
}
3926

40-
return NULL;
27+
return to_pci_host_bridge(bus->bridge);
4128
}
4229

4330
static bool resource_contains(struct resource *res1, struct resource *res2)

drivers/pci/pci.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,6 @@ static inline int pci_ari_enabled(struct pci_bus *bus)
231231
void pci_reassigndev_resource_alignment(struct pci_dev *dev);
232232
extern void pci_disable_bridge_window(struct pci_dev *dev);
233233

234-
void add_to_pci_host_bridges(struct pci_host_bridge *bridge);
235-
236234
/* Single Root I/O Virtualization */
237235
struct pci_sriov {
238236
int pos; /* capability position */

drivers/pci/probe.c

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,19 @@ static struct pci_bus * pci_alloc_bus(void)
422422
return b;
423423
}
424424

425+
static struct pci_host_bridge *pci_alloc_host_bridge(struct pci_bus *b)
426+
{
427+
struct pci_host_bridge *bridge;
428+
429+
bridge = kzalloc(sizeof(*bridge), GFP_KERNEL);
430+
if (bridge) {
431+
INIT_LIST_HEAD(&bridge->windows);
432+
bridge->bus = b;
433+
}
434+
435+
return bridge;
436+
}
437+
425438
static unsigned char pcix_bus_speed[] = {
426439
PCI_SPEED_UNKNOWN, /* 0 */
427440
PCI_SPEED_66MHz_PCIX, /* 1 */
@@ -1122,7 +1135,13 @@ int pci_cfg_space_size(struct pci_dev *dev)
11221135

11231136
static void pci_release_bus_bridge_dev(struct device *dev)
11241137
{
1125-
kfree(dev);
1138+
struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
1139+
1140+
/* TODO: need to free window->res */
1141+
1142+
pci_free_resource_list(&bridge->windows);
1143+
1144+
kfree(bridge);
11261145
}
11271146

11281147
struct pci_dev *alloc_pci_dev(void)
@@ -1571,42 +1590,37 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
15711590
int error;
15721591
struct pci_host_bridge *bridge;
15731592
struct pci_bus *b, *b2;
1574-
struct device *dev;
15751593
struct pci_host_bridge_window *window, *n;
15761594
struct resource *res;
15771595
resource_size_t offset;
15781596
char bus_addr[64];
15791597
char *fmt;
15801598

1581-
bridge = kzalloc(sizeof(*bridge), GFP_KERNEL);
1582-
if (!bridge)
1583-
return NULL;
15841599

15851600
b = pci_alloc_bus();
15861601
if (!b)
1587-
goto err_bus;
1588-
1589-
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1590-
if (!dev)
1591-
goto err_dev;
1602+
return NULL;
15921603

15931604
b->sysdata = sysdata;
15941605
b->ops = ops;
1595-
15961606
b2 = pci_find_bus(pci_domain_nr(b), bus);
15971607
if (b2) {
15981608
/* If we already got to this bus through a different bridge, ignore it */
15991609
dev_dbg(&b2->dev, "bus already known\n");
16001610
goto err_out;
16011611
}
16021612

1603-
dev->parent = parent;
1604-
dev->release = pci_release_bus_bridge_dev;
1605-
dev_set_name(dev, "pci%04x:%02x", pci_domain_nr(b), bus);
1606-
error = device_register(dev);
1613+
bridge = pci_alloc_host_bridge(b);
1614+
if (!bridge)
1615+
goto err_out;
1616+
1617+
bridge->dev.parent = parent;
1618+
bridge->dev.release = pci_release_bus_bridge_dev;
1619+
dev_set_name(&bridge->dev, "pci%04x:%02x", pci_domain_nr(b), bus);
1620+
error = device_register(&bridge->dev);
16071621
if (error)
1608-
goto dev_reg_err;
1609-
b->bridge = get_device(dev);
1622+
goto bridge_dev_reg_err;
1623+
b->bridge = get_device(&bridge->dev);
16101624
device_enable_async_suspend(b->bridge);
16111625
pci_set_bus_of_node(b);
16121626

@@ -1625,9 +1639,6 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
16251639

16261640
b->number = b->secondary = bus;
16271641

1628-
bridge->bus = b;
1629-
INIT_LIST_HEAD(&bridge->windows);
1630-
16311642
if (parent)
16321643
dev_info(parent, "PCI host bridge to bus %s\n", dev_name(&b->dev));
16331644
else
@@ -1653,25 +1664,18 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
16531664
}
16541665

16551666
down_write(&pci_bus_sem);
1656-
add_to_pci_host_bridges(bridge);
16571667
list_add_tail(&b->node, &pci_root_buses);
16581668
up_write(&pci_bus_sem);
16591669

16601670
return b;
16611671

16621672
class_dev_reg_err:
1663-
device_unregister(dev);
1664-
dev_reg_err:
1665-
down_write(&pci_bus_sem);
1666-
list_del(&bridge->list);
1667-
list_del(&b->node);
1668-
up_write(&pci_bus_sem);
1673+
put_device(&bridge->dev);
1674+
device_unregister(&bridge->dev);
1675+
bridge_dev_reg_err:
1676+
kfree(bridge);
16691677
err_out:
1670-
kfree(dev);
1671-
err_dev:
16721678
kfree(b);
1673-
err_bus:
1674-
kfree(bridge);
16751679
return NULL;
16761680
}
16771681

include/linux/pci.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,11 +375,13 @@ struct pci_host_bridge_window {
375375
};
376376

377377
struct pci_host_bridge {
378-
struct list_head list;
378+
struct device dev;
379379
struct pci_bus *bus; /* root bus */
380380
struct list_head windows; /* pci_host_bridge_windows */
381381
};
382382

383+
#define to_pci_host_bridge(n) container_of(n, struct pci_host_bridge, dev)
384+
383385
/*
384386
* The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond
385387
* to P2P or CardBus bridge windows) go in a table. Additional ones (for

0 commit comments

Comments
 (0)