aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2008-02-14 17:56:56 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2008-04-21 00:47:02 -0400
commit5ff580c10ec06fd296bd23d4570c1a95194094a0 (patch)
treefc00b4a107824519ae452c264674e5b8c2768d8e
parentc71c68a04ba7672b9373ef04173114c211bb9f88 (diff)
PCI: remove global list of PCI devices
This patch finally removes the global list of PCI devices. We are relying entirely on the list held in the driver core now, and do not need a separate "shadow" list as no one uses it. Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/pci/bus.c4
-rw-r--r--drivers/pci/probe.c39
-rw-r--r--drivers/pci/remove.c4
-rw-r--r--include/linux/pci.h3
4 files changed, 1 insertions, 49 deletions
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c
index e1c079aa0e82..529d9d7727b0 100644
--- a/drivers/pci/bus.c
+++ b/drivers/pci/bus.c
@@ -85,10 +85,6 @@ int pci_bus_add_device(struct pci_dev *dev)
85 return retval; 85 return retval;
86 86
87 dev->is_added = 1; 87 dev->is_added = 1;
88 down_write(&pci_bus_sem);
89 list_add_tail(&dev->global_list, &pci_devices);
90 up_write(&pci_bus_sem);
91
92 pci_proc_attach_device(dev); 88 pci_proc_attach_device(dev);
93 pci_create_sysfs_dev_files(dev); 89 pci_create_sysfs_dev_files(dev);
94 return 0; 90 return 0;
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 7217f4283ce8..504f19b2af45 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -20,8 +20,6 @@
20LIST_HEAD(pci_root_buses); 20LIST_HEAD(pci_root_buses);
21EXPORT_SYMBOL(pci_root_buses); 21EXPORT_SYMBOL(pci_root_buses);
22 22
23LIST_HEAD(pci_devices);
24
25 23
26static int find_anything(struct device *dev, void *data) 24static int find_anything(struct device *dev, void *data)
27{ 25{
@@ -860,7 +858,6 @@ struct pci_dev *alloc_pci_dev(void)
860 if (!dev) 858 if (!dev)
861 return NULL; 859 return NULL;
862 860
863 INIT_LIST_HEAD(&dev->global_list);
864 INIT_LIST_HEAD(&dev->bus_list); 861 INIT_LIST_HEAD(&dev->bus_list);
865 862
866 pci_msi_init_pci_dev(dev); 863 pci_msi_init_pci_dev(dev);
@@ -957,7 +954,6 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
957 * Add the device to our list of discovered devices 954 * Add the device to our list of discovered devices
958 * and the bus list for fixup functions, etc. 955 * and the bus list for fixup functions, etc.
959 */ 956 */
960 INIT_LIST_HEAD(&dev->global_list);
961 down_write(&pci_bus_sem); 957 down_write(&pci_bus_sem);
962 list_add_tail(&dev->bus_list, &bus->devices); 958 list_add_tail(&dev->bus_list, &bus->devices);
963 up_write(&pci_bus_sem); 959 up_write(&pci_bus_sem);
@@ -1186,7 +1182,7 @@ static void __init pci_insertion_sort_klist(struct pci_dev *a, struct list_head
1186 list_move_tail(&a->dev.knode_bus.n_node, list); 1182 list_move_tail(&a->dev.knode_bus.n_node, list);
1187} 1183}
1188 1184
1189static void __init pci_sort_breadthfirst_klist(void) 1185void __init pci_sort_breadthfirst(void)
1190{ 1186{
1191 LIST_HEAD(sorted_devices); 1187 LIST_HEAD(sorted_devices);
1192 struct list_head *pos, *tmp; 1188 struct list_head *pos, *tmp;
@@ -1207,36 +1203,3 @@ static void __init pci_sort_breadthfirst_klist(void)
1207 list_splice(&sorted_devices, &device_klist->k_list); 1203 list_splice(&sorted_devices, &device_klist->k_list);
1208 spin_unlock(&device_klist->k_lock); 1204 spin_unlock(&device_klist->k_lock);
1209} 1205}
1210
1211static void __init pci_insertion_sort_devices(struct pci_dev *a, struct list_head *list)
1212{
1213 struct pci_dev *b;
1214
1215 list_for_each_entry(b, list, global_list) {
1216 if (pci_sort_bf_cmp(a, b) <= 0) {
1217 list_move_tail(&a->global_list, &b->global_list);
1218 return;
1219 }
1220 }
1221 list_move_tail(&a->global_list, list);
1222}
1223
1224static void __init pci_sort_breadthfirst_devices(void)
1225{
1226 LIST_HEAD(sorted_devices);
1227 struct pci_dev *dev, *tmp;
1228
1229 down_write(&pci_bus_sem);
1230 list_for_each_entry_safe(dev, tmp, &pci_devices, global_list) {
1231 pci_insertion_sort_devices(dev, &sorted_devices);
1232 }
1233 list_splice(&sorted_devices, &pci_devices);
1234 up_write(&pci_bus_sem);
1235}
1236
1237void __init pci_sort_breadthfirst(void)
1238{
1239 pci_sort_breadthfirst_devices();
1240 pci_sort_breadthfirst_klist();
1241}
1242
diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c
index d3c77cbe3279..b6824833343f 100644
--- a/drivers/pci/remove.c
+++ b/drivers/pci/remove.c
@@ -23,10 +23,6 @@ static void pci_stop_dev(struct pci_dev *dev)
23 pci_remove_sysfs_dev_files(dev); 23 pci_remove_sysfs_dev_files(dev);
24 device_unregister(&dev->dev); 24 device_unregister(&dev->dev);
25 dev->is_added = 0; 25 dev->is_added = 0;
26 down_write(&pci_bus_sem);
27 list_del(&dev->global_list);
28 dev->global_list.next = dev->global_list.prev = NULL;
29 up_write(&pci_bus_sem);
30 } 26 }
31} 27}
32 28
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 5e6d0f413fb9..3b8a4e17052f 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -132,7 +132,6 @@ struct pci_cap_saved_state {
132 * The pci_dev structure is used to describe PCI devices. 132 * The pci_dev structure is used to describe PCI devices.
133 */ 133 */
134struct pci_dev { 134struct pci_dev {
135 struct list_head global_list; /* node in list of all PCI devices */
136 struct list_head bus_list; /* node in per-bus list */ 135 struct list_head bus_list; /* node in per-bus list */
137 struct pci_bus *bus; /* bus this device is on */ 136 struct pci_bus *bus; /* bus this device is on */
138 struct pci_bus *subordinate; /* bus this device bridges to */ 137 struct pci_bus *subordinate; /* bus this device bridges to */
@@ -206,7 +205,6 @@ struct pci_dev {
206 205
207extern struct pci_dev *alloc_pci_dev(void); 206extern struct pci_dev *alloc_pci_dev(void);
208 207
209#define pci_dev_g(n) list_entry(n, struct pci_dev, global_list)
210#define pci_dev_b(n) list_entry(n, struct pci_dev, bus_list) 208#define pci_dev_b(n) list_entry(n, struct pci_dev, bus_list)
211#define to_pci_dev(n) container_of(n, struct pci_dev, dev) 209#define to_pci_dev(n) container_of(n, struct pci_dev, dev)
212#define for_each_pci_dev(d) while ((d = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, d)) != NULL) 210#define for_each_pci_dev(d) while ((d = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, d)) != NULL)
@@ -450,7 +448,6 @@ extern struct bus_type pci_bus_type;
450/* Do NOT directly access these two variables, unless you are arch specific pci 448/* Do NOT directly access these two variables, unless you are arch specific pci
451 * code, or pci core code. */ 449 * code, or pci core code. */
452extern struct list_head pci_root_buses; /* list of all known PCI buses */ 450extern struct list_head pci_root_buses; /* list of all known PCI buses */
453extern struct list_head pci_devices; /* list of all devices */
454/* Some device drivers need know if pci is initiated */ 451/* Some device drivers need know if pci is initiated */
455extern int no_pci_devices(void); 452extern int no_pci_devices(void);
456 453