diff options
Diffstat (limited to 'arch/ia64/kernel')
-rw-r--r-- | arch/ia64/kernel/acpi.c | 13 | ||||
-rw-r--r-- | arch/ia64/kernel/numa.c | 34 | ||||
-rw-r--r-- | arch/ia64/kernel/perfmon.c | 1 | ||||
-rw-r--r-- | arch/ia64/kernel/topology.c | 4 | ||||
-rw-r--r-- | arch/ia64/kernel/uncached.c | 2 |
5 files changed, 44 insertions, 10 deletions
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 0176556aeecc..32c3abededc6 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
@@ -771,16 +771,19 @@ int acpi_map_cpu2node(acpi_handle handle, int cpu, long physid) | |||
771 | { | 771 | { |
772 | #ifdef CONFIG_ACPI_NUMA | 772 | #ifdef CONFIG_ACPI_NUMA |
773 | int pxm_id; | 773 | int pxm_id; |
774 | int nid; | ||
774 | 775 | ||
775 | pxm_id = acpi_get_pxm(handle); | 776 | pxm_id = acpi_get_pxm(handle); |
776 | |||
777 | /* | 777 | /* |
778 | * Assuming that the container driver would have set the proximity | 778 | * We don't have cpu-only-node hotadd. But if the system equips |
779 | * domain and would have initialized pxm_to_node(pxm_id) && pxm_flag | 779 | * SRAT table, pxm is already found and node is ready. |
780 | * So, just pxm_to_nid(pxm) is OK. | ||
781 | * This code here is for the system which doesn't have full SRAT | ||
782 | * table for possible cpus. | ||
780 | */ | 783 | */ |
781 | node_cpuid[cpu].nid = (pxm_id < 0) ? 0 : pxm_to_node(pxm_id); | 784 | nid = acpi_map_pxm_to_node(pxm_id); |
782 | |||
783 | node_cpuid[cpu].phys_id = physid; | 785 | node_cpuid[cpu].phys_id = physid; |
786 | node_cpuid[cpu].nid = nid; | ||
784 | #endif | 787 | #endif |
785 | return (0); | 788 | return (0); |
786 | } | 789 | } |
diff --git a/arch/ia64/kernel/numa.c b/arch/ia64/kernel/numa.c index 1cc360c83e7a..20340631179f 100644 --- a/arch/ia64/kernel/numa.c +++ b/arch/ia64/kernel/numa.c | |||
@@ -29,6 +29,36 @@ EXPORT_SYMBOL(cpu_to_node_map); | |||
29 | 29 | ||
30 | cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; | 30 | cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; |
31 | 31 | ||
32 | void __cpuinit map_cpu_to_node(int cpu, int nid) | ||
33 | { | ||
34 | int oldnid; | ||
35 | if (nid < 0) { /* just initialize by zero */ | ||
36 | cpu_to_node_map[cpu] = 0; | ||
37 | return; | ||
38 | } | ||
39 | /* sanity check first */ | ||
40 | oldnid = cpu_to_node_map[cpu]; | ||
41 | if (cpu_isset(cpu, node_to_cpu_mask[oldnid])) { | ||
42 | return; /* nothing to do */ | ||
43 | } | ||
44 | /* we don't have cpu-driven node hot add yet... | ||
45 | In usual case, node is created from SRAT at boot time. */ | ||
46 | if (!node_online(nid)) | ||
47 | nid = first_online_node; | ||
48 | cpu_to_node_map[cpu] = nid; | ||
49 | cpu_set(cpu, node_to_cpu_mask[nid]); | ||
50 | return; | ||
51 | } | ||
52 | |||
53 | void __cpuinit unmap_cpu_from_node(int cpu, int nid) | ||
54 | { | ||
55 | WARN_ON(!cpu_isset(cpu, node_to_cpu_mask[nid])); | ||
56 | WARN_ON(cpu_to_node_map[cpu] != nid); | ||
57 | cpu_to_node_map[cpu] = 0; | ||
58 | cpu_clear(cpu, node_to_cpu_mask[nid]); | ||
59 | } | ||
60 | |||
61 | |||
32 | /** | 62 | /** |
33 | * build_cpu_to_node_map - setup cpu to node and node to cpumask arrays | 63 | * build_cpu_to_node_map - setup cpu to node and node to cpumask arrays |
34 | * | 64 | * |
@@ -49,8 +79,6 @@ void __init build_cpu_to_node_map(void) | |||
49 | node = node_cpuid[i].nid; | 79 | node = node_cpuid[i].nid; |
50 | break; | 80 | break; |
51 | } | 81 | } |
52 | cpu_to_node_map[cpu] = (node >= 0) ? node : 0; | 82 | map_cpu_to_node(cpu, node); |
53 | if (node >= 0) | ||
54 | cpu_set(cpu, node_to_cpu_mask[node]); | ||
55 | } | 83 | } |
56 | } | 84 | } |
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index 45000d5d0cfa..281004ff7b00 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <linux/file.h> | 34 | #include <linux/file.h> |
35 | #include <linux/poll.h> | 35 | #include <linux/poll.h> |
36 | #include <linux/vfs.h> | 36 | #include <linux/vfs.h> |
37 | #include <linux/smp.h> | ||
37 | #include <linux/pagemap.h> | 38 | #include <linux/pagemap.h> |
38 | #include <linux/mount.h> | 39 | #include <linux/mount.h> |
39 | #include <linux/bitops.h> | 40 | #include <linux/bitops.h> |
diff --git a/arch/ia64/kernel/topology.c b/arch/ia64/kernel/topology.c index f648c610b10c..5629b45e89c6 100644 --- a/arch/ia64/kernel/topology.c +++ b/arch/ia64/kernel/topology.c | |||
@@ -36,6 +36,7 @@ int arch_register_cpu(int num) | |||
36 | */ | 36 | */ |
37 | if (!can_cpei_retarget() && is_cpu_cpei_target(num)) | 37 | if (!can_cpei_retarget() && is_cpu_cpei_target(num)) |
38 | sysfs_cpus[num].cpu.no_control = 1; | 38 | sysfs_cpus[num].cpu.no_control = 1; |
39 | map_cpu_to_node(num, node_cpuid[num].nid); | ||
39 | #endif | 40 | #endif |
40 | 41 | ||
41 | return register_cpu(&sysfs_cpus[num].cpu, num); | 42 | return register_cpu(&sysfs_cpus[num].cpu, num); |
@@ -45,7 +46,8 @@ int arch_register_cpu(int num) | |||
45 | 46 | ||
46 | void arch_unregister_cpu(int num) | 47 | void arch_unregister_cpu(int num) |
47 | { | 48 | { |
48 | return unregister_cpu(&sysfs_cpus[num].cpu); | 49 | unregister_cpu(&sysfs_cpus[num].cpu); |
50 | unmap_cpu_from_node(num, cpu_to_node(num)); | ||
49 | } | 51 | } |
50 | EXPORT_SYMBOL(arch_register_cpu); | 52 | EXPORT_SYMBOL(arch_register_cpu); |
51 | EXPORT_SYMBOL(arch_unregister_cpu); | 53 | EXPORT_SYMBOL(arch_unregister_cpu); |
diff --git a/arch/ia64/kernel/uncached.c b/arch/ia64/kernel/uncached.c index 4c73a6763669..c58e933694d5 100644 --- a/arch/ia64/kernel/uncached.c +++ b/arch/ia64/kernel/uncached.c | |||
@@ -98,7 +98,7 @@ static int uncached_add_chunk(struct uncached_pool *uc_pool, int nid) | |||
98 | 98 | ||
99 | /* attempt to allocate a granule's worth of cached memory pages */ | 99 | /* attempt to allocate a granule's worth of cached memory pages */ |
100 | 100 | ||
101 | page = alloc_pages_node(nid, GFP_KERNEL | __GFP_ZERO, | 101 | page = alloc_pages_node(nid, GFP_KERNEL | __GFP_ZERO | GFP_THISNODE, |
102 | IA64_GRANULE_SHIFT-PAGE_SHIFT); | 102 | IA64_GRANULE_SHIFT-PAGE_SHIFT); |
103 | if (!page) { | 103 | if (!page) { |
104 | mutex_unlock(&uc_pool->add_chunk_mutex); | 104 | mutex_unlock(&uc_pool->add_chunk_mutex); |