linux/arch/s390/kernel
Heiko Carstens d744194956 s390/hibernate: fix save and restore of kernel text section
Sebastian reported a crash caused by a jump label mismatch after resume.
This happens because we do not save the kernel text section during suspend
and therefore also do not restore it during resume, but use the kernel image
that restores the old system.

This means that after a suspend/resume cycle we lost all modifications done
to the kernel text section.
The reason for this is the pfn_is_nosave() function, which incorrectly
returns that read-only pages don't need to be saved. This is incorrect since
we mark the kernel text section read-only.
We still need to make sure to not save and restore pages contained within
NSS and DCSS segment.
To fix this add an extra case for the kernel text section and only save
those pages if they are not contained within an NSS segment.

Fixes the following crash (and the above bugs as well):

Jump label code mismatch at netif_receive_skb_internal+0x28/0xd0
Found:    c0 04 00 00 00 00
Expected: c0 f4 00 00 00 11
New:      c0 04 00 00 00 00
Kernel panic - not syncing: Corrupted kernel text
CPU: 0 PID: 9 Comm: migration/0 Not tainted 3.19.0-01975-gb1b096e70f23 #4
Call Trace:
  [<0000000000113972>] show_stack+0x72/0xf0
  [<000000000081f15e>] dump_stack+0x6e/0x90
  [<000000000081c4e8>] panic+0x108/0x2b0
  [<000000000081be64>] jump_label_bug.isra.2+0x104/0x108
  [<0000000000112176>] __jump_label_transform+0x9e/0xd0
  [<00000000001121e6>] __sm_arch_jump_label_transform+0x3e/0x50
  [<00000000001d1136>] multi_cpu_stop+0x12e/0x170
  [<00000000001d1472>] cpu_stopper_thread+0xb2/0x168
  [<000000000015d2ac>] smpboot_thread_fn+0x134/0x1b0
  [<0000000000158baa>] kthread+0x10a/0x110
  [<0000000000824a86>] kernel_thread_starter+0x6/0xc

Reported-and-tested-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Cc: stable@vger.kernel.org
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
2015-04-13 10:46:18 +02:00
..
vdso32 s390/vdso: fix stack corruption 2014-10-27 13:27:02 +01:00
vdso64 s390/vdso: fix clock_gettime for CLOCK_THREAD_CPUTIME_ID, -2 and -3 2015-02-12 09:37:21 +01:00
.gitignore s390: add various .gitignore files. 2012-05-16 14:42:41 +02:00
asm-offsets.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
audit.c
audit.h
base.S s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
cache.c s390/cacheinfo: add missing facility check 2015-04-13 10:46:16 +02:00
compat_audit.c
compat_linux.c groups: Consolidate the setgroups permission checks 2014-12-05 17:19:27 -06:00
compat_linux.h s390: add support for vector extension 2014-10-09 09:14:13 +02:00
compat_ptrace.h
compat_signal.c all arches, signal: move restart_block to struct task_struct 2015-02-12 18:54:12 -08:00
compat_wrapper.c s390/kernel: add system calls for PCI memory access 2014-11-19 09:46:43 +01:00
cpcmd.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
crash_dump.c s390/kdump: add support for vector extension 2014-10-09 09:14:16 +02:00
debug.c s390/debug: avoid function call for debug_sprintf_* 2014-12-08 09:42:29 +01:00
diag.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
dis.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
dumpstack.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
early.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
ebcdic.c s390/comments: unify copyright messages and remove file names 2012-07-20 11:15:04 +02:00
entry.h s390/signal: add sys_sigreturn and sys_rt_sigreturn declarations 2015-01-08 10:02:49 +01:00
entry.S s390: remove 31 bit syscalls 2015-03-25 11:49:35 +01:00
ftrace.c s390/maccess: remove potentially broken probe_kernel_write() 2015-03-25 11:49:43 +01:00
head64.S s390: fix kernel crash due to linkage stack instructions 2014-02-05 11:00:50 +01:00
head_kdump.S s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
head.S s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
idle.c s390/idle: convert open coded idle time seqcount 2014-12-08 09:42:32 +01:00
ipl.c s390/ipl: cleanup macro usage 2015-03-25 11:49:50 +01:00
irq.c s390/irq: enforce correct irqclass_sub_desc array size 2015-03-25 11:49:52 +01:00
jump_label.c s390/maccess: remove potentially broken probe_kernel_write() 2015-03-25 11:49:43 +01:00
kprobes.c s390/maccess: remove potentially broken probe_kernel_write() 2015-03-25 11:49:43 +01:00
lgr.c s390/sysinfo,stsi: change return code handling 2012-09-26 15:45:12 +02:00
machine_kexec.c s390: add SMT support 2015-01-22 12:16:01 +01:00
Makefile s390: remove "64" suffix from mem64.S and swsusp_asm64.S 2015-03-25 11:49:51 +01:00
mcount.S s390/ftrace: hotpatch support for function tracing 2015-01-29 09:19:25 +01:00
module.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
nmi.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
os_info.c Include missing linux/slab.h inclusions 2013-04-29 15:42:01 -04:00
perf_cpum_cf_events.c s390/cpum_cf: Export event names in sysfs 2013-12-16 14:37:50 +01:00
perf_cpum_cf.c s390: Replace __get_cpu_var uses 2014-08-26 13:45:52 -04:00
perf_cpum_sf.c s390/cpum_sf: add diagnostic sampling event only if it is authorized 2015-03-13 12:15:44 +01:00
perf_event.c s390/perf: make print_debug_cf() static 2014-03-14 12:59:32 +01:00
pgm_check.S s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
process.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
processor.c s390/ftrace: fix crashes when switching tracers / add notrace to cpu_relax() 2015-03-02 11:35:53 -08:00
ptrace.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
reipl.S s390: remove "64" suffix from a couple of files 2015-03-25 11:49:34 +01:00
relocate_kernel.S s390: remove "64" suffix from a couple of files 2015-03-25 11:49:34 +01:00
runtime_instr.c s390/irq: Use defines for external interruption codes 2014-04-03 14:30:52 +02:00
s390_ksyms.c s390: use IS_ENABLED to check if a CONFIG is set to y or m 2013-12-16 14:38:04 +01:00
sclp.S s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
setup.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
signal.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
smp.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
stacktrace.c s390/comments: unify copyright messages and remove file names 2012-07-20 11:15:04 +02:00
suspend.c s390/hibernate: fix save and restore of kernel text section 2015-04-13 10:46:18 +02:00
swsusp.S s390: remove "64" suffix from mem64.S and swsusp_asm64.S 2015-03-25 11:49:51 +01:00
sys_s390.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
syscalls.S s390: remove 31 bit syscalls 2015-03-25 11:49:35 +01:00
sysinfo.c Fairly small update, but there are some interesting new features. 2015-02-13 09:55:09 -08:00
time.c s390/kprobes: make use of NOKPROBE_SYMBOL() 2014-10-27 13:27:28 +01:00
topology.c s390: make couple of functions and variables static 2015-03-25 11:49:45 +01:00
traps.c s390/traps: panic() instead of die() on translation exception 2015-03-25 11:49:38 +01:00
uprobes.c s390/uprobes: fix address space annotation 2015-03-25 11:49:47 +01:00
vdso.c s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
vmlinux.lds.S s390: remove 31 bit support 2015-03-25 11:49:33 +01:00
vtime.c s390: add SMT support 2015-01-22 12:16:01 +01:00