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
This commit is contained in:
@@ -91,12 +91,16 @@ struct stack_frame {
|
|||||||
CALL_ARGS_4(arg1, arg2, arg3, arg4); \
|
CALL_ARGS_4(arg1, arg2, arg3, arg4); \
|
||||||
register unsigned long r4 asm("6") = (unsigned long)(arg5)
|
register unsigned long r4 asm("6") = (unsigned long)(arg5)
|
||||||
|
|
||||||
#define CALL_FMT_0 "=&d" (r2) :
|
/*
|
||||||
#define CALL_FMT_1 "+&d" (r2) :
|
* To keep this simple mark register 2-6 as being changed (volatile)
|
||||||
#define CALL_FMT_2 CALL_FMT_1 "d" (r3),
|
* by the called function, even though register 6 is saved/nonvolatile.
|
||||||
#define CALL_FMT_3 CALL_FMT_2 "d" (r4),
|
*/
|
||||||
#define CALL_FMT_4 CALL_FMT_3 "d" (r5),
|
#define CALL_FMT_0 "=&d" (r2)
|
||||||
#define CALL_FMT_5 CALL_FMT_4 "d" (r6),
|
#define CALL_FMT_1 "+&d" (r2)
|
||||||
|
#define CALL_FMT_2 CALL_FMT_1, "+&d" (r3)
|
||||||
|
#define CALL_FMT_3 CALL_FMT_2, "+&d" (r4)
|
||||||
|
#define CALL_FMT_4 CALL_FMT_3, "+&d" (r5)
|
||||||
|
#define CALL_FMT_5 CALL_FMT_4, "+&d" (r6)
|
||||||
|
|
||||||
#define CALL_CLOBBER_5 "0", "1", "14", "cc", "memory"
|
#define CALL_CLOBBER_5 "0", "1", "14", "cc", "memory"
|
||||||
#define CALL_CLOBBER_4 CALL_CLOBBER_5
|
#define CALL_CLOBBER_4 CALL_CLOBBER_5
|
||||||
@@ -118,7 +122,7 @@ struct stack_frame {
|
|||||||
" brasl 14,%[_fn]\n" \
|
" brasl 14,%[_fn]\n" \
|
||||||
" la 15,0(%[_prev])\n" \
|
" la 15,0(%[_prev])\n" \
|
||||||
: [_prev] "=&a" (prev), CALL_FMT_##nr \
|
: [_prev] "=&a" (prev), CALL_FMT_##nr \
|
||||||
[_stack] "R" (stack), \
|
: [_stack] "R" (stack), \
|
||||||
[_bc] "i" (offsetof(struct stack_frame, back_chain)), \
|
[_bc] "i" (offsetof(struct stack_frame, back_chain)), \
|
||||||
[_frame] "d" (frame), \
|
[_frame] "d" (frame), \
|
||||||
[_fn] "X" (fn) : CALL_CLOBBER_##nr); \
|
[_fn] "X" (fn) : CALL_CLOBBER_##nr); \
|
||||||
|
|||||||
@@ -418,6 +418,7 @@ ENTRY(\name)
|
|||||||
xgr %r6,%r6
|
xgr %r6,%r6
|
||||||
xgr %r7,%r7
|
xgr %r7,%r7
|
||||||
xgr %r10,%r10
|
xgr %r10,%r10
|
||||||
|
xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11)
|
||||||
mvc __PT_R8(64,%r11),__LC_SAVE_AREA_ASYNC
|
mvc __PT_R8(64,%r11),__LC_SAVE_AREA_ASYNC
|
||||||
stmg %r8,%r9,__PT_PSW(%r11)
|
stmg %r8,%r9,__PT_PSW(%r11)
|
||||||
tm %r8,0x0001 # coming from user space?
|
tm %r8,0x0001 # coming from user space?
|
||||||
|
|||||||
@@ -512,7 +512,6 @@ void arch_do_signal_or_restart(struct pt_regs *regs, bool has_signal)
|
|||||||
|
|
||||||
/* No handlers present - check for system call restart */
|
/* No handlers present - check for system call restart */
|
||||||
clear_pt_regs_flag(regs, PIF_SYSCALL);
|
clear_pt_regs_flag(regs, PIF_SYSCALL);
|
||||||
clear_pt_regs_flag(regs, PIF_SYSCALL_RESTART);
|
|
||||||
if (current->thread.system_call) {
|
if (current->thread.system_call) {
|
||||||
regs->int_code = current->thread.system_call;
|
regs->int_code = current->thread.system_call;
|
||||||
switch (regs->gprs[2]) {
|
switch (regs->gprs[2]) {
|
||||||
|
|||||||
@@ -66,7 +66,10 @@ static void cpu_group_map(cpumask_t *dst, struct mask_info *info, unsigned int c
|
|||||||
{
|
{
|
||||||
static cpumask_t mask;
|
static cpumask_t mask;
|
||||||
|
|
||||||
cpumask_copy(&mask, cpumask_of(cpu));
|
cpumask_clear(&mask);
|
||||||
|
if (!cpu_online(cpu))
|
||||||
|
goto out;
|
||||||
|
cpumask_set_cpu(cpu, &mask);
|
||||||
switch (topology_mode) {
|
switch (topology_mode) {
|
||||||
case TOPOLOGY_MODE_HW:
|
case TOPOLOGY_MODE_HW:
|
||||||
while (info) {
|
while (info) {
|
||||||
@@ -83,10 +86,10 @@ static void cpu_group_map(cpumask_t *dst, struct mask_info *info, unsigned int c
|
|||||||
default:
|
default:
|
||||||
fallthrough;
|
fallthrough;
|
||||||
case TOPOLOGY_MODE_SINGLE:
|
case TOPOLOGY_MODE_SINGLE:
|
||||||
cpumask_copy(&mask, cpumask_of(cpu));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cpumask_and(&mask, &mask, cpu_online_mask);
|
cpumask_and(&mask, &mask, cpu_online_mask);
|
||||||
|
out:
|
||||||
cpumask_copy(dst, &mask);
|
cpumask_copy(dst, &mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,7 +98,10 @@ static void cpu_thread_map(cpumask_t *dst, unsigned int cpu)
|
|||||||
static cpumask_t mask;
|
static cpumask_t mask;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
cpumask_copy(&mask, cpumask_of(cpu));
|
cpumask_clear(&mask);
|
||||||
|
if (!cpu_online(cpu))
|
||||||
|
goto out;
|
||||||
|
cpumask_set_cpu(cpu, &mask);
|
||||||
if (topology_mode != TOPOLOGY_MODE_HW)
|
if (topology_mode != TOPOLOGY_MODE_HW)
|
||||||
goto out;
|
goto out;
|
||||||
cpu -= cpu % (smp_cpu_mtid + 1);
|
cpu -= cpu % (smp_cpu_mtid + 1);
|
||||||
|
|||||||
@@ -366,16 +366,6 @@ static int vfio_ap_mdev_remove(struct mdev_device *mdev)
|
|||||||
struct ap_matrix_mdev *matrix_mdev = mdev_get_drvdata(mdev);
|
struct ap_matrix_mdev *matrix_mdev = mdev_get_drvdata(mdev);
|
||||||
|
|
||||||
mutex_lock(&matrix_dev->lock);
|
mutex_lock(&matrix_dev->lock);
|
||||||
|
|
||||||
/*
|
|
||||||
* If the KVM pointer is in flux or the guest is running, disallow
|
|
||||||
* un-assignment of control domain.
|
|
||||||
*/
|
|
||||||
if (matrix_mdev->kvm_busy || matrix_mdev->kvm) {
|
|
||||||
mutex_unlock(&matrix_dev->lock);
|
|
||||||
return -EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
vfio_ap_mdev_reset_queues(mdev);
|
vfio_ap_mdev_reset_queues(mdev);
|
||||||
list_del(&matrix_mdev->node);
|
list_del(&matrix_mdev->node);
|
||||||
kfree(matrix_mdev);
|
kfree(matrix_mdev);
|
||||||
|
|||||||
Reference in New Issue
Block a user