aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64
diff options
context:
space:
mode:
Diffstat (limited to 'arch/ia64')
-rw-r--r--arch/ia64/Kconfig12
-rw-r--r--arch/ia64/ia32/sys_ia32.c2
-rw-r--r--arch/ia64/kernel/acpi.c13
-rw-r--r--arch/ia64/kernel/numa.c34
-rw-r--r--arch/ia64/kernel/perfmon.c1
-rw-r--r--arch/ia64/kernel/topology.c4
-rw-r--r--arch/ia64/kernel/uncached.c2
-rw-r--r--arch/ia64/mm/contig.c67
-rw-r--r--arch/ia64/mm/discontig.c44
-rw-r--r--arch/ia64/mm/init.c12
-rw-r--r--arch/ia64/pci/pci.c3
-rw-r--r--arch/ia64/sn/kernel/sn2/sn_hwperf.c3
12 files changed, 88 insertions, 109 deletions
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
index 9ed69e79dd1d..0b7f701d5cf7 100644
--- a/arch/ia64/Kconfig
+++ b/arch/ia64/Kconfig
@@ -66,15 +66,6 @@ config IA64_UNCACHED_ALLOCATOR
66 bool 66 bool
67 select GENERIC_ALLOCATOR 67 select GENERIC_ALLOCATOR
68 68
69config DMA_IS_DMA32
70 bool
71 default y
72
73config DMA_IS_NORMAL
74 bool
75 depends on IA64_SGI_SN2
76 default y
77
78config AUDIT_ARCH 69config AUDIT_ARCH
79 bool 70 bool
80 default y 71 default y
@@ -365,6 +356,9 @@ config NODES_SHIFT
365 MAX_NUMNODES will be 2^(This value). 356 MAX_NUMNODES will be 2^(This value).
366 If in doubt, use the default. 357 If in doubt, use the default.
367 358
359config ARCH_POPULATES_NODE_MAP
360 def_bool y
361
368# VIRTUAL_MEM_MAP and FLAT_NODE_MEM_MAP are functionally equivalent. 362# VIRTUAL_MEM_MAP and FLAT_NODE_MEM_MAP are functionally equivalent.
369# VIRTUAL_MEM_MAP has been retained for historical reasons. 363# VIRTUAL_MEM_MAP has been retained for historical reasons.
370config VIRTUAL_MEM_MAP 364config VIRTUAL_MEM_MAP
diff --git a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c
index 6aa3c51619ca..bddbd22706ed 100644
--- a/arch/ia64/ia32/sys_ia32.c
+++ b/arch/ia64/ia32/sys_ia32.c
@@ -1942,7 +1942,7 @@ struct sysctl32 {
1942 unsigned int __unused[4]; 1942 unsigned int __unused[4];
1943}; 1943};
1944 1944
1945#ifdef CONFIG_SYSCTL 1945#ifdef CONFIG_SYSCTL_SYSCALL
1946asmlinkage long 1946asmlinkage long
1947sys32_sysctl (struct sysctl32 __user *args) 1947sys32_sysctl (struct sysctl32 __user *args)
1948{ 1948{
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
30cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; 30cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;
31 31
32void __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
53void __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
46void arch_unregister_cpu(int num) 47void 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}
50EXPORT_SYMBOL(arch_register_cpu); 52EXPORT_SYMBOL(arch_register_cpu);
51EXPORT_SYMBOL(arch_unregister_cpu); 53EXPORT_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);
diff --git a/arch/ia64/mm/contig.c b/arch/ia64/mm/contig.c
index 537c2f3833ee..daf977ff2920 100644
--- a/arch/ia64/mm/contig.c
+++ b/arch/ia64/mm/contig.c
@@ -26,7 +26,6 @@
26#include <asm/mca.h> 26#include <asm/mca.h>
27 27
28#ifdef CONFIG_VIRTUAL_MEM_MAP 28#ifdef CONFIG_VIRTUAL_MEM_MAP
29static unsigned long num_dma_physpages;
30static unsigned long max_gap; 29static unsigned long max_gap;
31#endif 30#endif
32 31
@@ -219,18 +218,6 @@ count_pages (u64 start, u64 end, void *arg)
219 return 0; 218 return 0;
220} 219}
221 220
222#ifdef CONFIG_VIRTUAL_MEM_MAP
223static int
224count_dma_pages (u64 start, u64 end, void *arg)
225{
226 unsigned long *count = arg;
227
228 if (start < MAX_DMA_ADDRESS)
229 *count += (min(end, MAX_DMA_ADDRESS) - start) >> PAGE_SHIFT;
230 return 0;
231}
232#endif
233
234/* 221/*
235 * Set up the page tables. 222 * Set up the page tables.
236 */ 223 */
@@ -239,45 +226,22 @@ void __init
239paging_init (void) 226paging_init (void)
240{ 227{
241 unsigned long max_dma; 228 unsigned long max_dma;
242 unsigned long zones_size[MAX_NR_ZONES]; 229 unsigned long nid = 0;
243#ifdef CONFIG_VIRTUAL_MEM_MAP 230 unsigned long max_zone_pfns[MAX_NR_ZONES];
244 unsigned long zholes_size[MAX_NR_ZONES];
245#endif
246
247 /* initialize mem_map[] */
248
249 memset(zones_size, 0, sizeof(zones_size));
250 231
251 num_physpages = 0; 232 num_physpages = 0;
252 efi_memmap_walk(count_pages, &num_physpages); 233 efi_memmap_walk(count_pages, &num_physpages);
253 234
254 max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT; 235 max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT;
236 max_zone_pfns[ZONE_DMA] = max_dma;
237 max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
255 238
256#ifdef CONFIG_VIRTUAL_MEM_MAP 239#ifdef CONFIG_VIRTUAL_MEM_MAP
257 memset(zholes_size, 0, sizeof(zholes_size)); 240 efi_memmap_walk(register_active_ranges, &nid);
258
259 num_dma_physpages = 0;
260 efi_memmap_walk(count_dma_pages, &num_dma_physpages);
261
262 if (max_low_pfn < max_dma) {
263 zones_size[ZONE_DMA] = max_low_pfn;
264 zholes_size[ZONE_DMA] = max_low_pfn - num_dma_physpages;
265 } else {
266 zones_size[ZONE_DMA] = max_dma;
267 zholes_size[ZONE_DMA] = max_dma - num_dma_physpages;
268 if (num_physpages > num_dma_physpages) {
269 zones_size[ZONE_NORMAL] = max_low_pfn - max_dma;
270 zholes_size[ZONE_NORMAL] =
271 ((max_low_pfn - max_dma) -
272 (num_physpages - num_dma_physpages));
273 }
274 }
275
276 efi_memmap_walk(find_largest_hole, (u64 *)&max_gap); 241 efi_memmap_walk(find_largest_hole, (u64 *)&max_gap);
277 if (max_gap < LARGE_GAP) { 242 if (max_gap < LARGE_GAP) {
278 vmem_map = (struct page *) 0; 243 vmem_map = (struct page *) 0;
279 free_area_init_node(0, NODE_DATA(0), zones_size, 0, 244 free_area_init_nodes(max_zone_pfns);
280 zholes_size);
281 } else { 245 } else {
282 unsigned long map_size; 246 unsigned long map_size;
283 247
@@ -289,20 +253,19 @@ paging_init (void)
289 vmem_map = (struct page *) vmalloc_end; 253 vmem_map = (struct page *) vmalloc_end;
290 efi_memmap_walk(create_mem_map_page_table, NULL); 254 efi_memmap_walk(create_mem_map_page_table, NULL);
291 255
292 NODE_DATA(0)->node_mem_map = vmem_map; 256 /*
293 free_area_init_node(0, NODE_DATA(0), zones_size, 257 * alloc_node_mem_map makes an adjustment for mem_map
294 0, zholes_size); 258 * which isn't compatible with vmem_map.
259 */
260 NODE_DATA(0)->node_mem_map = vmem_map +
261 find_min_pfn_with_active_regions();
262 free_area_init_nodes(max_zone_pfns);
295 263
296 printk("Virtual mem_map starts at 0x%p\n", mem_map); 264 printk("Virtual mem_map starts at 0x%p\n", mem_map);
297 } 265 }
298#else /* !CONFIG_VIRTUAL_MEM_MAP */ 266#else /* !CONFIG_VIRTUAL_MEM_MAP */
299 if (max_low_pfn < max_dma) 267 add_active_range(0, 0, max_low_pfn);
300 zones_size[ZONE_DMA] = max_low_pfn; 268 free_area_init_nodes(max_zone_pfns);
301 else {
302 zones_size[ZONE_DMA] = max_dma;
303 zones_size[ZONE_NORMAL] = max_low_pfn - max_dma;
304 }
305 free_area_init(zones_size);
306#endif /* !CONFIG_VIRTUAL_MEM_MAP */ 269#endif /* !CONFIG_VIRTUAL_MEM_MAP */
307 zero_page_memmap_ptr = virt_to_page(ia64_imva(empty_zero_page)); 270 zero_page_memmap_ptr = virt_to_page(ia64_imva(empty_zero_page));
308} 271}
diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c
index 6ea279766334..d497b6b0f5b2 100644
--- a/arch/ia64/mm/discontig.c
+++ b/arch/ia64/mm/discontig.c
@@ -654,6 +654,7 @@ static __init int count_node_pages(unsigned long start, unsigned long len, int n
654{ 654{
655 unsigned long end = start + len; 655 unsigned long end = start + len;
656 656
657 add_active_range(node, start >> PAGE_SHIFT, end >> PAGE_SHIFT);
657 mem_data[node].num_physpages += len >> PAGE_SHIFT; 658 mem_data[node].num_physpages += len >> PAGE_SHIFT;
658 if (start <= __pa(MAX_DMA_ADDRESS)) 659 if (start <= __pa(MAX_DMA_ADDRESS))
659 mem_data[node].num_dma_physpages += 660 mem_data[node].num_dma_physpages +=
@@ -678,10 +679,10 @@ static __init int count_node_pages(unsigned long start, unsigned long len, int n
678void __init paging_init(void) 679void __init paging_init(void)
679{ 680{
680 unsigned long max_dma; 681 unsigned long max_dma;
681 unsigned long zones_size[MAX_NR_ZONES];
682 unsigned long zholes_size[MAX_NR_ZONES];
683 unsigned long pfn_offset = 0; 682 unsigned long pfn_offset = 0;
683 unsigned long max_pfn = 0;
684 int node; 684 int node;
685 unsigned long max_zone_pfns[MAX_NR_ZONES];
685 686
686 max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT; 687 max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT;
687 688
@@ -698,47 +699,20 @@ void __init paging_init(void)
698#endif 699#endif
699 700
700 for_each_online_node(node) { 701 for_each_online_node(node) {
701 memset(zones_size, 0, sizeof(zones_size));
702 memset(zholes_size, 0, sizeof(zholes_size));
703
704 num_physpages += mem_data[node].num_physpages; 702 num_physpages += mem_data[node].num_physpages;
705
706 if (mem_data[node].min_pfn >= max_dma) {
707 /* All of this node's memory is above ZONE_DMA */
708 zones_size[ZONE_NORMAL] = mem_data[node].max_pfn -
709 mem_data[node].min_pfn;
710 zholes_size[ZONE_NORMAL] = mem_data[node].max_pfn -
711 mem_data[node].min_pfn -
712 mem_data[node].num_physpages;
713 } else if (mem_data[node].max_pfn < max_dma) {
714 /* All of this node's memory is in ZONE_DMA */
715 zones_size[ZONE_DMA] = mem_data[node].max_pfn -
716 mem_data[node].min_pfn;
717 zholes_size[ZONE_DMA] = mem_data[node].max_pfn -
718 mem_data[node].min_pfn -
719 mem_data[node].num_dma_physpages;
720 } else {
721 /* This node has memory in both zones */
722 zones_size[ZONE_DMA] = max_dma -
723 mem_data[node].min_pfn;
724 zholes_size[ZONE_DMA] = zones_size[ZONE_DMA] -
725 mem_data[node].num_dma_physpages;
726 zones_size[ZONE_NORMAL] = mem_data[node].max_pfn -
727 max_dma;
728 zholes_size[ZONE_NORMAL] = zones_size[ZONE_NORMAL] -
729 (mem_data[node].num_physpages -
730 mem_data[node].num_dma_physpages);
731 }
732
733 pfn_offset = mem_data[node].min_pfn; 703 pfn_offset = mem_data[node].min_pfn;
734 704
735#ifdef CONFIG_VIRTUAL_MEM_MAP 705#ifdef CONFIG_VIRTUAL_MEM_MAP
736 NODE_DATA(node)->node_mem_map = vmem_map + pfn_offset; 706 NODE_DATA(node)->node_mem_map = vmem_map + pfn_offset;
737#endif 707#endif
738 free_area_init_node(node, NODE_DATA(node), zones_size, 708 if (mem_data[node].max_pfn > max_pfn)
739 pfn_offset, zholes_size); 709 max_pfn = mem_data[node].max_pfn;
740 } 710 }
741 711
712 max_zone_pfns[ZONE_DMA] = max_dma;
713 max_zone_pfns[ZONE_NORMAL] = max_pfn;
714 free_area_init_nodes(max_zone_pfns);
715
742 zero_page_memmap_ptr = virt_to_page(ia64_imva(empty_zero_page)); 716 zero_page_memmap_ptr = virt_to_page(ia64_imva(empty_zero_page));
743} 717}
744 718
diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c
index 30617ccb4f7e..ff87a5cba399 100644
--- a/arch/ia64/mm/init.c
+++ b/arch/ia64/mm/init.c
@@ -593,6 +593,18 @@ find_largest_hole (u64 start, u64 end, void *arg)
593 last_end = end; 593 last_end = end;
594 return 0; 594 return 0;
595} 595}
596
597int __init
598register_active_ranges(u64 start, u64 end, void *nid)
599{
600 BUG_ON(nid == NULL);
601 BUG_ON(*(unsigned long *)nid >= MAX_NUMNODES);
602
603 add_active_range(*(unsigned long *)nid,
604 __pa(start) >> PAGE_SHIFT,
605 __pa(end) >> PAGE_SHIFT);
606 return 0;
607}
596#endif /* CONFIG_VIRTUAL_MEM_MAP */ 608#endif /* CONFIG_VIRTUAL_MEM_MAP */
597 609
598static int __init 610static int __init
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
index 60b45e79f080..15c7c670da39 100644
--- a/arch/ia64/pci/pci.c
+++ b/arch/ia64/pci/pci.c
@@ -562,7 +562,8 @@ pcibios_enable_device (struct pci_dev *dev, int mask)
562void 562void
563pcibios_disable_device (struct pci_dev *dev) 563pcibios_disable_device (struct pci_dev *dev)
564{ 564{
565 acpi_pci_irq_disable(dev); 565 if (dev->is_enabled)
566 acpi_pci_irq_disable(dev);
566} 567}
567 568
568void 569void
diff --git a/arch/ia64/sn/kernel/sn2/sn_hwperf.c b/arch/ia64/sn/kernel/sn2/sn_hwperf.c
index 9a8a29339d2d..b632b9c1e3b3 100644
--- a/arch/ia64/sn/kernel/sn2/sn_hwperf.c
+++ b/arch/ia64/sn/kernel/sn2/sn_hwperf.c
@@ -32,9 +32,10 @@
32#include <linux/cpumask.h> 32#include <linux/cpumask.h>
33#include <linux/smp_lock.h> 33#include <linux/smp_lock.h>
34#include <linux/nodemask.h> 34#include <linux/nodemask.h>
35#include <linux/smp.h>
36
35#include <asm/processor.h> 37#include <asm/processor.h>
36#include <asm/topology.h> 38#include <asm/topology.h>
37#include <asm/smp.h>
38#include <asm/semaphore.h> 39#include <asm/semaphore.h>
39#include <asm/uaccess.h> 40#include <asm/uaccess.h>
40#include <asm/sal.h> 41#include <asm/sal.h>