mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-09 14:50:19 +00:00
[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: Christoph Lameter <christoph@lameter.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
e164f5573b
commit
8c5a09082f
@ -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;
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
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 @@
|
|||||||
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);
|
|||||||
#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) { \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user