FAILED: patch "[PATCH] s390/mm: always force a load of the primary ASCE on context" failed to apply to 3.18-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 3.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a38662084c8bdb829ff486468c7ea801c13fcc34 Mon Sep 17 00:00:00 2001
From: Martin Schwidefsky <[email protected]>
Date: Tue, 8 Jan 2019 12:44:57 +0100
Subject: [PATCH] s390/mm: always force a load of the primary ASCE on context
switch
The ASCE of an mm_struct can be modified after a task has been created, e.g. via crst_table_downgrade for a compat process. The active_mm logic to avoid the switch_mm call if the next task is a kernel thread can lead to a situation where switch_mm is called where 'prev == next' is true but 'prev->context.asce == next->context.asce' is not.
This can lead to a situation where a CPU uses the outdated ASCE to run a task. The result can be a crash, endless loops and really subtle problem due to TLBs being created with an invalid ASCE.
arch/s390/include/asm/mmu_context.h +2 -3
@@ -90,8 +90,6 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, {int cpu =smp_processor_id (); -if (prev == next) -return ; S390_lowcore.user_asce = next->context.asce;cpumask_set_cpu (cpu, &next->context.cpu_attach_mask);/* Clear previous user-ASCE from CR1 and CR7 */
@@ -103,7 +101,8 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,__ctl_load (S390_lowcore.vdso_asce,7 ,7 );clear_cpu_flag (CIF_ASCE_SECONDARY ); } -cpumask_clear_cpu (cpu, &prev->context.cpu_attach_mask); +if (prev != next) +cpumask_clear_cpu (cpu, &prev->context.cpu_attach_mask); }#define finish_arch_post_lock_switch finish_arch_post_lock_switch