Patch "x86/mm, sched/core: Uninline switch_mm()" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
x86/mm, sched/core: Uninline switch_mm()
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-mm-sched-core-uninline-switch_mm.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
69c0319aabba45bcf33178916a2f06967b4adedeMon Sep 17 00:00:00 2001
From: Andy Lutomirski <[email protected]>
Date: Tue, 26 Apr 2016 09:39:08 -0700
Subject: x86/mm, sched/core: Uninline switch_mm()
From: Andy Lutomirski <[email protected]>
commit 69c0319aabba45bcf33178916a2f06967b4adede upstream.
It's fairly large and it has quite a few callers. This may also help untangle some headers down the road.
--- arch/x86/include/asm/mmu_context.h | 98 ----------------------------------- arch/x86/mm/tlb.c | 102 +++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 96 deletions(-)
arch/x86/include/asm/mmu_context.h +2 -96
@@ -104,103 +104,9 @@ static inline void enter_lazy_tlb(struct#endif } -static inline void switch_mm (struct mm_struct *prev,struct mm_struct *next, -struct task_struct *tsk) -{ -unsigned cpu =smp_processor_id (); +extern void switch_mm (struct mm_struct *prev,struct mm_struct *next, +struct task_struct *tsk); -if (likely (prev != next)) { -#ifdef CONFIG_SMP -this_cpu_write (cpu_tlbstate.state,TLBSTATE_OK ); -this_cpu_write (cpu_tlbstate.active_mm, next); -#endif -cpumask_set_cpu (cpu,mm_cpumask (next)); - -/* -* Re-load page tables. -* -* This logic has an ordering constraint: -* -* CPU 0: Write to a PTE for 'next' -* CPU 0: load bit 1 in mm_cpumask. if nonzero, send IPI. -* CPU 1: set bit 1 in next's mm_cpumask -* CPU 1: load from the PTE that CPU 0 writes (implicit) -* -* We need to prevent an outcome in which CPU 1 observes -* the new PTE value and CPU 0 observes bit 1 clear in -* mm_cpumask. (If that occurs, then the IPI will never -* be sent, and CPU 0's TLB will contain a stale entry.) -* -* The bad outcome can occur if either CPU's load is -* reordered before that CPU's store, so both CPUs must -* execute full barriers to prevent this from happening. -* -* Thus, switch_mm needs a full barrier between the -* store to mm_cpumask and any operation that could load -* from next->pgd. TLB fills are special and can happen -* due to instruction fetches or for no reason at all, -* and neither LOCK nor MFENCE orders them. -* Fortunately, load_cr3() is serializing and gives the -* ordering guarantee we need. -* -*/ -load_cr3 (next->pgd); - -trace_tlb_flush (TLB_FLUSH_ON_TASK_SWITCH ,TLB_FLUSH_ALL ); - -/* Stop flush ipis for the previous mm */ -cpumask_clear_cpu (cpu,mm_cpumask (prev)); - -/* Load per-mm CR4 state */ -load_mm_cr4 (next); - -#ifdef CONFIG_MODIFY_LDT_SYSCALL -/* -* Load the LDT, if the LDT is different. -* -* It's possible that prev->context.ldt doesn't match -* the LDT register. This can happen if leave_mm(prev) -* was called and then modify_ldt changed -* prev->context.ldt but suppressed an IPI to this CPU. -* In this case, prev->context.ldt != NULL, because we -* never set context.ldt to NULL while the mm still -* exists. That means that next->context.ldt != -* prev->context.ldt, because mms never share an LDT. -*/ -if (unlikely (prev->context.ldt != next->context.ldt)) -load_mm_ldt (next); -#endif - } -#ifdef CONFIG_SMP - else { -this_cpu_write (cpu_tlbstate.state,TLBSTATE_OK ); -BUG_ON (this_cpu_read (cpu_tlbstate.active_mm) != next); - -if (!cpumask_test_cpu (cpu,mm_cpumask (next))) { -/* -* On established mms, the mm_cpumask is only changed -* from irq context, from ptep_clear_flush() while in -* lazy tlb mode, and here. Irqs are blocked during -* schedule, protecting us from simultaneous changes. -*/ -cpumask_set_cpu (cpu,mm_cpumask (next)); - -/* -* We were in lazy tlb mode and leave_mm disabled -* tlb flush IPI delivery. We must reload CR3 -* to make sure to use no freed page tables. -* -* As above, load_cr3() is serializing and orders TLB -* fills with respect to the mm_cpumask write. -*/ -load_cr3 (next->pgd); -trace_tlb_flush (TLB_FLUSH_ON_TASK_SWITCH ,TLB_FLUSH_ALL ); -load_mm_cr4 (next); -load_mm_ldt (next); - } - } -#endif -}#define activate_mm (prev, next) \ do { \
arch/x86/mm/tlb.c +102 -0
108 lines not on this page · raw message
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/x86-mm-sched-core-uninline-switch_mm.patch queue-4.4/x86-mm-add-a-noinvpcid-boot-option-to-turn-off-invpcid.patch queue-4.4/x86-irq-do-not-substract-irq_tlb_count-from-irq_call_count.patch queue-4.4/x86-mm-if-invpcid-is-available-use-it-to-flush-global-mappings.patch queue-4.4/x86-mm-add-invpcid-helpers.patch queue-4.4/sched-core-add-switch_mm_irqs_off-and-use-it-in-the-scheduler.patch queue-4.4/arm-hide-finish_arch_post_lock_switch-from-modules.patch queue-4.4/x86-mm-sched-core-turn-off-irqs-in-switch_mm.patch queue-4.4/mm-mmu_context-sched-core-fix-mmu_context.h-assumption.patch queue-4.4/x86-mm-build-arch-x86-mm-tlb.c-even-on-smp.patch queue-4.4/sched-core-idle_task_exit-shouldn-t-use-switch_mm_irqs_off.patch