[PATCH] x86/x86_64: pcibus_to_node
authorChristoph Lameter <christoph@lameter.com>
Thu, 23 Jun 2005 07:08:18 +0000 (00:08 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Thu, 23 Jun 2005 16:45:08 +0000 (09:45 -0700)
Define pcibus_to_node to be able to figure out which NUMA node contains a
given PCI device.  This defines pcibus_to_node(bus) in
include/linux/topology.h and adjusts the macros for i386 and x86_64 that
already provided a way to determine the cpumask of a pci device.

x86_64 was changed to not build an array of cpumasks anymore.  Instead an
array of nodes is build which can be used to generate the cpumask via
node_to_cpumask.

Signed-off-by: Christoph Lameter <christoph@lameter.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/x86_64/kernel/mpparse.c
arch/x86_64/pci/k8-bus.c
include/asm-generic/topology.h
include/asm-i386/topology.h
include/asm-x86_64/topology.h

index 61a63be..ed6a558 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/kernel_stat.h>
 #include <linux/mc146818rtc.h>
 #include <linux/acpi.h>
+#include <linux/module.h>
 
 #include <asm/smp.h>
 #include <asm/mtrr.h>
@@ -45,7 +46,8 @@ int acpi_found_madt;
 int apic_version [MAX_APICS];
 unsigned char mp_bus_id_to_type [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
 int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
-cpumask_t pci_bus_to_cpumask [256] = { [0 ... 255] = CPU_MASK_ALL };
+unsigned char pci_bus_to_node [256];
+EXPORT_SYMBOL(pci_bus_to_node);
 
 static int mp_current_pci_id = 0;
 /* I/O APIC entries */
index 62349c7..7e7d0c2 100644 (file)
@@ -53,25 +53,11 @@ fill_mp_bus_to_cpumask(void)
                                for (j = SECONDARY_LDT_BUS_NUMBER(ldtbus);
                                     j <= SUBORDINATE_LDT_BUS_NUMBER(ldtbus);
                                     j++)
-                                       pci_bus_to_cpumask[j] =
-                                               node_to_cpumask(NODE_ID(nid));
+                                       pci_bus_to_node[j] = NODE_ID(nid);
                        }
                }
        }
 
-       /* quick sanity check */
-       printed = 0;
-       for (i = 0; i < 256; i++) {
-               if (cpus_empty(pci_bus_to_cpumask[i])) {
-                       pci_bus_to_cpumask[i] = CPU_MASK_ALL;
-                       if (printed)
-                               continue;
-                       printk(KERN_ERR
-                              "k8-bus.c: some busses have empty cpu mask\n");
-                       printed = 1;
-               }
-       }
-
        return 0;
 }
 
index ec96e8b..5d9d70c 100644 (file)
 #ifndef node_to_first_cpu
 #define node_to_first_cpu(node)        (0)
 #endif
+#ifndef pcibus_to_node
+#define pcibus_to_node(node)   (-1)
+#endif
+
 #ifndef pcibus_to_cpumask
-#define pcibus_to_cpumask(bus) (cpu_online_map)
+#define pcibus_to_cpumask(bus) (pcibus_to_node(bus) == -1 ? \
+                                       CPU_MASK_ALL : \
+                                       node_to_cpumask(pcibus_to_node(bus)) \
+                               )
 #endif
 
 #endif /* _ASM_GENERIC_TOPOLOGY_H */
index 98f9e68..6d0f675 100644 (file)
@@ -60,12 +60,8 @@ static inline int node_to_first_cpu(int node)
        return first_cpu(mask);
 }
 
-/* Returns the number of the node containing PCI bus number 'busnr' */
-static inline cpumask_t __pcibus_to_cpumask(int busnr)
-{
-       return node_to_cpumask(mp_bus_id_to_node[busnr]);
-}
-#define pcibus_to_cpumask(bus) __pcibus_to_cpumask(bus->number)
+#define pcibus_to_node(bus) mp_bus_id_to_node[(bus)->number]
+#define pcibus_to_cpumask(bus) node_to_cpumask(pcibus_to_node(bus))
 
 /* sched_domains SD_NODE_INIT for NUMAQ machines */
 #define SD_NODE_INIT (struct sched_domain) {           \
index da21573..8f77e9f 100644 (file)
@@ -13,8 +13,8 @@
 extern cpumask_t cpu_online_map;
 
 extern unsigned char cpu_to_node[];
+extern unsigned char pci_bus_to_node[];
 extern cpumask_t     node_to_cpumask[];
-extern cpumask_t pci_bus_to_cpumask[];
 
 #ifdef CONFIG_ACPI_NUMA
 extern int __node_distance(int, int);
@@ -26,16 +26,8 @@ extern int __node_distance(int, int);
 #define parent_node(node)              (node)
 #define node_to_first_cpu(node)        (__ffs(node_to_cpumask[node]))
 #define node_to_cpumask(node)          (node_to_cpumask[node])
-
-static inline cpumask_t __pcibus_to_cpumask(int bus)
-{
-       cpumask_t busmask = pci_bus_to_cpumask[bus];
-       cpumask_t online = cpu_online_map;
-       cpumask_t res;
-       cpus_and(res, busmask, online);
-       return res;
-}
-#define pcibus_to_cpumask(bus) __pcibus_to_cpumask(bus->number)
+#define pcibus_to_node(bus)            pci_bus_to_node[(bus)->number]
+#define pcibus_to_cpumask(bus)         node_to_cpumask(pcibus_to_node(bus));
 
 /* sched_domains SD_NODE_INIT for x86_64 machines */
 #define SD_NODE_INIT (struct sched_domain) {           \