Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'fixes' into features

* fixes:
s390/entry: save the caller of psw_idle
s390/entry: avoid setting up backchain in ext|io handlers
s390/setup: use memblock_free_late() to free old stack
s390/irq: fix reading of ext_params2 field from lowcore
s390/unwind: add machine check handler stack
s390/cpcmd: fix inline assembly register clobbering
MAINTAINERS: add backups for s390 vfio drivers
s390/vdso: fix initializing and updating of vdso_data
s390/vdso: fix tod_steering_delta type
s390/vdso: copy tod_steering_delta value to vdso_data page

Signed-off-by: Heiko Carstens <hca@linux.ibm.com>

+33 -13
+3 -1
MAINTAINERS
··· 15634 15634 15635 15635 S390 VFIO AP DRIVER 15636 15636 M: Tony Krowiak <akrowiak@linux.ibm.com> 15637 - M: Pierre Morel <pmorel@linux.ibm.com> 15638 15637 M: Halil Pasic <pasic@linux.ibm.com> 15638 + M: Jason Herne <jjherne@linux.ibm.com> 15639 15639 L: linux-s390@vger.kernel.org 15640 15640 S: Supported 15641 15641 W: http://www.ibm.com/developerworks/linux/linux390/ ··· 15647 15647 S390 VFIO-CCW DRIVER 15648 15648 M: Cornelia Huck <cohuck@redhat.com> 15649 15649 M: Eric Farman <farman@linux.ibm.com> 15650 + M: Matthew Rosato <mjrosato@linux.ibm.com> 15650 15651 R: Halil Pasic <pasic@linux.ibm.com> 15651 15652 L: linux-s390@vger.kernel.org 15652 15653 L: kvm@vger.kernel.org ··· 15658 15657 15659 15658 S390 VFIO-PCI DRIVER 15660 15659 M: Matthew Rosato <mjrosato@linux.ibm.com> 15660 + M: Eric Farman <farman@linux.ibm.com> 15661 15661 L: linux-s390@vger.kernel.org 15662 15662 L: kvm@vger.kernel.org 15663 15663 S: Supported
+1
arch/s390/include/asm/stacktrace.h
··· 12 12 STACK_TYPE_IRQ, 13 13 STACK_TYPE_NODAT, 14 14 STACK_TYPE_RESTART, 15 + STACK_TYPE_MCCK, 15 16 }; 16 17 17 18 struct stack_info {
+1 -1
arch/s390/include/asm/vdso/data.h
··· 6 6 #include <vdso/datapage.h> 7 7 8 8 struct arch_vdso_data { 9 - __u64 tod_steering_delta; 9 + __s64 tod_steering_delta; 10 10 __u64 tod_steering_end; 11 11 }; 12 12
+4 -2
arch/s390/kernel/cpcmd.c
··· 37 37 38 38 static int diag8_response(int cmdlen, char *response, int *rlen) 39 39 { 40 + unsigned long _cmdlen = cmdlen | 0x40000000L; 41 + unsigned long _rlen = *rlen; 40 42 register unsigned long reg2 asm ("2") = (addr_t) cpcmd_buf; 41 43 register unsigned long reg3 asm ("3") = (addr_t) response; 42 - register unsigned long reg4 asm ("4") = cmdlen | 0x40000000L; 43 - register unsigned long reg5 asm ("5") = *rlen; 44 + register unsigned long reg4 asm ("4") = _cmdlen; 45 + register unsigned long reg5 asm ("5") = _rlen; 44 46 45 47 asm volatile( 46 48 " diag %2,%0,0x8\n"
+11 -1
arch/s390/kernel/dumpstack.c
··· 79 79 return in_stack(sp, info, STACK_TYPE_NODAT, top - THREAD_SIZE, top); 80 80 } 81 81 82 + static bool in_mcck_stack(unsigned long sp, struct stack_info *info) 83 + { 84 + unsigned long frame_size, top; 85 + 86 + frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs); 87 + top = S390_lowcore.mcck_stack + frame_size; 88 + return in_stack(sp, info, STACK_TYPE_MCCK, top - THREAD_SIZE, top); 89 + } 90 + 82 91 static bool in_restart_stack(unsigned long sp, struct stack_info *info) 83 92 { 84 93 unsigned long frame_size, top; ··· 117 108 /* Check per-cpu stacks */ 118 109 if (!in_irq_stack(sp, info) && 119 110 !in_nodat_stack(sp, info) && 120 - !in_restart_stack(sp, info)) 111 + !in_restart_stack(sp, info) && 112 + !in_mcck_stack(sp, info)) 121 113 goto unknown; 122 114 123 115 recursion_check:
+3 -4
arch/s390/kernel/entry.S
··· 401 401 brasl %r14,.Lcleanup_sie_int 402 402 #endif 403 403 0: CHECK_STACK __LC_SAVE_AREA_ASYNC 404 - lgr %r11,%r15 405 404 aghi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) 406 - stg %r11,__SF_BACKCHAIN(%r15) 407 405 j 2f 408 406 1: BPENTER __TI_flags(%r12),_TIF_ISOLATE_BP 409 407 lctlg %c1,%c1,__LC_KERNEL_ASCE 410 408 lg %r15,__LC_KERNEL_STACK 411 - xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) 412 - 2: la %r11,STACK_FRAME_OVERHEAD(%r15) 409 + 2: xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) 410 + la %r11,STACK_FRAME_OVERHEAD(%r15) 413 411 stmg %r0,%r7,__PT_R0(%r11) 414 412 # clear user controlled registers to prevent speculative use 415 413 xgr %r0,%r0 ··· 443 445 * Load idle PSW. 444 446 */ 445 447 ENTRY(psw_idle) 448 + stg %r14,(__SF_GPRS+8*8)(%r15) 446 449 stg %r3,__SF_EMPTY(%r15) 447 450 larl %r1,psw_idle_exit 448 451 stg %r1,__SF_EMPTY+8(%r15)
+1 -1
arch/s390/kernel/irq.c
··· 174 174 175 175 memcpy(&regs->int_code, &S390_lowcore.ext_cpu_addr, 4); 176 176 regs->int_parm = S390_lowcore.ext_params; 177 - regs->int_parm_long = *(unsigned long *)S390_lowcore.ext_params2; 177 + regs->int_parm_long = S390_lowcore.ext_params2; 178 178 179 179 from_idle = !user_mode(regs) && regs->psw.addr == (unsigned long)psw_idle_exit; 180 180 if (from_idle)
+1 -1
arch/s390/kernel/setup.c
··· 354 354 if (!new) 355 355 panic("Couldn't allocate machine check stack"); 356 356 WRITE_ONCE(S390_lowcore.mcck_stack, new + STACK_INIT_OFFSET); 357 - memblock_free(old, THREAD_SIZE); 357 + memblock_free_late(old, THREAD_SIZE); 358 358 return 0; 359 359 } 360 360 early_initcall(stack_realloc);
+8 -2
arch/s390/kernel/time.c
··· 80 80 { 81 81 struct ptff_qto qto; 82 82 struct ptff_qui qui; 83 + int cs; 83 84 84 85 /* Initialize TOD steering parameters */ 85 86 tod_steering_end = tod_clock_base.tod; 86 - vdso_data->arch_data.tod_steering_end = tod_steering_end; 87 + for (cs = 0; cs < CS_BASES; cs++) 88 + vdso_data[cs].arch_data.tod_steering_end = tod_steering_end; 87 89 88 90 if (!test_facility(28)) 89 91 return; ··· 368 366 { 369 367 unsigned long now, adj; 370 368 struct ptff_qto qto; 369 + int cs; 371 370 372 371 /* Fixup the monotonic sched clock. */ 373 372 tod_clock_base.eitod += delta; ··· 384 381 panic("TOD clock sync offset %li is too large to drift\n", 385 382 tod_steering_delta); 386 383 tod_steering_end = now + (abs(tod_steering_delta) << 15); 387 - vdso_data->arch_data.tod_steering_end = tod_steering_end; 384 + for (cs = 0; cs < CS_BASES; cs++) { 385 + vdso_data[cs].arch_data.tod_steering_end = tod_steering_end; 386 + vdso_data[cs].arch_data.tod_steering_delta = tod_steering_delta; 387 + } 388 388 389 389 /* Update LPAR offset. */ 390 390 if (ptff_query(PTFF_QTO) && ptff(&qto, sizeof(qto), PTFF_QTO) == 0)