diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-06 20:24:58 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-06 20:24:58 -0500 |
commit | 0670afdf0e69e5e73c8358da9c39bf3a8807b03e (patch) | |
tree | 671e6030b1ad9c38513c1cba9a9116f9dee8d41a /arch | |
parent | dda2ac15d23b38e4335e858848aa8c9a6710304f (diff) | |
parent | 51099005ab8e09d68a13fea8d55bc739c1040ca6 (diff) |
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6: (27 commits)
[IA64] swiotlb abstraction (e.g. for Xen)
[IA64] swiotlb cleanup
[IA64] make swiotlb use bus_to_virt/virt_to_bus
[IA64] swiotlb bug fixes
[IA64] Hook up getcpu system call for IA64
[IA64] clean up sparsemem memory_present call
[IA64] show_mem() for IA64 sparsemem NUMA
[IA64] missing exports hwsw_sync_...
[IA64] virt_to_page() can be called with NULL arg
[IA64] alignment bug in ldscript
[IA64] register memory ranges in a consistent manner
[IA64] Enable SWIOTLB only when needed
[IA64-SGI] Check for TIO errors on shub2 Altix
[IA64] remove bogus prototype ia64_esi_init()
[IA64] Clear IRQ affinity when unregistered
[IA64] fix ACPI Kconfig issues
[IA64] Fix NULL-pointer dereference in ia64_machine_kexec()
[IA64] find thread for user rbs address
[IA64] use snprintf() on features field of /proc/cpuinfo
[IA64] enable singlestep on system call
...
Diffstat (limited to 'arch')
-rw-r--r-- | arch/ia64/Kconfig | 9 | ||||
-rw-r--r-- | arch/ia64/hp/common/hwsw_iommu.c | 4 | ||||
-rw-r--r-- | arch/ia64/kernel/crash.c | 16 | ||||
-rw-r--r-- | arch/ia64/kernel/crash_dump.c | 3 | ||||
-rw-r--r-- | arch/ia64/kernel/efi.c | 2 | ||||
-rw-r--r-- | arch/ia64/kernel/entry.S | 2 | ||||
-rw-r--r-- | arch/ia64/kernel/iosapic.c | 5 | ||||
-rw-r--r-- | arch/ia64/kernel/machine_kexec.c | 15 | ||||
-rw-r--r-- | arch/ia64/kernel/process.c | 16 | ||||
-rw-r--r-- | arch/ia64/kernel/ptrace.c | 14 | ||||
-rw-r--r-- | arch/ia64/kernel/setup.c | 31 | ||||
-rw-r--r-- | arch/ia64/kernel/vmlinux.lds.S | 1 | ||||
-rw-r--r-- | arch/ia64/mm/contig.c | 76 | ||||
-rw-r--r-- | arch/ia64/mm/discontig.c | 46 | ||||
-rw-r--r-- | arch/ia64/mm/init.c | 38 | ||||
-rw-r--r-- | arch/ia64/sn/kernel/huberror.c | 16 | ||||
-rw-r--r-- | arch/x86_64/kernel/pci-swiotlb.c | 2 |
17 files changed, 183 insertions, 113 deletions
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index fcacfe291b9b..f1d2899e9a62 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -11,6 +11,8 @@ menu "Processor type and features" | |||
11 | 11 | ||
12 | config IA64 | 12 | config IA64 |
13 | bool | 13 | bool |
14 | select PCI if (!IA64_HP_SIM) | ||
15 | select ACPI if (!IA64_HP_SIM) | ||
14 | default y | 16 | default y |
15 | help | 17 | help |
16 | The Itanium Processor Family is Intel's 64-bit successor to | 18 | The Itanium Processor Family is Intel's 64-bit successor to |
@@ -28,7 +30,6 @@ config MMU | |||
28 | 30 | ||
29 | config SWIOTLB | 31 | config SWIOTLB |
30 | bool | 32 | bool |
31 | default y | ||
32 | 33 | ||
33 | config RWSEM_XCHGADD_ALGORITHM | 34 | config RWSEM_XCHGADD_ALGORITHM |
34 | bool | 35 | bool |
@@ -84,10 +85,9 @@ choice | |||
84 | 85 | ||
85 | config IA64_GENERIC | 86 | config IA64_GENERIC |
86 | bool "generic" | 87 | bool "generic" |
87 | select ACPI | ||
88 | select PCI | ||
89 | select NUMA | 88 | select NUMA |
90 | select ACPI_NUMA | 89 | select ACPI_NUMA |
90 | select SWIOTLB | ||
91 | help | 91 | help |
92 | This selects the system type of your hardware. A "generic" kernel | 92 | This selects the system type of your hardware. A "generic" kernel |
93 | will run on any supported IA-64 system. However, if you configure | 93 | will run on any supported IA-64 system. However, if you configure |
@@ -104,6 +104,7 @@ config IA64_GENERIC | |||
104 | 104 | ||
105 | config IA64_DIG | 105 | config IA64_DIG |
106 | bool "DIG-compliant" | 106 | bool "DIG-compliant" |
107 | select SWIOTLB | ||
107 | 108 | ||
108 | config IA64_HP_ZX1 | 109 | config IA64_HP_ZX1 |
109 | bool "HP-zx1/sx1000" | 110 | bool "HP-zx1/sx1000" |
@@ -113,6 +114,7 @@ config IA64_HP_ZX1 | |||
113 | 114 | ||
114 | config IA64_HP_ZX1_SWIOTLB | 115 | config IA64_HP_ZX1_SWIOTLB |
115 | bool "HP-zx1/sx1000 with software I/O TLB" | 116 | bool "HP-zx1/sx1000 with software I/O TLB" |
117 | select SWIOTLB | ||
116 | help | 118 | help |
117 | Build a kernel that runs on HP zx1 and sx1000 systems even when they | 119 | Build a kernel that runs on HP zx1 and sx1000 systems even when they |
118 | have broken PCI devices which cannot DMA to full 32 bits. Apart | 120 | have broken PCI devices which cannot DMA to full 32 bits. Apart |
@@ -131,6 +133,7 @@ config IA64_SGI_SN2 | |||
131 | 133 | ||
132 | config IA64_HP_SIM | 134 | config IA64_HP_SIM |
133 | bool "Ski-simulator" | 135 | bool "Ski-simulator" |
136 | select SWIOTLB | ||
134 | 137 | ||
135 | endchoice | 138 | endchoice |
136 | 139 | ||
diff --git a/arch/ia64/hp/common/hwsw_iommu.c b/arch/ia64/hp/common/hwsw_iommu.c index a5a5637507be..2153bcacbe6c 100644 --- a/arch/ia64/hp/common/hwsw_iommu.c +++ b/arch/ia64/hp/common/hwsw_iommu.c | |||
@@ -192,3 +192,7 @@ EXPORT_SYMBOL(hwsw_unmap_sg); | |||
192 | EXPORT_SYMBOL(hwsw_dma_supported); | 192 | EXPORT_SYMBOL(hwsw_dma_supported); |
193 | EXPORT_SYMBOL(hwsw_alloc_coherent); | 193 | EXPORT_SYMBOL(hwsw_alloc_coherent); |
194 | EXPORT_SYMBOL(hwsw_free_coherent); | 194 | EXPORT_SYMBOL(hwsw_free_coherent); |
195 | EXPORT_SYMBOL(hwsw_sync_single_for_cpu); | ||
196 | EXPORT_SYMBOL(hwsw_sync_single_for_device); | ||
197 | EXPORT_SYMBOL(hwsw_sync_sg_for_cpu); | ||
198 | EXPORT_SYMBOL(hwsw_sync_sg_for_device); | ||
diff --git a/arch/ia64/kernel/crash.c b/arch/ia64/kernel/crash.c index bc2f64d72244..9d92097ce96d 100644 --- a/arch/ia64/kernel/crash.c +++ b/arch/ia64/kernel/crash.c | |||
@@ -79,6 +79,7 @@ crash_save_this_cpu() | |||
79 | final_note(buf); | 79 | final_note(buf); |
80 | } | 80 | } |
81 | 81 | ||
82 | #ifdef CONFIG_SMP | ||
82 | static int | 83 | static int |
83 | kdump_wait_cpu_freeze(void) | 84 | kdump_wait_cpu_freeze(void) |
84 | { | 85 | { |
@@ -91,6 +92,7 @@ kdump_wait_cpu_freeze(void) | |||
91 | } | 92 | } |
92 | return 1; | 93 | return 1; |
93 | } | 94 | } |
95 | #endif | ||
94 | 96 | ||
95 | void | 97 | void |
96 | machine_crash_shutdown(struct pt_regs *pt) | 98 | machine_crash_shutdown(struct pt_regs *pt) |
@@ -116,6 +118,11 @@ machine_crash_shutdown(struct pt_regs *pt) | |||
116 | static void | 118 | static void |
117 | machine_kdump_on_init(void) | 119 | machine_kdump_on_init(void) |
118 | { | 120 | { |
121 | if (!ia64_kimage) { | ||
122 | printk(KERN_NOTICE "machine_kdump_on_init(): " | ||
123 | "kdump not configured\n"); | ||
124 | return; | ||
125 | } | ||
119 | local_irq_disable(); | 126 | local_irq_disable(); |
120 | kexec_disable_iosapic(); | 127 | kexec_disable_iosapic(); |
121 | machine_kexec(ia64_kimage); | 128 | machine_kexec(ia64_kimage); |
@@ -132,11 +139,12 @@ kdump_cpu_freeze(struct unw_frame_info *info, void *arg) | |||
132 | atomic_inc(&kdump_cpu_freezed); | 139 | atomic_inc(&kdump_cpu_freezed); |
133 | kdump_status[cpuid] = 1; | 140 | kdump_status[cpuid] = 1; |
134 | mb(); | 141 | mb(); |
135 | if (cpuid == 0) { | 142 | #ifdef CONFIG_HOTPLUG_CPU |
136 | for (;;) | 143 | if (cpuid != 0) |
137 | cpu_relax(); | ||
138 | } else | ||
139 | ia64_jump_to_sal(&sal_boot_rendez_state[cpuid]); | 144 | ia64_jump_to_sal(&sal_boot_rendez_state[cpuid]); |
145 | #endif | ||
146 | for (;;) | ||
147 | cpu_relax(); | ||
140 | } | 148 | } |
141 | 149 | ||
142 | static int | 150 | static int |
diff --git a/arch/ia64/kernel/crash_dump.c b/arch/ia64/kernel/crash_dump.c index 83b8c91c1408..da60e90eeeb1 100644 --- a/arch/ia64/kernel/crash_dump.c +++ b/arch/ia64/kernel/crash_dump.c | |||
@@ -9,7 +9,8 @@ | |||
9 | #include <linux/errno.h> | 9 | #include <linux/errno.h> |
10 | #include <linux/types.h> | 10 | #include <linux/types.h> |
11 | 11 | ||
12 | #include <linux/uaccess.h> | 12 | #include <asm/page.h> |
13 | #include <asm/uaccess.h> | ||
13 | 14 | ||
14 | /** | 15 | /** |
15 | * copy_oldmem_page - copy one page from "oldmem" | 16 | * copy_oldmem_page - copy one page from "oldmem" |
diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c index 0b25a7d4e1e4..6c03928544c2 100644 --- a/arch/ia64/kernel/efi.c +++ b/arch/ia64/kernel/efi.c | |||
@@ -380,7 +380,7 @@ efi_get_pal_addr (void) | |||
380 | #endif | 380 | #endif |
381 | return __va(md->phys_addr); | 381 | return __va(md->phys_addr); |
382 | } | 382 | } |
383 | printk(KERN_WARNING "%s: no PAL-code memory-descriptor found", | 383 | printk(KERN_WARNING "%s: no PAL-code memory-descriptor found\n", |
384 | __FUNCTION__); | 384 | __FUNCTION__); |
385 | return NULL; | 385 | return NULL; |
386 | } | 386 | } |
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 15234ed3a341..e7873eeae448 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
@@ -1610,5 +1610,7 @@ sys_call_table: | |||
1610 | data8 sys_sync_file_range // 1300 | 1610 | data8 sys_sync_file_range // 1300 |
1611 | data8 sys_tee | 1611 | data8 sys_tee |
1612 | data8 sys_vmsplice | 1612 | data8 sys_vmsplice |
1613 | data8 sys_ni_syscall // reserved for move_pages | ||
1614 | data8 sys_getcpu | ||
1613 | 1615 | ||
1614 | .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls | 1616 | .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls |
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index 0fc5fb7865cf..d6aab40c6416 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
@@ -925,6 +925,11 @@ iosapic_unregister_intr (unsigned int gsi) | |||
925 | /* Clear the interrupt controller descriptor */ | 925 | /* Clear the interrupt controller descriptor */ |
926 | idesc->chip = &no_irq_type; | 926 | idesc->chip = &no_irq_type; |
927 | 927 | ||
928 | #ifdef CONFIG_SMP | ||
929 | /* Clear affinity */ | ||
930 | cpus_setall(idesc->affinity); | ||
931 | #endif | ||
932 | |||
928 | /* Clear the interrupt information */ | 933 | /* Clear the interrupt information */ |
929 | memset(&iosapic_intr_info[vector], 0, | 934 | memset(&iosapic_intr_info[vector], 0, |
930 | sizeof(struct iosapic_intr_info)); | 935 | sizeof(struct iosapic_intr_info)); |
diff --git a/arch/ia64/kernel/machine_kexec.c b/arch/ia64/kernel/machine_kexec.c index e2ccc9f660c5..4f0f3b8c1ee2 100644 --- a/arch/ia64/kernel/machine_kexec.c +++ b/arch/ia64/kernel/machine_kexec.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/kexec.h> | 14 | #include <linux/kexec.h> |
15 | #include <linux/cpu.h> | 15 | #include <linux/cpu.h> |
16 | #include <linux/irq.h> | 16 | #include <linux/irq.h> |
17 | #include <linux/efi.h> | ||
17 | #include <asm/mmu_context.h> | 18 | #include <asm/mmu_context.h> |
18 | #include <asm/setup.h> | 19 | #include <asm/setup.h> |
19 | #include <asm/delay.h> | 20 | #include <asm/delay.h> |
@@ -68,22 +69,10 @@ void machine_kexec_cleanup(struct kimage *image) | |||
68 | { | 69 | { |
69 | } | 70 | } |
70 | 71 | ||
71 | void machine_shutdown(void) | ||
72 | { | ||
73 | int cpu; | ||
74 | |||
75 | for_each_online_cpu(cpu) { | ||
76 | if (cpu != smp_processor_id()) | ||
77 | cpu_down(cpu); | ||
78 | } | ||
79 | kexec_disable_iosapic(); | ||
80 | } | ||
81 | |||
82 | /* | 72 | /* |
83 | * Do not allocate memory (or fail in any way) in machine_kexec(). | 73 | * Do not allocate memory (or fail in any way) in machine_kexec(). |
84 | * We are past the point of no return, committed to rebooting now. | 74 | * We are past the point of no return, committed to rebooting now. |
85 | */ | 75 | */ |
86 | extern void *efi_get_pal_addr(void); | ||
87 | static void ia64_machine_kexec(struct unw_frame_info *info, void *arg) | 76 | static void ia64_machine_kexec(struct unw_frame_info *info, void *arg) |
88 | { | 77 | { |
89 | struct kimage *image = arg; | 78 | struct kimage *image = arg; |
@@ -93,6 +82,7 @@ static void ia64_machine_kexec(struct unw_frame_info *info, void *arg) | |||
93 | unsigned long vector; | 82 | unsigned long vector; |
94 | int ii; | 83 | int ii; |
95 | 84 | ||
85 | BUG_ON(!image); | ||
96 | if (image->type == KEXEC_TYPE_CRASH) { | 86 | if (image->type == KEXEC_TYPE_CRASH) { |
97 | crash_save_this_cpu(); | 87 | crash_save_this_cpu(); |
98 | current->thread.ksp = (__u64)info->sw - 16; | 88 | current->thread.ksp = (__u64)info->sw - 16; |
@@ -131,6 +121,7 @@ static void ia64_machine_kexec(struct unw_frame_info *info, void *arg) | |||
131 | 121 | ||
132 | void machine_kexec(struct kimage *image) | 122 | void machine_kexec(struct kimage *image) |
133 | { | 123 | { |
124 | BUG_ON(!image); | ||
134 | unw_init_running(ia64_machine_kexec, image); | 125 | unw_init_running(ia64_machine_kexec, image); |
135 | for(;;); | 126 | for(;;); |
136 | } | 127 | } |
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c index 17685abaf496..ae96d4176995 100644 --- a/arch/ia64/kernel/process.c +++ b/arch/ia64/kernel/process.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <asm/ia32.h> | 34 | #include <asm/ia32.h> |
35 | #include <asm/irq.h> | 35 | #include <asm/irq.h> |
36 | #include <asm/kdebug.h> | 36 | #include <asm/kdebug.h> |
37 | #include <asm/kexec.h> | ||
37 | #include <asm/pgalloc.h> | 38 | #include <asm/pgalloc.h> |
38 | #include <asm/processor.h> | 39 | #include <asm/processor.h> |
39 | #include <asm/sal.h> | 40 | #include <asm/sal.h> |
@@ -803,6 +804,21 @@ cpu_halt (void) | |||
803 | ia64_pal_halt(min_power_state); | 804 | ia64_pal_halt(min_power_state); |
804 | } | 805 | } |
805 | 806 | ||
807 | void machine_shutdown(void) | ||
808 | { | ||
809 | #ifdef CONFIG_HOTPLUG_CPU | ||
810 | int cpu; | ||
811 | |||
812 | for_each_online_cpu(cpu) { | ||
813 | if (cpu != smp_processor_id()) | ||
814 | cpu_down(cpu); | ||
815 | } | ||
816 | #endif | ||
817 | #ifdef CONFIG_KEXEC | ||
818 | kexec_disable_iosapic(); | ||
819 | #endif | ||
820 | } | ||
821 | |||
806 | void | 822 | void |
807 | machine_restart (char *restart_cmd) | 823 | machine_restart (char *restart_cmd) |
808 | { | 824 | { |
diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c index aa705e46b974..3f8918782e0c 100644 --- a/arch/ia64/kernel/ptrace.c +++ b/arch/ia64/kernel/ptrace.c | |||
@@ -607,7 +607,7 @@ find_thread_for_addr (struct task_struct *child, unsigned long addr) | |||
607 | */ | 607 | */ |
608 | list_for_each_safe(this, next, ¤t->children) { | 608 | list_for_each_safe(this, next, ¤t->children) { |
609 | p = list_entry(this, struct task_struct, sibling); | 609 | p = list_entry(this, struct task_struct, sibling); |
610 | if (p->mm != mm) | 610 | if (p->tgid != child->tgid) |
611 | continue; | 611 | continue; |
612 | if (thread_matches(p, addr)) { | 612 | if (thread_matches(p, addr)) { |
613 | child = p; | 613 | child = p; |
@@ -1405,6 +1405,7 @@ ptrace_disable (struct task_struct *child) | |||
1405 | struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child)); | 1405 | struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child)); |
1406 | 1406 | ||
1407 | /* make sure the single step/taken-branch trap bits are not set: */ | 1407 | /* make sure the single step/taken-branch trap bits are not set: */ |
1408 | clear_tsk_thread_flag(child, TIF_SINGLESTEP); | ||
1408 | child_psr->ss = 0; | 1409 | child_psr->ss = 0; |
1409 | child_psr->tb = 0; | 1410 | child_psr->tb = 0; |
1410 | } | 1411 | } |
@@ -1525,6 +1526,7 @@ sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data) | |||
1525 | * Make sure the single step/taken-branch trap bits | 1526 | * Make sure the single step/taken-branch trap bits |
1526 | * are not set: | 1527 | * are not set: |
1527 | */ | 1528 | */ |
1529 | clear_tsk_thread_flag(child, TIF_SINGLESTEP); | ||
1528 | ia64_psr(pt)->ss = 0; | 1530 | ia64_psr(pt)->ss = 0; |
1529 | ia64_psr(pt)->tb = 0; | 1531 | ia64_psr(pt)->tb = 0; |
1530 | 1532 | ||
@@ -1556,6 +1558,7 @@ sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data) | |||
1556 | goto out_tsk; | 1558 | goto out_tsk; |
1557 | 1559 | ||
1558 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | 1560 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); |
1561 | set_tsk_thread_flag(child, TIF_SINGLESTEP); | ||
1559 | if (request == PTRACE_SINGLESTEP) { | 1562 | if (request == PTRACE_SINGLESTEP) { |
1560 | ia64_psr(pt)->ss = 1; | 1563 | ia64_psr(pt)->ss = 1; |
1561 | } else { | 1564 | } else { |
@@ -1595,13 +1598,9 @@ sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data) | |||
1595 | } | 1598 | } |
1596 | 1599 | ||
1597 | 1600 | ||
1598 | void | 1601 | static void |
1599 | syscall_trace (void) | 1602 | syscall_trace (void) |
1600 | { | 1603 | { |
1601 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | ||
1602 | return; | ||
1603 | if (!(current->ptrace & PT_PTRACED)) | ||
1604 | return; | ||
1605 | /* | 1604 | /* |
1606 | * The 0x80 provides a way for the tracing parent to | 1605 | * The 0x80 provides a way for the tracing parent to |
1607 | * distinguish between a syscall stop and SIGTRAP delivery. | 1606 | * distinguish between a syscall stop and SIGTRAP delivery. |
@@ -1664,7 +1663,8 @@ syscall_trace_leave (long arg0, long arg1, long arg2, long arg3, | |||
1664 | audit_syscall_exit(success, result); | 1663 | audit_syscall_exit(success, result); |
1665 | } | 1664 | } |
1666 | 1665 | ||
1667 | if (test_thread_flag(TIF_SYSCALL_TRACE) | 1666 | if ((test_thread_flag(TIF_SYSCALL_TRACE) |
1667 | || test_thread_flag(TIF_SINGLESTEP)) | ||
1668 | && (current->ptrace & PT_PTRACED)) | 1668 | && (current->ptrace & PT_PTRACED)) |
1669 | syscall_trace(); | 1669 | syscall_trace(); |
1670 | } | 1670 | } |
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index ad567b8d432e..83c2629e1c4c 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
@@ -569,34 +569,31 @@ show_cpuinfo (struct seq_file *m, void *v) | |||
569 | { 1UL << 1, "spontaneous deferral"}, | 569 | { 1UL << 1, "spontaneous deferral"}, |
570 | { 1UL << 2, "16-byte atomic ops" } | 570 | { 1UL << 2, "16-byte atomic ops" } |
571 | }; | 571 | }; |
572 | char features[128], *cp, sep; | 572 | char features[128], *cp, *sep; |
573 | struct cpuinfo_ia64 *c = v; | 573 | struct cpuinfo_ia64 *c = v; |
574 | unsigned long mask; | 574 | unsigned long mask; |
575 | unsigned long proc_freq; | 575 | unsigned long proc_freq; |
576 | int i; | 576 | int i, size; |
577 | 577 | ||
578 | mask = c->features; | 578 | mask = c->features; |
579 | 579 | ||
580 | /* build the feature string: */ | 580 | /* build the feature string: */ |
581 | memcpy(features, " standard", 10); | 581 | memcpy(features, "standard", 9); |
582 | cp = features; | 582 | cp = features; |
583 | sep = 0; | 583 | size = sizeof(features); |
584 | for (i = 0; i < (int) ARRAY_SIZE(feature_bits); ++i) { | 584 | sep = ""; |
585 | for (i = 0; i < ARRAY_SIZE(feature_bits) && size > 1; ++i) { | ||
585 | if (mask & feature_bits[i].mask) { | 586 | if (mask & feature_bits[i].mask) { |
586 | if (sep) | 587 | cp += snprintf(cp, size, "%s%s", sep, |
587 | *cp++ = sep; | 588 | feature_bits[i].feature_name), |
588 | sep = ','; | 589 | sep = ", "; |
589 | *cp++ = ' '; | ||
590 | strcpy(cp, feature_bits[i].feature_name); | ||
591 | cp += strlen(feature_bits[i].feature_name); | ||
592 | mask &= ~feature_bits[i].mask; | 590 | mask &= ~feature_bits[i].mask; |
591 | size = sizeof(features) - (cp - features); | ||
593 | } | 592 | } |
594 | } | 593 | } |
595 | if (mask) { | 594 | if (mask && size > 1) { |
596 | /* print unknown features as a hex value: */ | 595 | /* print unknown features as a hex value */ |
597 | if (sep) | 596 | snprintf(cp, size, "%s0x%lx", sep, mask); |
598 | *cp++ = sep; | ||
599 | sprintf(cp, " 0x%lx", mask); | ||
600 | } | 597 | } |
601 | 598 | ||
602 | proc_freq = cpufreq_quick_get(cpunum); | 599 | proc_freq = cpufreq_quick_get(cpunum); |
@@ -612,7 +609,7 @@ show_cpuinfo (struct seq_file *m, void *v) | |||
612 | "model name : %s\n" | 609 | "model name : %s\n" |
613 | "revision : %u\n" | 610 | "revision : %u\n" |
614 | "archrev : %u\n" | 611 | "archrev : %u\n" |
615 | "features :%s\n" /* don't change this---it _is_ right! */ | 612 | "features : %s\n" |
616 | "cpu number : %lu\n" | 613 | "cpu number : %lu\n" |
617 | "cpu regs : %u\n" | 614 | "cpu regs : %u\n" |
618 | "cpu MHz : %lu.%06lu\n" | 615 | "cpu MHz : %lu.%06lu\n" |
diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S index d6083a0936f4..8f3d0066f446 100644 --- a/arch/ia64/kernel/vmlinux.lds.S +++ b/arch/ia64/kernel/vmlinux.lds.S | |||
@@ -157,6 +157,7 @@ SECTIONS | |||
157 | } | 157 | } |
158 | #endif | 158 | #endif |
159 | 159 | ||
160 | . = ALIGN(8); | ||
160 | __con_initcall_start = .; | 161 | __con_initcall_start = .; |
161 | .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) | 162 | .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) |
162 | { *(.con_initcall.init) } | 163 | { *(.con_initcall.init) } |
diff --git a/arch/ia64/mm/contig.c b/arch/ia64/mm/contig.c index 1e79551231b9..63e6d49c5813 100644 --- a/arch/ia64/mm/contig.c +++ b/arch/ia64/mm/contig.c | |||
@@ -30,47 +30,69 @@ static unsigned long max_gap; | |||
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | /** | 32 | /** |
33 | * show_mem - display a memory statistics summary | 33 | * show_mem - give short summary of memory stats |
34 | * | 34 | * |
35 | * Just walks the pages in the system and describes where they're allocated. | 35 | * Shows a simple page count of reserved and used pages in the system. |
36 | * For discontig machines, it does this on a per-pgdat basis. | ||
36 | */ | 37 | */ |
37 | void | 38 | void show_mem(void) |
38 | show_mem (void) | ||
39 | { | 39 | { |
40 | int i, total = 0, reserved = 0; | 40 | int i, total_reserved = 0; |
41 | int shared = 0, cached = 0; | 41 | int total_shared = 0, total_cached = 0; |
42 | unsigned long total_present = 0; | ||
43 | pg_data_t *pgdat; | ||
42 | 44 | ||
43 | printk(KERN_INFO "Mem-info:\n"); | 45 | printk(KERN_INFO "Mem-info:\n"); |
44 | show_free_areas(); | 46 | show_free_areas(); |
45 | |||
46 | printk(KERN_INFO "Free swap: %6ldkB\n", | 47 | printk(KERN_INFO "Free swap: %6ldkB\n", |
47 | nr_swap_pages<<(PAGE_SHIFT-10)); | 48 | nr_swap_pages<<(PAGE_SHIFT-10)); |
48 | i = max_mapnr; | 49 | printk(KERN_INFO "Node memory in pages:\n"); |
49 | for (i = 0; i < max_mapnr; i++) { | 50 | for_each_online_pgdat(pgdat) { |
50 | if (!pfn_valid(i)) { | 51 | unsigned long present; |
52 | unsigned long flags; | ||
53 | int shared = 0, cached = 0, reserved = 0; | ||
54 | |||
55 | pgdat_resize_lock(pgdat, &flags); | ||
56 | present = pgdat->node_present_pages; | ||
57 | for(i = 0; i < pgdat->node_spanned_pages; i++) { | ||
58 | struct page *page; | ||
59 | if (pfn_valid(pgdat->node_start_pfn + i)) | ||
60 | page = pfn_to_page(pgdat->node_start_pfn + i); | ||
61 | else { | ||
51 | #ifdef CONFIG_VIRTUAL_MEM_MAP | 62 | #ifdef CONFIG_VIRTUAL_MEM_MAP |
52 | if (max_gap < LARGE_GAP) | 63 | if (max_gap < LARGE_GAP) |
53 | continue; | 64 | continue; |
54 | i = vmemmap_find_next_valid_pfn(0, i) - 1; | ||
55 | #endif | 65 | #endif |
56 | continue; | 66 | i = vmemmap_find_next_valid_pfn(pgdat->node_id, |
67 | i) - 1; | ||
68 | continue; | ||
69 | } | ||
70 | if (PageReserved(page)) | ||
71 | reserved++; | ||
72 | else if (PageSwapCache(page)) | ||
73 | cached++; | ||
74 | else if (page_count(page)) | ||
75 | shared += page_count(page)-1; | ||
57 | } | 76 | } |
58 | total++; | 77 | pgdat_resize_unlock(pgdat, &flags); |
59 | if (PageReserved(mem_map+i)) | 78 | total_present += present; |
60 | reserved++; | 79 | total_reserved += reserved; |
61 | else if (PageSwapCache(mem_map+i)) | 80 | total_cached += cached; |
62 | cached++; | 81 | total_shared += shared; |
63 | else if (page_count(mem_map + i)) | 82 | printk(KERN_INFO "Node %4d: RAM: %11ld, rsvd: %8d, " |
64 | shared += page_count(mem_map + i) - 1; | 83 | "shrd: %10d, swpd: %10d\n", pgdat->node_id, |
84 | present, reserved, shared, cached); | ||
65 | } | 85 | } |
66 | printk(KERN_INFO "%d pages of RAM\n", total); | 86 | printk(KERN_INFO "%ld pages of RAM\n", total_present); |
67 | printk(KERN_INFO "%d reserved pages\n", reserved); | 87 | printk(KERN_INFO "%d reserved pages\n", total_reserved); |
68 | printk(KERN_INFO "%d pages shared\n", shared); | 88 | printk(KERN_INFO "%d pages shared\n", total_shared); |
69 | printk(KERN_INFO "%d pages swap cached\n", cached); | 89 | printk(KERN_INFO "%d pages swap cached\n", total_cached); |
70 | printk(KERN_INFO "%ld pages in page table cache\n", | 90 | printk(KERN_INFO "Total of %ld pages in page table cache\n", |
71 | pgtable_quicklist_total_size()); | 91 | pgtable_quicklist_total_size()); |
92 | printk(KERN_INFO "%d free buffer pages\n", nr_free_buffer_pages()); | ||
72 | } | 93 | } |
73 | 94 | ||
95 | |||
74 | /* physical address where the bootmem map is located */ | 96 | /* physical address where the bootmem map is located */ |
75 | unsigned long bootmap_start; | 97 | unsigned long bootmap_start; |
76 | 98 | ||
@@ -177,7 +199,7 @@ find_memory (void) | |||
177 | 199 | ||
178 | #ifdef CONFIG_CRASH_DUMP | 200 | #ifdef CONFIG_CRASH_DUMP |
179 | /* If we are doing a crash dump, we still need to know the real mem | 201 | /* If we are doing a crash dump, we still need to know the real mem |
180 | * size before original memory map is * reset. */ | 202 | * size before original memory map is reset. */ |
181 | saved_max_pfn = max_pfn; | 203 | saved_max_pfn = max_pfn; |
182 | #endif | 204 | #endif |
183 | } | 205 | } |
diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c index 96722cb1b49d..6eae596c509d 100644 --- a/arch/ia64/mm/discontig.c +++ b/arch/ia64/mm/discontig.c | |||
@@ -412,37 +412,6 @@ static void __init memory_less_nodes(void) | |||
412 | return; | 412 | return; |
413 | } | 413 | } |
414 | 414 | ||
415 | #ifdef CONFIG_SPARSEMEM | ||
416 | /** | ||
417 | * register_sparse_mem - notify SPARSEMEM that this memory range exists. | ||
418 | * @start: physical start of range | ||
419 | * @end: physical end of range | ||
420 | * @arg: unused | ||
421 | * | ||
422 | * Simply calls SPARSEMEM to register memory section(s). | ||
423 | */ | ||
424 | static int __init register_sparse_mem(unsigned long start, unsigned long end, | ||
425 | void *arg) | ||
426 | { | ||
427 | int nid; | ||
428 | |||
429 | start = __pa(start) >> PAGE_SHIFT; | ||
430 | end = __pa(end) >> PAGE_SHIFT; | ||
431 | nid = early_pfn_to_nid(start); | ||
432 | memory_present(nid, start, end); | ||
433 | |||
434 | return 0; | ||
435 | } | ||
436 | |||
437 | static void __init arch_sparse_init(void) | ||
438 | { | ||
439 | efi_memmap_walk(register_sparse_mem, NULL); | ||
440 | sparse_init(); | ||
441 | } | ||
442 | #else | ||
443 | #define arch_sparse_init() do {} while (0) | ||
444 | #endif | ||
445 | |||
446 | /** | 415 | /** |
447 | * find_memory - walk the EFI memory map and setup the bootmem allocator | 416 | * find_memory - walk the EFI memory map and setup the bootmem allocator |
448 | * | 417 | * |
@@ -473,6 +442,9 @@ void __init find_memory(void) | |||
473 | node_clear(node, memory_less_mask); | 442 | node_clear(node, memory_less_mask); |
474 | mem_data[node].min_pfn = ~0UL; | 443 | mem_data[node].min_pfn = ~0UL; |
475 | } | 444 | } |
445 | |||
446 | efi_memmap_walk(register_active_ranges, NULL); | ||
447 | |||
476 | /* | 448 | /* |
477 | * Initialize the boot memory maps in reverse order since that's | 449 | * Initialize the boot memory maps in reverse order since that's |
478 | * what the bootmem allocator expects | 450 | * what the bootmem allocator expects |
@@ -506,6 +478,12 @@ void __init find_memory(void) | |||
506 | max_pfn = max_low_pfn; | 478 | max_pfn = max_low_pfn; |
507 | 479 | ||
508 | find_initrd(); | 480 | find_initrd(); |
481 | |||
482 | #ifdef CONFIG_CRASH_DUMP | ||
483 | /* If we are doing a crash dump, we still need to know the real mem | ||
484 | * size before original memory map is reset. */ | ||
485 | saved_max_pfn = max_pfn; | ||
486 | #endif | ||
509 | } | 487 | } |
510 | 488 | ||
511 | #ifdef CONFIG_SMP | 489 | #ifdef CONFIG_SMP |
@@ -654,7 +632,6 @@ static __init int count_node_pages(unsigned long start, unsigned long len, int n | |||
654 | { | 632 | { |
655 | unsigned long end = start + len; | 633 | unsigned long end = start + len; |
656 | 634 | ||
657 | add_active_range(node, start >> PAGE_SHIFT, end >> PAGE_SHIFT); | ||
658 | mem_data[node].num_physpages += len >> PAGE_SHIFT; | 635 | mem_data[node].num_physpages += len >> PAGE_SHIFT; |
659 | if (start <= __pa(MAX_DMA_ADDRESS)) | 636 | if (start <= __pa(MAX_DMA_ADDRESS)) |
660 | mem_data[node].num_dma_physpages += | 637 | mem_data[node].num_dma_physpages += |
@@ -686,10 +663,11 @@ void __init paging_init(void) | |||
686 | 663 | ||
687 | max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT; | 664 | max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT; |
688 | 665 | ||
689 | arch_sparse_init(); | ||
690 | |||
691 | efi_memmap_walk(filter_rsvd_memory, count_node_pages); | 666 | efi_memmap_walk(filter_rsvd_memory, count_node_pages); |
692 | 667 | ||
668 | sparse_memory_present_with_active_regions(MAX_NUMNODES); | ||
669 | sparse_init(); | ||
670 | |||
693 | #ifdef CONFIG_VIRTUAL_MEM_MAP | 671 | #ifdef CONFIG_VIRTUAL_MEM_MAP |
694 | vmalloc_end -= PAGE_ALIGN(ALIGN(max_low_pfn, MAX_ORDER_NR_PAGES) * | 672 | vmalloc_end -= PAGE_ALIGN(ALIGN(max_low_pfn, MAX_ORDER_NR_PAGES) * |
695 | sizeof(struct page)); | 673 | sizeof(struct page)); |
diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index 1373fae7657f..faaca21a3718 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/swap.h> | 19 | #include <linux/swap.h> |
20 | #include <linux/proc_fs.h> | 20 | #include <linux/proc_fs.h> |
21 | #include <linux/bitops.h> | 21 | #include <linux/bitops.h> |
22 | #include <linux/kexec.h> | ||
22 | 23 | ||
23 | #include <asm/a.out.h> | 24 | #include <asm/a.out.h> |
24 | #include <asm/dma.h> | 25 | #include <asm/dma.h> |
@@ -128,6 +129,25 @@ lazy_mmu_prot_update (pte_t pte) | |||
128 | set_bit(PG_arch_1, &page->flags); /* mark page as clean */ | 129 | set_bit(PG_arch_1, &page->flags); /* mark page as clean */ |
129 | } | 130 | } |
130 | 131 | ||
132 | /* | ||
133 | * Since DMA is i-cache coherent, any (complete) pages that were written via | ||
134 | * DMA can be marked as "clean" so that lazy_mmu_prot_update() doesn't have to | ||
135 | * flush them when they get mapped into an executable vm-area. | ||
136 | */ | ||
137 | void | ||
138 | dma_mark_clean(void *addr, size_t size) | ||
139 | { | ||
140 | unsigned long pg_addr, end; | ||
141 | |||
142 | pg_addr = PAGE_ALIGN((unsigned long) addr); | ||
143 | end = (unsigned long) addr + size; | ||
144 | while (pg_addr + PAGE_SIZE <= end) { | ||
145 | struct page *page = virt_to_page(pg_addr); | ||
146 | set_bit(PG_arch_1, &page->flags); | ||
147 | pg_addr += PAGE_SIZE; | ||
148 | } | ||
149 | } | ||
150 | |||
131 | inline void | 151 | inline void |
132 | ia64_set_rbs_bot (void) | 152 | ia64_set_rbs_bot (void) |
133 | { | 153 | { |
@@ -595,13 +615,27 @@ find_largest_hole (u64 start, u64 end, void *arg) | |||
595 | return 0; | 615 | return 0; |
596 | } | 616 | } |
597 | 617 | ||
618 | #endif /* CONFIG_VIRTUAL_MEM_MAP */ | ||
619 | |||
598 | int __init | 620 | int __init |
599 | register_active_ranges(u64 start, u64 end, void *arg) | 621 | register_active_ranges(u64 start, u64 end, void *arg) |
600 | { | 622 | { |
601 | add_active_range(0, __pa(start) >> PAGE_SHIFT, __pa(end) >> PAGE_SHIFT); | 623 | int nid = paddr_to_nid(__pa(start)); |
624 | |||
625 | if (nid < 0) | ||
626 | nid = 0; | ||
627 | #ifdef CONFIG_KEXEC | ||
628 | if (start > crashk_res.start && start < crashk_res.end) | ||
629 | start = crashk_res.end; | ||
630 | if (end > crashk_res.start && end < crashk_res.end) | ||
631 | end = crashk_res.start; | ||
632 | #endif | ||
633 | |||
634 | if (start < end) | ||
635 | add_active_range(nid, __pa(start) >> PAGE_SHIFT, | ||
636 | __pa(end) >> PAGE_SHIFT); | ||
602 | return 0; | 637 | return 0; |
603 | } | 638 | } |
604 | #endif /* CONFIG_VIRTUAL_MEM_MAP */ | ||
605 | 639 | ||
606 | static int __init | 640 | static int __init |
607 | count_reserved_pages (u64 start, u64 end, void *arg) | 641 | count_reserved_pages (u64 start, u64 end, void *arg) |
diff --git a/arch/ia64/sn/kernel/huberror.c b/arch/ia64/sn/kernel/huberror.c index abca6bd7962f..fcf7f93c4b61 100644 --- a/arch/ia64/sn/kernel/huberror.c +++ b/arch/ia64/sn/kernel/huberror.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
4 | * for more details. | 4 | * for more details. |
5 | * | 5 | * |
6 | * Copyright (C) 1992 - 1997, 2000,2002-2005 Silicon Graphics, Inc. All rights reserved. | 6 | * Copyright (C) 1992 - 1997, 2000,2002-2007 Silicon Graphics, Inc. All rights reserved. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/types.h> | 9 | #include <linux/types.h> |
@@ -38,12 +38,20 @@ static irqreturn_t hub_eint_handler(int irq, void *arg) | |||
38 | (u64) nasid, 0, 0, 0, 0, 0, 0); | 38 | (u64) nasid, 0, 0, 0, 0, 0, 0); |
39 | 39 | ||
40 | if ((int)ret_stuff.v0) | 40 | if ((int)ret_stuff.v0) |
41 | panic("hubii_eint_handler(): Fatal TIO Error"); | 41 | panic("%s: Fatal %s Error", __FUNCTION__, |
42 | ((nasid & 1) ? "TIO" : "HUBII")); | ||
42 | 43 | ||
43 | if (!(nasid & 1)) /* Not a TIO, handle CRB errors */ | 44 | if (!(nasid & 1)) /* Not a TIO, handle CRB errors */ |
44 | (void)hubiio_crb_error_handler(hubdev_info); | 45 | (void)hubiio_crb_error_handler(hubdev_info); |
45 | } else | 46 | } else |
46 | bte_error_handler((unsigned long)NODEPDA(nasid_to_cnodeid(nasid))); | 47 | if (nasid & 1) { /* TIO errors */ |
48 | SAL_CALL_NOLOCK(ret_stuff, SN_SAL_HUB_ERROR_INTERRUPT, | ||
49 | (u64) nasid, 0, 0, 0, 0, 0, 0); | ||
50 | |||
51 | if ((int)ret_stuff.v0) | ||
52 | panic("%s: Fatal TIO Error", __FUNCTION__); | ||
53 | } else | ||
54 | bte_error_handler((unsigned long)NODEPDA(nasid_to_cnodeid(nasid))); | ||
47 | 55 | ||
48 | return IRQ_HANDLED; | 56 | return IRQ_HANDLED; |
49 | } | 57 | } |
diff --git a/arch/x86_64/kernel/pci-swiotlb.c b/arch/x86_64/kernel/pci-swiotlb.c index 697f0aa794b9..eb18be5a6569 100644 --- a/arch/x86_64/kernel/pci-swiotlb.c +++ b/arch/x86_64/kernel/pci-swiotlb.c | |||
@@ -29,7 +29,7 @@ struct dma_mapping_ops swiotlb_dma_ops = { | |||
29 | .dma_supported = NULL, | 29 | .dma_supported = NULL, |
30 | }; | 30 | }; |
31 | 31 | ||
32 | void pci_swiotlb_init(void) | 32 | void __init pci_swiotlb_init(void) |
33 | { | 33 | { |
34 | /* don't initialize swiotlb if iommu=off (no_iommu=1) */ | 34 | /* don't initialize swiotlb if iommu=off (no_iommu=1) */ |
35 | if (!iommu_detected && !no_iommu && end_pfn > MAX_DMA32_PFN) | 35 | if (!iommu_detected && !no_iommu && end_pfn > MAX_DMA32_PFN) |