diff options
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/Kconfig | 8 | ||||
-rw-r--r-- | arch/s390/Kconfig.debug | 8 | ||||
-rw-r--r-- | arch/s390/kernel/entry.S | 7 | ||||
-rw-r--r-- | arch/s390/kernel/entry64.S | 7 | ||||
-rw-r--r-- | arch/s390/kernel/ipl.c | 27 | ||||
-rw-r--r-- | arch/s390/kernel/setup.c | 14 | ||||
-rw-r--r-- | arch/s390/kernel/smp.c | 13 | ||||
-rw-r--r-- | arch/s390/kernel/stacktrace.c | 31 | ||||
-rw-r--r-- | arch/s390/kernel/traps.c | 5 | ||||
-rw-r--r-- | arch/s390/kernel/vmlinux.lds.S | 2 | ||||
-rw-r--r-- | arch/s390/mm/init.c | 27 | ||||
-rw-r--r-- | arch/s390/mm/vmem.c | 5 |
12 files changed, 108 insertions, 46 deletions
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 82cbffd03654..92a4f7b4323a 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -16,6 +16,9 @@ config LOCKDEP_SUPPORT | |||
16 | config STACKTRACE_SUPPORT | 16 | config STACKTRACE_SUPPORT |
17 | def_bool y | 17 | def_bool y |
18 | 18 | ||
19 | config HAVE_LATENCYTOP_SUPPORT | ||
20 | def_bool y | ||
21 | |||
19 | config RWSEM_GENERIC_SPINLOCK | 22 | config RWSEM_GENERIC_SPINLOCK |
20 | bool | 23 | bool |
21 | 24 | ||
@@ -47,6 +50,11 @@ config NO_IOMEM | |||
47 | config NO_DMA | 50 | config NO_DMA |
48 | def_bool y | 51 | def_bool y |
49 | 52 | ||
53 | config GENERIC_LOCKBREAK | ||
54 | bool | ||
55 | default y | ||
56 | depends on SMP && PREEMPT | ||
57 | |||
50 | mainmenu "Linux Kernel Configuration" | 58 | mainmenu "Linux Kernel Configuration" |
51 | 59 | ||
52 | config S390 | 60 | config S390 |
diff --git a/arch/s390/Kconfig.debug b/arch/s390/Kconfig.debug index 2283933a9a93..4599fa06bd82 100644 --- a/arch/s390/Kconfig.debug +++ b/arch/s390/Kconfig.debug | |||
@@ -6,4 +6,12 @@ config TRACE_IRQFLAGS_SUPPORT | |||
6 | 6 | ||
7 | source "lib/Kconfig.debug" | 7 | source "lib/Kconfig.debug" |
8 | 8 | ||
9 | config DEBUG_PAGEALLOC | ||
10 | bool "Debug page memory allocations" | ||
11 | depends on DEBUG_KERNEL | ||
12 | help | ||
13 | Unmap pages from the kernel linear mapping after free_pages(). | ||
14 | This results in a slowdown, but helps to find certain types of | ||
15 | memory corruptions. | ||
16 | |||
9 | endmenu | 17 | endmenu |
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 1a6dac8df6fb..6766e37fe8ea 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
@@ -11,6 +11,7 @@ | |||
11 | 11 | ||
12 | #include <linux/sys.h> | 12 | #include <linux/sys.h> |
13 | #include <linux/linkage.h> | 13 | #include <linux/linkage.h> |
14 | #include <linux/init.h> | ||
14 | #include <asm/cache.h> | 15 | #include <asm/cache.h> |
15 | #include <asm/lowcore.h> | 16 | #include <asm/lowcore.h> |
16 | #include <asm/errno.h> | 17 | #include <asm/errno.h> |
@@ -830,9 +831,7 @@ mcck_return: | |||
830 | * Restart interruption handler, kick starter for additional CPUs | 831 | * Restart interruption handler, kick starter for additional CPUs |
831 | */ | 832 | */ |
832 | #ifdef CONFIG_SMP | 833 | #ifdef CONFIG_SMP |
833 | #ifndef CONFIG_HOTPLUG_CPU | 834 | __CPUINIT |
834 | .section .init.text,"ax" | ||
835 | #endif | ||
836 | .globl restart_int_handler | 835 | .globl restart_int_handler |
837 | restart_int_handler: | 836 | restart_int_handler: |
838 | l %r15,__LC_SAVE_AREA+60 # load ksp | 837 | l %r15,__LC_SAVE_AREA+60 # load ksp |
@@ -845,9 +844,7 @@ restart_int_handler: | |||
845 | br %r14 # branch to start_secondary | 844 | br %r14 # branch to start_secondary |
846 | restart_addr: | 845 | restart_addr: |
847 | .long start_secondary | 846 | .long start_secondary |
848 | #ifndef CONFIG_HOTPLUG_CPU | ||
849 | .previous | 847 | .previous |
850 | #endif | ||
851 | #else | 848 | #else |
852 | /* | 849 | /* |
853 | * If we do not run with SMP enabled, let the new CPU crash ... | 850 | * If we do not run with SMP enabled, let the new CPU crash ... |
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index a3e47b893f07..efde6e178f6c 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -11,6 +11,7 @@ | |||
11 | 11 | ||
12 | #include <linux/sys.h> | 12 | #include <linux/sys.h> |
13 | #include <linux/linkage.h> | 13 | #include <linux/linkage.h> |
14 | #include <linux/init.h> | ||
14 | #include <asm/cache.h> | 15 | #include <asm/cache.h> |
15 | #include <asm/lowcore.h> | 16 | #include <asm/lowcore.h> |
16 | #include <asm/errno.h> | 17 | #include <asm/errno.h> |
@@ -801,9 +802,7 @@ mcck_return: | |||
801 | * Restart interruption handler, kick starter for additional CPUs | 802 | * Restart interruption handler, kick starter for additional CPUs |
802 | */ | 803 | */ |
803 | #ifdef CONFIG_SMP | 804 | #ifdef CONFIG_SMP |
804 | #ifndef CONFIG_HOTPLUG_CPU | 805 | __CPUINIT |
805 | .section .init.text,"ax" | ||
806 | #endif | ||
807 | .globl restart_int_handler | 806 | .globl restart_int_handler |
808 | restart_int_handler: | 807 | restart_int_handler: |
809 | lg %r15,__LC_SAVE_AREA+120 # load ksp | 808 | lg %r15,__LC_SAVE_AREA+120 # load ksp |
@@ -814,9 +813,7 @@ restart_int_handler: | |||
814 | lmg %r6,%r15,__SF_GPRS(%r15) # load registers from clone | 813 | lmg %r6,%r15,__SF_GPRS(%r15) # load registers from clone |
815 | stosm __SF_EMPTY(%r15),0x04 # now we can turn dat on | 814 | stosm __SF_EMPTY(%r15),0x04 # now we can turn dat on |
816 | jg start_secondary | 815 | jg start_secondary |
817 | #ifndef CONFIG_HOTPLUG_CPU | ||
818 | .previous | 816 | .previous |
819 | #endif | ||
820 | #else | 817 | #else |
821 | /* | 818 | /* |
822 | * If we do not run with SMP enabled, let the new CPU crash ... | 819 | * If we do not run with SMP enabled, let the new CPU crash ... |
diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c index db28cca81fef..60acdc266db1 100644 --- a/arch/s390/kernel/ipl.c +++ b/arch/s390/kernel/ipl.c | |||
@@ -439,7 +439,7 @@ static void ipl_run(struct shutdown_trigger *trigger) | |||
439 | reipl_ccw_dev(&ipl_info.data.ccw.dev_id); | 439 | reipl_ccw_dev(&ipl_info.data.ccw.dev_id); |
440 | } | 440 | } |
441 | 441 | ||
442 | static int ipl_init(void) | 442 | static int __init ipl_init(void) |
443 | { | 443 | { |
444 | int rc; | 444 | int rc; |
445 | 445 | ||
@@ -471,8 +471,11 @@ out: | |||
471 | return 0; | 471 | return 0; |
472 | } | 472 | } |
473 | 473 | ||
474 | static struct shutdown_action ipl_action = {SHUTDOWN_ACTION_IPL_STR, ipl_run, | 474 | static struct shutdown_action __refdata ipl_action = { |
475 | ipl_init}; | 475 | .name = SHUTDOWN_ACTION_IPL_STR, |
476 | .fn = ipl_run, | ||
477 | .init = ipl_init, | ||
478 | }; | ||
476 | 479 | ||
477 | /* | 480 | /* |
478 | * reipl shutdown action: Reboot Linux on shutdown. | 481 | * reipl shutdown action: Reboot Linux on shutdown. |
@@ -792,7 +795,7 @@ static int __init reipl_fcp_init(void) | |||
792 | return 0; | 795 | return 0; |
793 | } | 796 | } |
794 | 797 | ||
795 | static int reipl_init(void) | 798 | static int __init reipl_init(void) |
796 | { | 799 | { |
797 | int rc; | 800 | int rc; |
798 | 801 | ||
@@ -819,8 +822,11 @@ static int reipl_init(void) | |||
819 | return 0; | 822 | return 0; |
820 | } | 823 | } |
821 | 824 | ||
822 | static struct shutdown_action reipl_action = {SHUTDOWN_ACTION_REIPL_STR, | 825 | static struct shutdown_action __refdata reipl_action = { |
823 | reipl_run, reipl_init}; | 826 | .name = SHUTDOWN_ACTION_REIPL_STR, |
827 | .fn = reipl_run, | ||
828 | .init = reipl_init, | ||
829 | }; | ||
824 | 830 | ||
825 | /* | 831 | /* |
826 | * dump shutdown action: Dump Linux on shutdown. | 832 | * dump shutdown action: Dump Linux on shutdown. |
@@ -998,7 +1004,7 @@ static int __init dump_fcp_init(void) | |||
998 | return 0; | 1004 | return 0; |
999 | } | 1005 | } |
1000 | 1006 | ||
1001 | static int dump_init(void) | 1007 | static int __init dump_init(void) |
1002 | { | 1008 | { |
1003 | int rc; | 1009 | int rc; |
1004 | 1010 | ||
@@ -1020,8 +1026,11 @@ static int dump_init(void) | |||
1020 | return 0; | 1026 | return 0; |
1021 | } | 1027 | } |
1022 | 1028 | ||
1023 | static struct shutdown_action dump_action = {SHUTDOWN_ACTION_DUMP_STR, | 1029 | static struct shutdown_action __refdata dump_action = { |
1024 | dump_run, dump_init}; | 1030 | .name = SHUTDOWN_ACTION_DUMP_STR, |
1031 | .fn = dump_run, | ||
1032 | .init = dump_init, | ||
1033 | }; | ||
1025 | 1034 | ||
1026 | /* | 1035 | /* |
1027 | * vmcmd shutdown action: Trigger vm command on shutdown. | 1036 | * vmcmd shutdown action: Trigger vm command on shutdown. |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 766c783bd7a7..29ae165d1749 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -77,7 +77,7 @@ unsigned long machine_flags = 0; | |||
77 | unsigned long elf_hwcap = 0; | 77 | unsigned long elf_hwcap = 0; |
78 | char elf_platform[ELF_PLATFORM_SIZE]; | 78 | char elf_platform[ELF_PLATFORM_SIZE]; |
79 | 79 | ||
80 | struct mem_chunk __initdata memory_chunk[MEMORY_CHUNKS]; | 80 | struct mem_chunk __meminitdata memory_chunk[MEMORY_CHUNKS]; |
81 | volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */ | 81 | volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */ |
82 | static unsigned long __initdata memory_end; | 82 | static unsigned long __initdata memory_end; |
83 | 83 | ||
@@ -145,7 +145,7 @@ __setup("condev=", condev_setup); | |||
145 | 145 | ||
146 | static int __init conmode_setup(char *str) | 146 | static int __init conmode_setup(char *str) |
147 | { | 147 | { |
148 | #if defined(CONFIG_SCLP_CONSOLE) | 148 | #if defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE) |
149 | if (strncmp(str, "hwc", 4) == 0 || strncmp(str, "sclp", 5) == 0) | 149 | if (strncmp(str, "hwc", 4) == 0 || strncmp(str, "sclp", 5) == 0) |
150 | SET_CONSOLE_SCLP; | 150 | SET_CONSOLE_SCLP; |
151 | #endif | 151 | #endif |
@@ -183,7 +183,7 @@ static void __init conmode_default(void) | |||
183 | */ | 183 | */ |
184 | cpcmd("TERM CONMODE 3215", NULL, 0, NULL); | 184 | cpcmd("TERM CONMODE 3215", NULL, 0, NULL); |
185 | if (ptr == NULL) { | 185 | if (ptr == NULL) { |
186 | #if defined(CONFIG_SCLP_CONSOLE) | 186 | #if defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE) |
187 | SET_CONSOLE_SCLP; | 187 | SET_CONSOLE_SCLP; |
188 | #endif | 188 | #endif |
189 | return; | 189 | return; |
@@ -193,7 +193,7 @@ static void __init conmode_default(void) | |||
193 | SET_CONSOLE_3270; | 193 | SET_CONSOLE_3270; |
194 | #elif defined(CONFIG_TN3215_CONSOLE) | 194 | #elif defined(CONFIG_TN3215_CONSOLE) |
195 | SET_CONSOLE_3215; | 195 | SET_CONSOLE_3215; |
196 | #elif defined(CONFIG_SCLP_CONSOLE) | 196 | #elif defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE) |
197 | SET_CONSOLE_SCLP; | 197 | SET_CONSOLE_SCLP; |
198 | #endif | 198 | #endif |
199 | } else if (strncmp(ptr + 8, "3215", 4) == 0) { | 199 | } else if (strncmp(ptr + 8, "3215", 4) == 0) { |
@@ -201,7 +201,7 @@ static void __init conmode_default(void) | |||
201 | SET_CONSOLE_3215; | 201 | SET_CONSOLE_3215; |
202 | #elif defined(CONFIG_TN3270_CONSOLE) | 202 | #elif defined(CONFIG_TN3270_CONSOLE) |
203 | SET_CONSOLE_3270; | 203 | SET_CONSOLE_3270; |
204 | #elif defined(CONFIG_SCLP_CONSOLE) | 204 | #elif defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE) |
205 | SET_CONSOLE_SCLP; | 205 | SET_CONSOLE_SCLP; |
206 | #endif | 206 | #endif |
207 | } | 207 | } |
@@ -212,7 +212,7 @@ static void __init conmode_default(void) | |||
212 | SET_CONSOLE_3270; | 212 | SET_CONSOLE_3270; |
213 | #endif | 213 | #endif |
214 | } else { | 214 | } else { |
215 | #if defined(CONFIG_SCLP_CONSOLE) | 215 | #if defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE) |
216 | SET_CONSOLE_SCLP; | 216 | SET_CONSOLE_SCLP; |
217 | #endif | 217 | #endif |
218 | } | 218 | } |
@@ -528,7 +528,7 @@ static void __init setup_memory_end(void) | |||
528 | memory_size = 0; | 528 | memory_size = 0; |
529 | memory_end &= PAGE_MASK; | 529 | memory_end &= PAGE_MASK; |
530 | 530 | ||
531 | max_mem = memory_end ? min(VMALLOC_START, memory_end) : VMALLOC_START; | 531 | max_mem = memory_end ? min(VMEM_MAX_PHYS, memory_end) : VMEM_MAX_PHYS; |
532 | memory_end = min(max_mem, memory_end); | 532 | memory_end = min(max_mem, memory_end); |
533 | 533 | ||
534 | /* | 534 | /* |
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index aa37fa154512..85060659fb12 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -225,12 +225,11 @@ EXPORT_SYMBOL(smp_call_function_single); | |||
225 | * You must not call this function with disabled interrupts or from a | 225 | * You must not call this function with disabled interrupts or from a |
226 | * hardware interrupt handler or from a bottom half handler. | 226 | * hardware interrupt handler or from a bottom half handler. |
227 | */ | 227 | */ |
228 | int | 228 | int smp_call_function_mask(cpumask_t mask, void (*func)(void *), void *info, |
229 | smp_call_function_mask(cpumask_t mask, | 229 | int wait) |
230 | void (*func)(void *), void *info, | ||
231 | int wait) | ||
232 | { | 230 | { |
233 | preempt_disable(); | 231 | preempt_disable(); |
232 | cpu_clear(smp_processor_id(), mask); | ||
234 | __smp_call_function_map(func, info, 0, wait, mask); | 233 | __smp_call_function_map(func, info, 0, wait, mask); |
235 | preempt_enable(); | 234 | preempt_enable(); |
236 | return 0; | 235 | return 0; |
@@ -1008,7 +1007,7 @@ static struct notifier_block __cpuinitdata smp_cpu_nb = { | |||
1008 | .notifier_call = smp_cpu_notify, | 1007 | .notifier_call = smp_cpu_notify, |
1009 | }; | 1008 | }; |
1010 | 1009 | ||
1011 | static int smp_add_present_cpu(int cpu) | 1010 | static int __devinit smp_add_present_cpu(int cpu) |
1012 | { | 1011 | { |
1013 | struct cpu *c = &per_cpu(cpu_devices, cpu); | 1012 | struct cpu *c = &per_cpu(cpu_devices, cpu); |
1014 | struct sys_device *s = &c->sysdev; | 1013 | struct sys_device *s = &c->sysdev; |
@@ -1036,8 +1035,8 @@ out: | |||
1036 | } | 1035 | } |
1037 | 1036 | ||
1038 | #ifdef CONFIG_HOTPLUG_CPU | 1037 | #ifdef CONFIG_HOTPLUG_CPU |
1039 | static ssize_t rescan_store(struct sys_device *dev, const char *buf, | 1038 | static ssize_t __ref rescan_store(struct sys_device *dev, |
1040 | size_t count) | 1039 | const char *buf, size_t count) |
1041 | { | 1040 | { |
1042 | cpumask_t newcpus; | 1041 | cpumask_t newcpus; |
1043 | int cpu; | 1042 | int cpu; |
diff --git a/arch/s390/kernel/stacktrace.c b/arch/s390/kernel/stacktrace.c index da6924729964..85e46a5d0e08 100644 --- a/arch/s390/kernel/stacktrace.c +++ b/arch/s390/kernel/stacktrace.c | |||
@@ -14,7 +14,8 @@ | |||
14 | static unsigned long save_context_stack(struct stack_trace *trace, | 14 | static unsigned long save_context_stack(struct stack_trace *trace, |
15 | unsigned long sp, | 15 | unsigned long sp, |
16 | unsigned long low, | 16 | unsigned long low, |
17 | unsigned long high) | 17 | unsigned long high, |
18 | int savesched) | ||
18 | { | 19 | { |
19 | struct stack_frame *sf; | 20 | struct stack_frame *sf; |
20 | struct pt_regs *regs; | 21 | struct pt_regs *regs; |
@@ -47,10 +48,12 @@ static unsigned long save_context_stack(struct stack_trace *trace, | |||
47 | return sp; | 48 | return sp; |
48 | regs = (struct pt_regs *)sp; | 49 | regs = (struct pt_regs *)sp; |
49 | addr = regs->psw.addr & PSW_ADDR_INSN; | 50 | addr = regs->psw.addr & PSW_ADDR_INSN; |
50 | if (!trace->skip) | 51 | if (savesched || !in_sched_functions(addr)) { |
51 | trace->entries[trace->nr_entries++] = addr; | 52 | if (!trace->skip) |
52 | else | 53 | trace->entries[trace->nr_entries++] = addr; |
53 | trace->skip--; | 54 | else |
55 | trace->skip--; | ||
56 | } | ||
54 | if (trace->nr_entries >= trace->max_entries) | 57 | if (trace->nr_entries >= trace->max_entries) |
55 | return sp; | 58 | return sp; |
56 | low = sp; | 59 | low = sp; |
@@ -66,15 +69,27 @@ void save_stack_trace(struct stack_trace *trace) | |||
66 | orig_sp = sp & PSW_ADDR_INSN; | 69 | orig_sp = sp & PSW_ADDR_INSN; |
67 | new_sp = save_context_stack(trace, orig_sp, | 70 | new_sp = save_context_stack(trace, orig_sp, |
68 | S390_lowcore.panic_stack - PAGE_SIZE, | 71 | S390_lowcore.panic_stack - PAGE_SIZE, |
69 | S390_lowcore.panic_stack); | 72 | S390_lowcore.panic_stack, 1); |
70 | if (new_sp != orig_sp) | 73 | if (new_sp != orig_sp) |
71 | return; | 74 | return; |
72 | new_sp = save_context_stack(trace, new_sp, | 75 | new_sp = save_context_stack(trace, new_sp, |
73 | S390_lowcore.async_stack - ASYNC_SIZE, | 76 | S390_lowcore.async_stack - ASYNC_SIZE, |
74 | S390_lowcore.async_stack); | 77 | S390_lowcore.async_stack, 1); |
75 | if (new_sp != orig_sp) | 78 | if (new_sp != orig_sp) |
76 | return; | 79 | return; |
77 | save_context_stack(trace, new_sp, | 80 | save_context_stack(trace, new_sp, |
78 | S390_lowcore.thread_info, | 81 | S390_lowcore.thread_info, |
79 | S390_lowcore.thread_info + THREAD_SIZE); | 82 | S390_lowcore.thread_info + THREAD_SIZE, 1); |
83 | } | ||
84 | |||
85 | void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace) | ||
86 | { | ||
87 | unsigned long sp, low, high; | ||
88 | |||
89 | sp = tsk->thread.ksp & PSW_ADDR_INSN; | ||
90 | low = (unsigned long) task_stack_page(tsk); | ||
91 | high = (unsigned long) task_pt_regs(tsk); | ||
92 | save_context_stack(trace, sp, low, high, 0); | ||
93 | if (trace->nr_entries < trace->max_entries) | ||
94 | trace->entries[trace->nr_entries++] = ULONG_MAX; | ||
80 | } | 95 | } |
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index 52b8342c6bf2..1a2fdb6991df 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c | |||
@@ -271,7 +271,10 @@ void die(const char * str, struct pt_regs * regs, long err) | |||
271 | printk("PREEMPT "); | 271 | printk("PREEMPT "); |
272 | #endif | 272 | #endif |
273 | #ifdef CONFIG_SMP | 273 | #ifdef CONFIG_SMP |
274 | printk("SMP"); | 274 | printk("SMP "); |
275 | #endif | ||
276 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
277 | printk("DEBUG_PAGEALLOC"); | ||
275 | #endif | 278 | #endif |
276 | printk("\n"); | 279 | printk("\n"); |
277 | notify_die(DIE_OOPS, str, regs, err, current->thread.trap_no, SIGSEGV); | 280 | notify_die(DIE_OOPS, str, regs, err, current->thread.trap_no, SIGSEGV); |
diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index 7d43c3cd3ef3..b4607155e8d0 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S | |||
@@ -35,7 +35,7 @@ SECTIONS | |||
35 | KPROBES_TEXT | 35 | KPROBES_TEXT |
36 | *(.fixup) | 36 | *(.fixup) |
37 | *(.gnu.warning) | 37 | *(.gnu.warning) |
38 | } = 0x0700 | 38 | } :text = 0x0700 |
39 | 39 | ||
40 | _etext = .; /* End of text section */ | 40 | _etext = .; /* End of text section */ |
41 | 41 | ||
diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index b234bb4a6da7..983ec6ec0e7c 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c | |||
@@ -167,6 +167,33 @@ void __init mem_init(void) | |||
167 | PFN_ALIGN((unsigned long)&_eshared) - 1); | 167 | PFN_ALIGN((unsigned long)&_eshared) - 1); |
168 | } | 168 | } |
169 | 169 | ||
170 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
171 | void kernel_map_pages(struct page *page, int numpages, int enable) | ||
172 | { | ||
173 | pgd_t *pgd; | ||
174 | pud_t *pud; | ||
175 | pmd_t *pmd; | ||
176 | pte_t *pte; | ||
177 | unsigned long address; | ||
178 | int i; | ||
179 | |||
180 | for (i = 0; i < numpages; i++) { | ||
181 | address = page_to_phys(page + i); | ||
182 | pgd = pgd_offset_k(address); | ||
183 | pud = pud_offset(pgd, address); | ||
184 | pmd = pmd_offset(pud, address); | ||
185 | pte = pte_offset_kernel(pmd, address); | ||
186 | if (!enable) { | ||
187 | ptep_invalidate(address, pte); | ||
188 | continue; | ||
189 | } | ||
190 | *pte = mk_pte_phys(address, __pgprot(_PAGE_TYPE_RW)); | ||
191 | /* Flush cpu write queue. */ | ||
192 | mb(); | ||
193 | } | ||
194 | } | ||
195 | #endif | ||
196 | |||
170 | void free_initmem(void) | 197 | void free_initmem(void) |
171 | { | 198 | { |
172 | unsigned long addr; | 199 | unsigned long addr; |
diff --git a/arch/s390/mm/vmem.c b/arch/s390/mm/vmem.c index 79d13a166a3d..7c1287ccf788 100644 --- a/arch/s390/mm/vmem.c +++ b/arch/s390/mm/vmem.c | |||
@@ -62,7 +62,7 @@ void __meminit memmap_init(unsigned long size, int nid, unsigned long zone, | |||
62 | } | 62 | } |
63 | } | 63 | } |
64 | 64 | ||
65 | static void __init_refok *vmem_alloc_pages(unsigned int order) | 65 | static void __ref *vmem_alloc_pages(unsigned int order) |
66 | { | 66 | { |
67 | if (slab_is_available()) | 67 | if (slab_is_available()) |
68 | return (void *)__get_free_pages(GFP_KERNEL, order); | 68 | return (void *)__get_free_pages(GFP_KERNEL, order); |
@@ -250,7 +250,7 @@ static int insert_memory_segment(struct memory_segment *seg) | |||
250 | { | 250 | { |
251 | struct memory_segment *tmp; | 251 | struct memory_segment *tmp; |
252 | 252 | ||
253 | if (seg->start + seg->size >= VMALLOC_START || | 253 | if (seg->start + seg->size >= VMEM_MAX_PHYS || |
254 | seg->start + seg->size < seg->start) | 254 | seg->start + seg->size < seg->start) |
255 | return -ERANGE; | 255 | return -ERANGE; |
256 | 256 | ||
@@ -360,7 +360,6 @@ void __init vmem_map_init(void) | |||
360 | { | 360 | { |
361 | int i; | 361 | int i; |
362 | 362 | ||
363 | BUILD_BUG_ON((unsigned long)VMEM_MAP + VMEM_MAP_SIZE > VMEM_MAP_MAX); | ||
364 | NODE_DATA(0)->node_mem_map = VMEM_MAP; | 363 | NODE_DATA(0)->node_mem_map = VMEM_MAP; |
365 | for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) | 364 | for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) |
366 | vmem_add_mem(memory_chunk[i].addr, memory_chunk[i].size); | 365 | vmem_add_mem(memory_chunk[i].addr, memory_chunk[i].size); |