aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-10-27 17:16:30 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-10-27 17:16:30 -0400
commit55bea71ed549398133732425a631b2268446526c (patch)
tree7546e1508c295345c5a30d0f7732b03e8502ac54
parent7618c6a17f6afae973e5c7b73e1ca80d0c8b8c2a (diff)
parent4a65429457a5d271dd3b00598b3ec75fe8b5103c (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 fixes from Martin Schwidefsky: "A few more s390 patches for 4.9: - a fix for an overflow in the dasd driver reported by UBSAN - fix a regression and add hotplug memory to the zone movable again - add ignore defines for the pkey system calls - fix the ouput of the merged stack tracer - replace printk with pr_cont in arch/s390 where appropriate - remove the arch specific return_address function again - ignore reserved channel paths at boot time - add a missing hugetlb_bad_size call to the arch backend" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: s390/mm: fix zone calculation in arch_add_memory() s390/dumpstack: use pr_cont within show_stack and die s390/dumpstack: get rid of return_address again s390/disassambler: use pr_cont where appropriate s390/dumpstack: use pr_cont where appropriate s390/dumpstack: restore reliable indicator for call traces s390/mm: use hugetlb_bad_size() s390/cio: don't register chpids in reserved state s390: ignore pkey system calls s390/dasd: avoid undefined behaviour
-rw-r--r--arch/s390/include/asm/ftrace.h4
-rw-r--r--arch/s390/include/asm/processor.h2
-rw-r--r--arch/s390/include/asm/unistd.h3
-rw-r--r--arch/s390/kernel/dis.c4
-rw-r--r--arch/s390/kernel/dumpstack.c63
-rw-r--r--arch/s390/kernel/perf_event.c2
-rw-r--r--arch/s390/kernel/stacktrace.c4
-rw-r--r--arch/s390/mm/hugetlbpage.c1
-rw-r--r--arch/s390/mm/init.c38
-rw-r--r--arch/s390/oprofile/init.c2
-rw-r--r--drivers/s390/block/dasd_eckd.c4
-rw-r--r--drivers/s390/cio/chp.c6
12 files changed, 61 insertions, 72 deletions
diff --git a/arch/s390/include/asm/ftrace.h b/arch/s390/include/asm/ftrace.h
index 64053d9ac3f2..836c56290499 100644
--- a/arch/s390/include/asm/ftrace.h
+++ b/arch/s390/include/asm/ftrace.h
@@ -12,9 +12,7 @@
12 12
13#ifndef __ASSEMBLY__ 13#ifndef __ASSEMBLY__
14 14
15unsigned long return_address(int depth); 15#define ftrace_return_address(n) __builtin_return_address(n)
16
17#define ftrace_return_address(n) return_address(n)
18 16
19void _mcount(void); 17void _mcount(void);
20void ftrace_caller(void); 18void ftrace_caller(void);
diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h
index 03323175de30..602af692efdc 100644
--- a/arch/s390/include/asm/processor.h
+++ b/arch/s390/include/asm/processor.h
@@ -192,7 +192,7 @@ struct task_struct;
192struct mm_struct; 192struct mm_struct;
193struct seq_file; 193struct seq_file;
194 194
195typedef int (*dump_trace_func_t)(void *data, unsigned long address); 195typedef int (*dump_trace_func_t)(void *data, unsigned long address, int reliable);
196void dump_trace(dump_trace_func_t func, void *data, 196void dump_trace(dump_trace_func_t func, void *data,
197 struct task_struct *task, unsigned long sp); 197 struct task_struct *task, unsigned long sp);
198 198
diff --git a/arch/s390/include/asm/unistd.h b/arch/s390/include/asm/unistd.h
index 02613bad8bbb..3066031a73fe 100644
--- a/arch/s390/include/asm/unistd.h
+++ b/arch/s390/include/asm/unistd.h
@@ -9,6 +9,9 @@
9#include <uapi/asm/unistd.h> 9#include <uapi/asm/unistd.h>
10 10
11#define __IGNORE_time 11#define __IGNORE_time
12#define __IGNORE_pkey_mprotect
13#define __IGNORE_pkey_alloc
14#define __IGNORE_pkey_free
12 15
13#define __ARCH_WANT_OLD_READDIR 16#define __ARCH_WANT_OLD_READDIR
14#define __ARCH_WANT_SYS_ALARM 17#define __ARCH_WANT_SYS_ALARM
diff --git a/arch/s390/kernel/dis.c b/arch/s390/kernel/dis.c
index 43446fa2a4e5..c74c59236f44 100644
--- a/arch/s390/kernel/dis.c
+++ b/arch/s390/kernel/dis.c
@@ -2014,12 +2014,12 @@ void show_code(struct pt_regs *regs)
2014 *ptr++ = '\t'; 2014 *ptr++ = '\t';
2015 ptr += print_insn(ptr, code + start, addr); 2015 ptr += print_insn(ptr, code + start, addr);
2016 start += opsize; 2016 start += opsize;
2017 printk("%s", buffer); 2017 pr_cont("%s", buffer);
2018 ptr = buffer; 2018 ptr = buffer;
2019 ptr += sprintf(ptr, "\n "); 2019 ptr += sprintf(ptr, "\n ");
2020 hops++; 2020 hops++;
2021 } 2021 }
2022 printk("\n"); 2022 pr_cont("\n");
2023} 2023}
2024 2024
2025void print_fn_code(unsigned char *code, unsigned long len) 2025void print_fn_code(unsigned char *code, unsigned long len)
diff --git a/arch/s390/kernel/dumpstack.c b/arch/s390/kernel/dumpstack.c
index 6693383bc01b..55d4fe174fd9 100644
--- a/arch/s390/kernel/dumpstack.c
+++ b/arch/s390/kernel/dumpstack.c
@@ -38,10 +38,10 @@ __dump_trace(dump_trace_func_t func, void *data, unsigned long sp,
38 if (sp < low || sp > high - sizeof(*sf)) 38 if (sp < low || sp > high - sizeof(*sf))
39 return sp; 39 return sp;
40 sf = (struct stack_frame *) sp; 40 sf = (struct stack_frame *) sp;
41 if (func(data, sf->gprs[8], 0))
42 return sp;
41 /* Follow the backchain. */ 43 /* Follow the backchain. */
42 while (1) { 44 while (1) {
43 if (func(data, sf->gprs[8]))
44 return sp;
45 low = sp; 45 low = sp;
46 sp = sf->back_chain; 46 sp = sf->back_chain;
47 if (!sp) 47 if (!sp)
@@ -49,6 +49,8 @@ __dump_trace(dump_trace_func_t func, void *data, unsigned long sp,
49 if (sp <= low || sp > high - sizeof(*sf)) 49 if (sp <= low || sp > high - sizeof(*sf))
50 return sp; 50 return sp;
51 sf = (struct stack_frame *) sp; 51 sf = (struct stack_frame *) sp;
52 if (func(data, sf->gprs[8], 1))
53 return sp;
52 } 54 }
53 /* Zero backchain detected, check for interrupt frame. */ 55 /* Zero backchain detected, check for interrupt frame. */
54 sp = (unsigned long) (sf + 1); 56 sp = (unsigned long) (sf + 1);
@@ -56,7 +58,7 @@ __dump_trace(dump_trace_func_t func, void *data, unsigned long sp,
56 return sp; 58 return sp;
57 regs = (struct pt_regs *) sp; 59 regs = (struct pt_regs *) sp;
58 if (!user_mode(regs)) { 60 if (!user_mode(regs)) {
59 if (func(data, regs->psw.addr)) 61 if (func(data, regs->psw.addr, 1))
60 return sp; 62 return sp;
61 } 63 }
62 low = sp; 64 low = sp;
@@ -85,33 +87,12 @@ void dump_trace(dump_trace_func_t func, void *data, struct task_struct *task,
85} 87}
86EXPORT_SYMBOL_GPL(dump_trace); 88EXPORT_SYMBOL_GPL(dump_trace);
87 89
88struct return_address_data { 90static int show_address(void *data, unsigned long address, int reliable)
89 unsigned long address;
90 int depth;
91};
92
93static int __return_address(void *data, unsigned long address)
94{
95 struct return_address_data *rd = data;
96
97 if (rd->depth--)
98 return 0;
99 rd->address = address;
100 return 1;
101}
102
103unsigned long return_address(int depth)
104{
105 struct return_address_data rd = { .depth = depth + 2 };
106
107 dump_trace(__return_address, &rd, NULL, current_stack_pointer());
108 return rd.address;
109}
110EXPORT_SYMBOL_GPL(return_address);
111
112static int show_address(void *data, unsigned long address)
113{ 91{
114 printk("([<%016lx>] %pSR)\n", address, (void *)address); 92 if (reliable)
93 printk(" [<%016lx>] %pSR \n", address, (void *)address);
94 else
95 printk("([<%016lx>] %pSR)\n", address, (void *)address);
115 return 0; 96 return 0;
116} 97}
117 98
@@ -138,14 +119,14 @@ void show_stack(struct task_struct *task, unsigned long *sp)
138 else 119 else
139 stack = (unsigned long *)task->thread.ksp; 120 stack = (unsigned long *)task->thread.ksp;
140 } 121 }
122 printk(KERN_DEFAULT "Stack:\n");
141 for (i = 0; i < 20; i++) { 123 for (i = 0; i < 20; i++) {
142 if (((addr_t) stack & (THREAD_SIZE-1)) == 0) 124 if (((addr_t) stack & (THREAD_SIZE-1)) == 0)
143 break; 125 break;
144 if ((i * sizeof(long) % 32) == 0) 126 if (i % 4 == 0)
145 printk("%s ", i == 0 ? "" : "\n"); 127 printk(KERN_DEFAULT " ");
146 printk("%016lx ", *stack++); 128 pr_cont("%016lx%c", *stack++, i % 4 == 3 ? '\n' : ' ');
147 } 129 }
148 printk("\n");
149 show_trace(task, (unsigned long)sp); 130 show_trace(task, (unsigned long)sp);
150} 131}
151 132
@@ -163,13 +144,13 @@ void show_registers(struct pt_regs *regs)
163 mode = user_mode(regs) ? "User" : "Krnl"; 144 mode = user_mode(regs) ? "User" : "Krnl";
164 printk("%s PSW : %p %p", mode, (void *)regs->psw.mask, (void *)regs->psw.addr); 145 printk("%s PSW : %p %p", mode, (void *)regs->psw.mask, (void *)regs->psw.addr);
165 if (!user_mode(regs)) 146 if (!user_mode(regs))
166 printk(" (%pSR)", (void *)regs->psw.addr); 147 pr_cont(" (%pSR)", (void *)regs->psw.addr);
167 printk("\n"); 148 pr_cont("\n");
168 printk(" R:%x T:%x IO:%x EX:%x Key:%x M:%x W:%x " 149 printk(" R:%x T:%x IO:%x EX:%x Key:%x M:%x W:%x "
169 "P:%x AS:%x CC:%x PM:%x", psw->r, psw->t, psw->i, psw->e, 150 "P:%x AS:%x CC:%x PM:%x", psw->r, psw->t, psw->i, psw->e,
170 psw->key, psw->m, psw->w, psw->p, psw->as, psw->cc, psw->pm); 151 psw->key, psw->m, psw->w, psw->p, psw->as, psw->cc, psw->pm);
171 printk(" RI:%x EA:%x", psw->ri, psw->eaba); 152 pr_cont(" RI:%x EA:%x\n", psw->ri, psw->eaba);
172 printk("\n%s GPRS: %016lx %016lx %016lx %016lx\n", mode, 153 printk("%s GPRS: %016lx %016lx %016lx %016lx\n", mode,
173 regs->gprs[0], regs->gprs[1], regs->gprs[2], regs->gprs[3]); 154 regs->gprs[0], regs->gprs[1], regs->gprs[2], regs->gprs[3]);
174 printk(" %016lx %016lx %016lx %016lx\n", 155 printk(" %016lx %016lx %016lx %016lx\n",
175 regs->gprs[4], regs->gprs[5], regs->gprs[6], regs->gprs[7]); 156 regs->gprs[4], regs->gprs[5], regs->gprs[6], regs->gprs[7]);
@@ -205,14 +186,14 @@ void die(struct pt_regs *regs, const char *str)
205 printk("%s: %04x ilc:%d [#%d] ", str, regs->int_code & 0xffff, 186 printk("%s: %04x ilc:%d [#%d] ", str, regs->int_code & 0xffff,
206 regs->int_code >> 17, ++die_counter); 187 regs->int_code >> 17, ++die_counter);
207#ifdef CONFIG_PREEMPT 188#ifdef CONFIG_PREEMPT
208 printk("PREEMPT "); 189 pr_cont("PREEMPT ");
209#endif 190#endif
210#ifdef CONFIG_SMP 191#ifdef CONFIG_SMP
211 printk("SMP "); 192 pr_cont("SMP ");
212#endif 193#endif
213 if (debug_pagealloc_enabled()) 194 if (debug_pagealloc_enabled())
214 printk("DEBUG_PAGEALLOC"); 195 pr_cont("DEBUG_PAGEALLOC");
215 printk("\n"); 196 pr_cont("\n");
216 notify_die(DIE_OOPS, str, regs, 0, regs->int_code & 0xffff, SIGSEGV); 197 notify_die(DIE_OOPS, str, regs, 0, regs->int_code & 0xffff, SIGSEGV);
217 print_modules(); 198 print_modules();
218 show_regs(regs); 199 show_regs(regs);
diff --git a/arch/s390/kernel/perf_event.c b/arch/s390/kernel/perf_event.c
index 17431f63de00..955a7b6fa0a4 100644
--- a/arch/s390/kernel/perf_event.c
+++ b/arch/s390/kernel/perf_event.c
@@ -222,7 +222,7 @@ static int __init service_level_perf_register(void)
222} 222}
223arch_initcall(service_level_perf_register); 223arch_initcall(service_level_perf_register);
224 224
225static int __perf_callchain_kernel(void *data, unsigned long address) 225static int __perf_callchain_kernel(void *data, unsigned long address, int reliable)
226{ 226{
227 struct perf_callchain_entry_ctx *entry = data; 227 struct perf_callchain_entry_ctx *entry = data;
228 228
diff --git a/arch/s390/kernel/stacktrace.c b/arch/s390/kernel/stacktrace.c
index 44f84b23d4e5..355db9db8210 100644
--- a/arch/s390/kernel/stacktrace.c
+++ b/arch/s390/kernel/stacktrace.c
@@ -27,12 +27,12 @@ static int __save_address(void *data, unsigned long address, int nosched)
27 return 1; 27 return 1;
28} 28}
29 29
30static int save_address(void *data, unsigned long address) 30static int save_address(void *data, unsigned long address, int reliable)
31{ 31{
32 return __save_address(data, address, 0); 32 return __save_address(data, address, 0);
33} 33}
34 34
35static int save_address_nosched(void *data, unsigned long address) 35static int save_address_nosched(void *data, unsigned long address, int reliable)
36{ 36{
37 return __save_address(data, address, 1); 37 return __save_address(data, address, 1);
38} 38}
diff --git a/arch/s390/mm/hugetlbpage.c b/arch/s390/mm/hugetlbpage.c
index cd404aa3931c..4a0c5bce3552 100644
--- a/arch/s390/mm/hugetlbpage.c
+++ b/arch/s390/mm/hugetlbpage.c
@@ -217,6 +217,7 @@ static __init int setup_hugepagesz(char *opt)
217 } else if (MACHINE_HAS_EDAT2 && size == PUD_SIZE) { 217 } else if (MACHINE_HAS_EDAT2 && size == PUD_SIZE) {
218 hugetlb_add_hstate(PUD_SHIFT - PAGE_SHIFT); 218 hugetlb_add_hstate(PUD_SHIFT - PAGE_SHIFT);
219 } else { 219 } else {
220 hugetlb_bad_size();
220 pr_err("hugepagesz= specifies an unsupported page size %s\n", 221 pr_err("hugepagesz= specifies an unsupported page size %s\n",
221 string); 222 string);
222 return 0; 223 return 0;
diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c
index f56a39bd8ba6..b3e9d18f2ec6 100644
--- a/arch/s390/mm/init.c
+++ b/arch/s390/mm/init.c
@@ -151,36 +151,40 @@ void __init free_initrd_mem(unsigned long start, unsigned long end)
151#ifdef CONFIG_MEMORY_HOTPLUG 151#ifdef CONFIG_MEMORY_HOTPLUG
152int arch_add_memory(int nid, u64 start, u64 size, bool for_device) 152int arch_add_memory(int nid, u64 start, u64 size, bool for_device)
153{ 153{
154 unsigned long normal_end_pfn = PFN_DOWN(memblock_end_of_DRAM()); 154 unsigned long zone_start_pfn, zone_end_pfn, nr_pages;
155 unsigned long dma_end_pfn = PFN_DOWN(MAX_DMA_ADDRESS);
156 unsigned long start_pfn = PFN_DOWN(start); 155 unsigned long start_pfn = PFN_DOWN(start);
157 unsigned long size_pages = PFN_DOWN(size); 156 unsigned long size_pages = PFN_DOWN(size);
158 unsigned long nr_pages; 157 pg_data_t *pgdat = NODE_DATA(nid);
159 int rc, zone_enum; 158 struct zone *zone;
159 int rc, i;
160 160
161 rc = vmem_add_mapping(start, size); 161 rc = vmem_add_mapping(start, size);
162 if (rc) 162 if (rc)
163 return rc; 163 return rc;
164 164
165 while (size_pages > 0) { 165 for (i = 0; i < MAX_NR_ZONES; i++) {
166 if (start_pfn < dma_end_pfn) { 166 zone = pgdat->node_zones + i;
167 nr_pages = (start_pfn + size_pages > dma_end_pfn) ? 167 if (zone_idx(zone) != ZONE_MOVABLE) {
168 dma_end_pfn - start_pfn : size_pages; 168 /* Add range within existing zone limits, if possible */
169 zone_enum = ZONE_DMA; 169 zone_start_pfn = zone->zone_start_pfn;
170 } else if (start_pfn < normal_end_pfn) { 170 zone_end_pfn = zone->zone_start_pfn +
171 nr_pages = (start_pfn + size_pages > normal_end_pfn) ? 171 zone->spanned_pages;
172 normal_end_pfn - start_pfn : size_pages;
173 zone_enum = ZONE_NORMAL;
174 } else { 172 } else {
175 nr_pages = size_pages; 173 /* Add remaining range to ZONE_MOVABLE */
176 zone_enum = ZONE_MOVABLE; 174 zone_start_pfn = start_pfn;
175 zone_end_pfn = start_pfn + size_pages;
177 } 176 }
178 rc = __add_pages(nid, NODE_DATA(nid)->node_zones + zone_enum, 177 if (start_pfn < zone_start_pfn || start_pfn >= zone_end_pfn)
179 start_pfn, size_pages); 178 continue;
179 nr_pages = (start_pfn + size_pages > zone_end_pfn) ?
180 zone_end_pfn - start_pfn : size_pages;
181 rc = __add_pages(nid, zone, start_pfn, nr_pages);
180 if (rc) 182 if (rc)
181 break; 183 break;
182 start_pfn += nr_pages; 184 start_pfn += nr_pages;
183 size_pages -= nr_pages; 185 size_pages -= nr_pages;
186 if (!size_pages)
187 break;
184 } 188 }
185 if (rc) 189 if (rc)
186 vmem_remove_mapping(start, size); 190 vmem_remove_mapping(start, size);
diff --git a/arch/s390/oprofile/init.c b/arch/s390/oprofile/init.c
index 16f4c3960b87..9a4de4599c7b 100644
--- a/arch/s390/oprofile/init.c
+++ b/arch/s390/oprofile/init.c
@@ -13,7 +13,7 @@
13#include <linux/init.h> 13#include <linux/init.h>
14#include <asm/processor.h> 14#include <asm/processor.h>
15 15
16static int __s390_backtrace(void *data, unsigned long address) 16static int __s390_backtrace(void *data, unsigned long address, int reliable)
17{ 17{
18 unsigned int *depth = data; 18 unsigned int *depth = data;
19 19
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c
index 831935af7389..a7a88476e215 100644
--- a/drivers/s390/block/dasd_eckd.c
+++ b/drivers/s390/block/dasd_eckd.c
@@ -1205,7 +1205,7 @@ static int verify_fcx_max_data(struct dasd_device *device, __u8 lpm)
1205 mdc, lpm); 1205 mdc, lpm);
1206 return mdc; 1206 return mdc;
1207 } 1207 }
1208 fcx_max_data = mdc * FCX_MAX_DATA_FACTOR; 1208 fcx_max_data = (u32)mdc * FCX_MAX_DATA_FACTOR;
1209 if (fcx_max_data < private->fcx_max_data) { 1209 if (fcx_max_data < private->fcx_max_data) {
1210 dev_warn(&device->cdev->dev, 1210 dev_warn(&device->cdev->dev,
1211 "The maximum data size for zHPF requests %u " 1211 "The maximum data size for zHPF requests %u "
@@ -1675,7 +1675,7 @@ static u32 get_fcx_max_data(struct dasd_device *device)
1675 " data size for zHPF requests failed\n"); 1675 " data size for zHPF requests failed\n");
1676 return 0; 1676 return 0;
1677 } else 1677 } else
1678 return mdc * FCX_MAX_DATA_FACTOR; 1678 return (u32)mdc * FCX_MAX_DATA_FACTOR;
1679} 1679}
1680 1680
1681/* 1681/*
diff --git a/drivers/s390/cio/chp.c b/drivers/s390/cio/chp.c
index 46be25c7461e..876c7e6e3a99 100644
--- a/drivers/s390/cio/chp.c
+++ b/drivers/s390/cio/chp.c
@@ -780,7 +780,7 @@ static int cfg_wait_idle(void)
780static int __init chp_init(void) 780static int __init chp_init(void)
781{ 781{
782 struct chp_id chpid; 782 struct chp_id chpid;
783 int ret; 783 int state, ret;
784 784
785 ret = crw_register_handler(CRW_RSC_CPATH, chp_process_crw); 785 ret = crw_register_handler(CRW_RSC_CPATH, chp_process_crw);
786 if (ret) 786 if (ret)
@@ -791,7 +791,9 @@ static int __init chp_init(void)
791 return 0; 791 return 0;
792 /* Register available channel-paths. */ 792 /* Register available channel-paths. */
793 chp_id_for_each(&chpid) { 793 chp_id_for_each(&chpid) {
794 if (chp_info_get_status(chpid) != CHP_STATUS_NOT_RECOGNIZED) 794 state = chp_info_get_status(chpid);
795 if (state == CHP_STATUS_CONFIGURED ||
796 state == CHP_STATUS_STANDBY)
795 chp_new(chpid); 797 chp_new(chpid);
796 } 798 }
797 799