Merge tag 's390-5.13-5' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull s390 fixes from Vasily Gorbik:

- Fix a couple of late pt_regs flags handling findings of conversion to
generic entry.

- Fix potential register clobbering in stack switch helper.

- Fix thread/group masks for offline cpus.

- Fix cleanup of mdev resources when remove callback is invoked in
vfio-ap code.

* tag 's390-5.13-5' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
s390/stack: fix possible register corruption with stack switch helper
s390/topology: clear thread/group maps for offline cpus
s390/vfio-ap: clean up mdev resources when remove callback invoked
s390: clear pt_regs::flags on irq entry
s390: fix system call restart with multiple signals

Changed files
+21 -21
arch
s390
drivers
s390
crypto
+11 -7
arch/s390/include/asm/stacktrace.h
··· 91 91 CALL_ARGS_4(arg1, arg2, arg3, arg4); \ 92 92 register unsigned long r4 asm("6") = (unsigned long)(arg5) 93 93 94 - #define CALL_FMT_0 "=&d" (r2) : 95 - #define CALL_FMT_1 "+&d" (r2) : 96 - #define CALL_FMT_2 CALL_FMT_1 "d" (r3), 97 - #define CALL_FMT_3 CALL_FMT_2 "d" (r4), 98 - #define CALL_FMT_4 CALL_FMT_3 "d" (r5), 99 - #define CALL_FMT_5 CALL_FMT_4 "d" (r6), 94 + /* 95 + * To keep this simple mark register 2-6 as being changed (volatile) 96 + * by the called function, even though register 6 is saved/nonvolatile. 97 + */ 98 + #define CALL_FMT_0 "=&d" (r2) 99 + #define CALL_FMT_1 "+&d" (r2) 100 + #define CALL_FMT_2 CALL_FMT_1, "+&d" (r3) 101 + #define CALL_FMT_3 CALL_FMT_2, "+&d" (r4) 102 + #define CALL_FMT_4 CALL_FMT_3, "+&d" (r5) 103 + #define CALL_FMT_5 CALL_FMT_4, "+&d" (r6) 100 104 101 105 #define CALL_CLOBBER_5 "0", "1", "14", "cc", "memory" 102 106 #define CALL_CLOBBER_4 CALL_CLOBBER_5 ··· 122 118 " brasl 14,%[_fn]\n" \ 123 119 " la 15,0(%[_prev])\n" \ 124 120 : [_prev] "=&a" (prev), CALL_FMT_##nr \ 125 - [_stack] "R" (stack), \ 121 + : [_stack] "R" (stack), \ 126 122 [_bc] "i" (offsetof(struct stack_frame, back_chain)), \ 127 123 [_frame] "d" (frame), \ 128 124 [_fn] "X" (fn) : CALL_CLOBBER_##nr); \
+1
arch/s390/kernel/entry.S
··· 418 418 xgr %r6,%r6 419 419 xgr %r7,%r7 420 420 xgr %r10,%r10 421 + xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11) 421 422 mvc __PT_R8(64,%r11),__LC_SAVE_AREA_ASYNC 422 423 stmg %r8,%r9,__PT_PSW(%r11) 423 424 tm %r8,0x0001 # coming from user space?
-1
arch/s390/kernel/signal.c
··· 512 512 513 513 /* No handlers present - check for system call restart */ 514 514 clear_pt_regs_flag(regs, PIF_SYSCALL); 515 - clear_pt_regs_flag(regs, PIF_SYSCALL_RESTART); 516 515 if (current->thread.system_call) { 517 516 regs->int_code = current->thread.system_call; 518 517 switch (regs->gprs[2]) {
+9 -3
arch/s390/kernel/topology.c
··· 66 66 { 67 67 static cpumask_t mask; 68 68 69 - cpumask_copy(&mask, cpumask_of(cpu)); 69 + cpumask_clear(&mask); 70 + if (!cpu_online(cpu)) 71 + goto out; 72 + cpumask_set_cpu(cpu, &mask); 70 73 switch (topology_mode) { 71 74 case TOPOLOGY_MODE_HW: 72 75 while (info) { ··· 86 83 default: 87 84 fallthrough; 88 85 case TOPOLOGY_MODE_SINGLE: 89 - cpumask_copy(&mask, cpumask_of(cpu)); 90 86 break; 91 87 } 92 88 cpumask_and(&mask, &mask, cpu_online_mask); 89 + out: 93 90 cpumask_copy(dst, &mask); 94 91 } 95 92 ··· 98 95 static cpumask_t mask; 99 96 int i; 100 97 101 - cpumask_copy(&mask, cpumask_of(cpu)); 98 + cpumask_clear(&mask); 99 + if (!cpu_online(cpu)) 100 + goto out; 101 + cpumask_set_cpu(cpu, &mask); 102 102 if (topology_mode != TOPOLOGY_MODE_HW) 103 103 goto out; 104 104 cpu -= cpu % (smp_cpu_mtid + 1);
-10
drivers/s390/crypto/vfio_ap_ops.c
··· 366 366 struct ap_matrix_mdev *matrix_mdev = mdev_get_drvdata(mdev); 367 367 368 368 mutex_lock(&matrix_dev->lock); 369 - 370 - /* 371 - * If the KVM pointer is in flux or the guest is running, disallow 372 - * un-assignment of control domain. 373 - */ 374 - if (matrix_mdev->kvm_busy || matrix_mdev->kvm) { 375 - mutex_unlock(&matrix_dev->lock); 376 - return -EBUSY; 377 - } 378 - 379 369 vfio_ap_mdev_reset_queues(mdev); 380 370 list_del(&matrix_mdev->node); 381 371 kfree(matrix_mdev);