Commit 8c5a0908 authored by Christoph Lameter's avatar Christoph Lameter Committed by Linus Torvalds

[PATCH] x86/x86_64: pcibus_to_node

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: default avatarChristoph Lameter <christoph@lameter.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e164f557
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/kernel_stat.h> #include <linux/kernel_stat.h>
#include <linux/mc146818rtc.h> #include <linux/mc146818rtc.h>
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/module.h>
#include <asm/smp.h> #include <asm/smp.h>
#include <asm/mtrr.h> #include <asm/mtrr.h>
...@@ -45,7 +46,8 @@ int acpi_found_madt; ...@@ -45,7 +46,8 @@ int acpi_found_madt;
int apic_version [MAX_APICS]; int apic_version [MAX_APICS];
unsigned char mp_bus_id_to_type [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 }; 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 }; 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; static int mp_current_pci_id = 0;
/* I/O APIC entries */ /* I/O APIC entries */
......
...@@ -53,25 +53,11 @@ fill_mp_bus_to_cpumask(void) ...@@ -53,25 +53,11 @@ fill_mp_bus_to_cpumask(void)
for (j = SECONDARY_LDT_BUS_NUMBER(ldtbus); for (j = SECONDARY_LDT_BUS_NUMBER(ldtbus);
j <= SUBORDINATE_LDT_BUS_NUMBER(ldtbus); j <= SUBORDINATE_LDT_BUS_NUMBER(ldtbus);
j++) j++)
pci_bus_to_cpumask[j] = pci_bus_to_node[j] = NODE_ID(nid);
node_to_cpumask(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; return 0;
} }
......
...@@ -41,8 +41,15 @@ ...@@ -41,8 +41,15 @@
#ifndef node_to_first_cpu #ifndef node_to_first_cpu
#define node_to_first_cpu(node) (0) #define node_to_first_cpu(node) (0)
#endif #endif
#ifndef pcibus_to_node
#define pcibus_to_node(node) (-1)
#endif
#ifndef pcibus_to_cpumask #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
#endif /* _ASM_GENERIC_TOPOLOGY_H */ #endif /* _ASM_GENERIC_TOPOLOGY_H */
...@@ -60,12 +60,8 @@ static inline int node_to_first_cpu(int node) ...@@ -60,12 +60,8 @@ static inline int node_to_first_cpu(int node)
return first_cpu(mask); return first_cpu(mask);
} }
/* Returns the number of the node containing PCI bus number 'busnr' */ #define pcibus_to_node(bus) mp_bus_id_to_node[(bus)->number]
static inline cpumask_t __pcibus_to_cpumask(int busnr) #define pcibus_to_cpumask(bus) node_to_cpumask(pcibus_to_node(bus))
{
return node_to_cpumask(mp_bus_id_to_node[busnr]);
}
#define pcibus_to_cpumask(bus) __pcibus_to_cpumask(bus->number)
/* sched_domains SD_NODE_INIT for NUMAQ machines */ /* sched_domains SD_NODE_INIT for NUMAQ machines */
#define SD_NODE_INIT (struct sched_domain) { \ #define SD_NODE_INIT (struct sched_domain) { \
......
...@@ -13,8 +13,8 @@ ...@@ -13,8 +13,8 @@
extern cpumask_t cpu_online_map; extern cpumask_t cpu_online_map;
extern unsigned char cpu_to_node[]; extern unsigned char cpu_to_node[];
extern unsigned char pci_bus_to_node[];
extern cpumask_t node_to_cpumask[]; extern cpumask_t node_to_cpumask[];
extern cpumask_t pci_bus_to_cpumask[];
#ifdef CONFIG_ACPI_NUMA #ifdef CONFIG_ACPI_NUMA
extern int __node_distance(int, int); extern int __node_distance(int, int);
...@@ -26,16 +26,8 @@ extern int __node_distance(int, int); ...@@ -26,16 +26,8 @@ extern int __node_distance(int, int);
#define parent_node(node) (node) #define parent_node(node) (node)
#define node_to_first_cpu(node) (__ffs(node_to_cpumask[node])) #define node_to_first_cpu(node) (__ffs(node_to_cpumask[node]))
#define node_to_cpumask(node) (node_to_cpumask[node]) #define node_to_cpumask(node) (node_to_cpumask[node])
#define pcibus_to_node(bus) pci_bus_to_node[(bus)->number]
static inline cpumask_t __pcibus_to_cpumask(int bus) #define pcibus_to_cpumask(bus) node_to_cpumask(pcibus_to_node(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)
/* sched_domains SD_NODE_INIT for x86_64 machines */ /* sched_domains SD_NODE_INIT for x86_64 machines */
#define SD_NODE_INIT (struct sched_domain) { \ #define SD_NODE_INIT (struct sched_domain) { \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment