aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390')
-rw-r--r--arch/s390/Kconfig8
-rw-r--r--arch/s390/Kconfig.debug8
-rw-r--r--arch/s390/kernel/compat_wrapper.S8
-rw-r--r--arch/s390/kernel/entry.S7
-rw-r--r--arch/s390/kernel/entry64.S7
-rw-r--r--arch/s390/kernel/ipl.c27
-rw-r--r--arch/s390/kernel/setup.c14
-rw-r--r--arch/s390/kernel/smp.c13
-rw-r--r--arch/s390/kernel/stacktrace.c31
-rw-r--r--arch/s390/kernel/syscalls.S2
-rw-r--r--arch/s390/kernel/traps.c5
-rw-r--r--arch/s390/kernel/vmlinux.lds.S2
-rw-r--r--arch/s390/mm/init.c27
-rw-r--r--arch/s390/mm/vmem.c5
14 files changed, 109 insertions, 55 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
16config STACKTRACE_SUPPORT 16config STACKTRACE_SUPPORT
17 def_bool y 17 def_bool y
18 18
19config HAVE_LATENCYTOP_SUPPORT
20 def_bool y
21
19config RWSEM_GENERIC_SPINLOCK 22config RWSEM_GENERIC_SPINLOCK
20 bool 23 bool
21 24
@@ -47,6 +50,11 @@ config NO_IOMEM
47config NO_DMA 50config NO_DMA
48 def_bool y 51 def_bool y
49 52
53config GENERIC_LOCKBREAK
54 bool
55 default y
56 depends on SMP && PREEMPT
57
50mainmenu "Linux Kernel Configuration" 58mainmenu "Linux Kernel Configuration"
51 59
52config S390 60config 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
7source "lib/Kconfig.debug" 7source "lib/Kconfig.debug"
8 8
9config 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
9endmenu 17endmenu
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S
index 6ee1bedbd1bf..062c3d4c0394 100644
--- a/arch/s390/kernel/compat_wrapper.S
+++ b/arch/s390/kernel/compat_wrapper.S
@@ -1698,14 +1698,6 @@ compat_sys_signalfd_wrapper:
1698 llgfr %r4,%r4 # compat_size_t 1698 llgfr %r4,%r4 # compat_size_t
1699 jg compat_sys_signalfd 1699 jg compat_sys_signalfd
1700 1700
1701 .globl compat_sys_timerfd_wrapper
1702compat_sys_timerfd_wrapper:
1703 lgfr %r2,%r2 # int
1704 lgfr %r3,%r3 # int
1705 lgfr %r4,%r4 # int
1706 llgtr %r5,%r5 # struct compat_itimerspec *
1707 jg compat_sys_timerfd
1708
1709 .globl sys_eventfd_wrapper 1701 .globl sys_eventfd_wrapper
1710sys_eventfd_wrapper: 1702sys_eventfd_wrapper:
1711 llgfr %r2,%r2 # unsigned int 1703 llgfr %r2,%r2 # unsigned int
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
837restart_int_handler: 836restart_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
846restart_addr: 845restart_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
808restart_int_handler: 807restart_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
442static int ipl_init(void) 442static 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
474static struct shutdown_action ipl_action = {SHUTDOWN_ACTION_IPL_STR, ipl_run, 474static 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
795static int reipl_init(void) 798static 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
822static struct shutdown_action reipl_action = {SHUTDOWN_ACTION_REIPL_STR, 825static 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
1001static int dump_init(void) 1007static 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
1023static struct shutdown_action dump_action = {SHUTDOWN_ACTION_DUMP_STR, 1029static 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;
77unsigned long elf_hwcap = 0; 77unsigned long elf_hwcap = 0;
78char elf_platform[ELF_PLATFORM_SIZE]; 78char elf_platform[ELF_PLATFORM_SIZE];
79 79
80struct mem_chunk __initdata memory_chunk[MEMORY_CHUNKS]; 80struct mem_chunk __meminitdata memory_chunk[MEMORY_CHUNKS];
81volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */ 81volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */
82static unsigned long __initdata memory_end; 82static unsigned long __initdata memory_end;
83 83
@@ -145,7 +145,7 @@ __setup("condev=", condev_setup);
145 145
146static int __init conmode_setup(char *str) 146static 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 */
228int 228int smp_call_function_mask(cpumask_t mask, void (*func)(void *), void *info,
229smp_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
1011static int smp_add_present_cpu(int cpu) 1010static 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
1039static ssize_t rescan_store(struct sys_device *dev, const char *buf, 1038static 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 @@
14static unsigned long save_context_stack(struct stack_trace *trace, 14static 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
85void 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/syscalls.S b/arch/s390/kernel/syscalls.S
index 9e26ed9fe4e7..25eac7802fc4 100644
--- a/arch/s390/kernel/syscalls.S
+++ b/arch/s390/kernel/syscalls.S
@@ -325,5 +325,5 @@ SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes_wrapper)
325SYSCALL(s390_fallocate,sys_fallocate,sys_fallocate_wrapper) 325SYSCALL(s390_fallocate,sys_fallocate,sys_fallocate_wrapper)
326SYSCALL(sys_utimensat,sys_utimensat,compat_sys_utimensat_wrapper) /* 315 */ 326SYSCALL(sys_utimensat,sys_utimensat,compat_sys_utimensat_wrapper) /* 315 */
327SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd_wrapper) 327SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd_wrapper)
328SYSCALL(sys_timerfd,sys_timerfd,compat_sys_timerfd_wrapper) 328NI_SYSCALL /* 317 old sys_timer_fd */
329SYSCALL(sys_eventfd,sys_eventfd,sys_eventfd_wrapper) 329SYSCALL(sys_eventfd,sys_eventfd,sys_eventfd_wrapper)
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
171void 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
170void free_initmem(void) 197void 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
65static void __init_refok *vmem_alloc_pages(unsigned int order) 65static 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);