Patch "x86/mm: Rename flush_tlb_single() and flush_tlb_one() to __flush_tlb_one_[user|kernel]()" has been added to the 4.14-stable tree
Subsystems (9)
This is a note to let you know that I've just added the patch titled
x86/mm: Rename flush_tlb_single() and flush_tlb_one() to __flush_tlb_one_[user|kernel]()
to the 4.14-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-rename-flush_tlb_single-and-flush_tlb_one-to-__flush_tlb_one_.patch
and it can be found in the queue-4.14 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
1299ef1d8870d2d9f09a5aadf2f8b2c887c2d033Mon Sep 17 00:00:00 2001
From: Andy Lutomirski <[email protected]>
Date: Wed, 31 Jan 2018 08:03:10 -0800
Subject: x86/mm: Rename flush_tlb_single() and flush_tlb_one() to __flush_tlb_one_[user|kernel]()
From: Andy Lutomirski <[email protected]>
commit 1299ef1d8870d2d9f09a5aadf2f8b2c887c2d033 upstream.
flush_tlb_single() and flush_tlb_one() sound almost identical, but they really mean "flush one user translation" and "flush one kernel translation". Rename them to flush_tlb_one_user() and flush_tlb_one_kernel() to make the semantics more obvious.
[ I was looking at some PTI-related code, and the flush-one-address code
is unnecessarily hard to understand because the names of the helpers are uninformative. This came up during PTI review, but no one got around to doing it. ]
--- arch/x86/include/asm/paravirt.h | 4 ++-- arch/x86/include/asm/paravirt_types.h | 2 +- arch/x86/include/asm/pgtable_32.h | 2 +- arch/x86/include/asm/tlbflush.h | 27 ++++++++++++++++++++------- arch/x86/kernel/paravirt.c | 6 +++--- arch/x86/mm/init_64.c | 2 +- arch/x86/mm/ioremap.c | 2 +- arch/x86/mm/kmmio.c | 2 +- arch/x86/mm/pgtable_32.c | 2 +- arch/x86/mm/tlb.c | 6 +++--- arch/x86/platform/uv/tlb_uv.c | 2 +- arch/x86/xen/mmu_pv.c | 6 +++--- include/trace/events/xen.h | 2 +- 13 files changed, 39 insertions(+), 26 deletions(-)
arch/x86/include/asm/paravirt.h +2 -2
@@ -297,9 +297,9 @@ static inline void __flush_tlb_global(vo {PVOP_VCALL0 (pv_mmu_ops.flush_tlb_kernel); } -static inline void __flush_tlb_single (unsigned long addr) +static inline void __flush_tlb_one_user (unsigned long addr) { -PVOP_VCALL1 (pv_mmu_ops.flush_tlb_single, addr); +PVOP_VCALL1 (pv_mmu_ops.flush_tlb_one_user, addr); } static inline void flush_tlb_others(const struct cpumask *cpumask,
arch/x86/include/asm/paravirt_types.h +1 -1
@@ -217,7 +217,7 @@ struct pv_mmu_ops {/* TLB operations */ void (*flush_tlb_user)(void );void (*flush_tlb_kernel)(void ); -void (*flush_tlb_single)(unsigned long addr); +void (*flush_tlb_one_user)(unsigned long addr);void (*flush_tlb_others)(const struct cpumask *cpus,const struct flush_tlb_info *info);
arch/x86/include/asm/pgtable_32.h +1 -1
@@ -61,7 +61,7 @@ void paging_init(void);#define kpte_clear_flush (ptep, vaddr) \ do { \ pte_clear(&init_mm, (vaddr), (ptep)); \ - __flush_tlb_one((vaddr)); \ + __flush_tlb_one_kernel((vaddr)); \ } while (0)#endif /* !__ASSEMBLY__ */
arch/x86/include/asm/tlbflush.h +20 -7
@@ -140,7 +140,7 @@ static inline unsigned long build_cr3_no#else #define __flush_tlb () __native_flush_tlb()#define __flush_tlb_global () __native_flush_tlb_global() -#define __flush_tlb_single (addr) __native_flush_tlb_single(addr) +#define __flush_tlb_one_user (addr) __native_flush_tlb_one_user(addr)#endif static inline bool tlb_defer_switch_to_init_mm (void )
@@ -397,7 +397,7 @@ static inline void __native_flush_tlb_gl/* * flush one page in the user mapping */ -static inline void __native_flush_tlb_single (unsigned long addr) +static inline void __native_flush_tlb_one_user (unsigned long addr) {u32 loaded_mm_asid =this_cpu_read (cpu_tlbstate.loaded_mm_asid);
@@ -434,18 +434,31 @@ static inline void __flush_tlb_all(void)/* * flush one page in the kernel mapping */ -static inline void __flush_tlb_one (unsigned long addr) +static inline void __flush_tlb_one_kernel (unsigned long addr) {count_vm_tlb_event (NR_TLB_LOCAL_FLUSH_ONE ); -__flush_tlb_single (addr); + +/* +* If PTI is off, then __flush_tlb_one_user() is just INVLPG or its +* paravirt equivalent. Even with PCID, this is sufficient: we only +* use PCID if we also use global PTEs for the kernel mapping, and +* INVLPG flushes global translations across all address spaces. +* +* If PTI is on, then the kernel is mapped with non-global PTEs, and +* __flush_tlb_one_user() will flush the given address for the current +* kernel address space and for its usermode counterpart, but it does +* not flush it for other address spaces. +*/ +__flush_tlb_one_user (addr);if (!static_cpu_has (X86_FEATURE_PTI ))return ;/* -* __flush_tlb_single() will have cleared the TLB entry for this ASID, -* but since kernel space is replicated across all, we must also -* invalidate all others. +* See above. We need to propagate the flush to all other address +* spaces. In principle, we only need to propagate it to kernelmode +* address spaces, but the extra bookkeeping we would need is not +* worth it. */ invalidate_other_asid (); }
arch/x86/kernel/paravirt.c +3 -3
@@ -190,9 +190,9 @@ static void native_flush_tlb_global(void__native_flush_tlb_global (); } -static void native_flush_tlb_single (unsigned long addr) +static void native_flush_tlb_one_user (unsigned long addr) { -__native_flush_tlb_single (addr); +__native_flush_tlb_one_user (addr); }struct static_key paravirt_steal_enabled;
@@ -391,7 +391,7 @@ struct pv_mmu_ops pv_mmu_ops __ro_after_ .flush_tlb_user = native_flush_tlb, .flush_tlb_kernel = native_flush_tlb_global, - .flush_tlb_single = native_flush_tlb_single, + .flush_tlb_one_user = native_flush_tlb_one_user, .flush_tlb_others = native_flush_tlb_others, .pgd_alloc = __paravirt_pgd_alloc,
arch/x86/mm/init_64.c +1 -1
@@ -256,7 +256,7 @@ static void __set_pte_vaddr(pud_t *pud,* It's enough to flush this one mapping. * (PGE mappings get flushed as well) */ -__flush_tlb_one (vaddr); +__flush_tlb_one_kernel (vaddr); }void set_pte_vaddr_p4d (p4d_t *p4d_page,unsigned long vaddr,pte_t new_pte)
arch/x86/mm/ioremap.c +1 -1
@@ -749,5 +749,5 @@ void __init __early_set_fixmap(enum fixeset_pte (pte,pfn_pte (phys >>PAGE_SHIFT , flags)); else pte_clear(&init_mm, addr, pte); -__flush_tlb_one (addr); +__flush_tlb_one_kernel (addr); }
arch/x86/mm/kmmio.c +1 -1
@@ -168,7 +168,7 @@ static int clear_page_presence(struct kmreturn -1 ; } -__flush_tlb_one (f->addr); +__flush_tlb_one_kernel (f->addr);return 0 ; }
arch/x86/mm/pgtable_32.c +1 -1
@@ -63,7 +63,7 @@ void set_pte_vaddr(unsigned long vaddr,* It's enough to flush this one mapping. * (PGE mappings get flushed as well) */ -__flush_tlb_one (vaddr); +__flush_tlb_one_kernel (vaddr); }unsigned long __FIXADDR_TOP =0xfffff000 ;
arch/x86/mm/tlb.c +3 -3
@@ -492,7 +492,7 @@ static void flush_tlb_func_common(const* flush that changes context.tlb_gen from 2 to 3. If they get * processed on this CPU in reverse order, we'll see * local_tlb_gen == 1, mm_tlb_gen == 3, and end != TLB_FLUSH_ALL. -* If we were to use __flush_tlb_single() and set local_tlb_gen to +* If we were to use __flush_tlb_one_user() and set local_tlb_gen to * 3, we'd be break the invariant: we'd update local_tlb_gen above * 1 without the full flush that's needed for tlb_gen 2. *
@@ -513,7 +513,7 @@ static void flush_tlb_func_common(const addr = f->start;while (addr < f->end) { -__flush_tlb_single (addr); +__flush_tlb_one_user (addr); addr +=PAGE_SIZE ; }if (local)
@@ -660,7 +660,7 @@ static void do_kernel_range_flush(void */* flush range by one by one 'invlpg' */ for (addr = f->start; addr < f->end; addr +=PAGE_SIZE ) -__flush_tlb_one (addr); +__flush_tlb_one_kernel (addr); }void flush_tlb_kernel_range (unsigned long start,unsigned long end)
arch/x86/platform/uv/tlb_uv.c +1 -1
@@ -299,7 +299,7 @@ static void bau_process_message(struct mlocal_flush_tlb (); stat->d_alltlb++; }else { -__flush_tlb_single (msg->address); +__flush_tlb_one_user (msg->address); stat->d_onetlb++; } stat->d_requestee++;
arch/x86/xen/mmu_pv.c +3 -3
@@ -1300,12 +1300,12 @@ static void xen_flush_tlb(void)preempt_enable (); } -static void xen_flush_tlb_single (unsigned long addr) +static void xen_flush_tlb_one_user (unsigned long addr) {struct mmuext_op *op;struct multicall_space mcs; -trace_xen_mmu_flush_tlb_single (addr); +trace_xen_mmu_flush_tlb_one_user (addr);preempt_disable ();
@@ -2360,7 +2360,7 @@ static const struct pv_mmu_ops xen_mmu_o .flush_tlb_user = xen_flush_tlb, .flush_tlb_kernel = xen_flush_tlb, - .flush_tlb_single = xen_flush_tlb_single, + .flush_tlb_one_user = xen_flush_tlb_one_user, .flush_tlb_others = xen_flush_tlb_others, .pgd_alloc = xen_pgd_alloc,
include/trace/events/xen.h +1 -1
@@ -365,7 +365,7 @@ TRACE_EVENT(xen_mmu_flush_tlb,TP_printk ("%s" ,"" ) ); -TRACE_EVENT(xen_mmu_flush_tlb_single, +TRACE_EVENT(xen_mmu_flush_tlb_one_user, TP_PROTO(unsigned long addr), TP_ARGS(addr), TP_STRUCT__entry(
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/x86-entry-64-interleave-xor-register-clearing-with-push-instructions.patch queue-4.14/x86-spectre-fix-an-error-message.patch queue-4.14/x86-entry-64-merge-the-pop_c_regs-and-pop_extra_regs-macros-into-a-single-pop_regs-macro.patch queue-4.14/x86-entry-64-remove-the-unused-icebp-macro.patch queue-4.14/kvm-nvmx-set-the-cpu_based_use_msr_bitmaps-if-we-have-a-valid-l02-msr-bitmap.patch queue-4.14/x86-nvmx-properly-set-spec_ctrl-and-pred_cmd-before-merging-msrs.patch queue-4.14/x86-speculation-add-asm-msr-index.h-dependency.patch queue-4.14/x86-entry-64-use-push_and_clean_regs-in-more-cases.patch queue-4.14/selftests-x86-disable-tests-requiring-32-bit-support-on-pure-64-bit-systems.patch queue-4.14/x86-debug-use-ud2-for-warn.patch queue-4.14/x86-speculation-update-speculation-control-microcode-blacklist.patch queue-4.14/x86-entry-64-clear-registers-for-exceptions-interrupts-to-reduce-speculation-attack-surface.patch queue-4.14/x86-speculation-correct-speculation-control-microcode-blacklist-again.patch queue-4.14/x86-entry-64-merge-save_c_regs-and-save_extra_regs-remove-unused-extensions.patch queue-4.14/selftests-x86-do-not-rely-on-int-0x80-in-single_step_syscall.c.patch queue-4.14/selftests-x86-fix-vdso-selftest-segfault-for-vsyscall-none.patch queue-4.14/x86-debug-objtool-annotate-warn-related-ud2-as-reachable.patch queue-4.14/objtool-fix-segfault-in-ignore_unreachable_insn.patch queue-4.14/x86-entry-64-indent-push_and_clear_regs-and-pop_regs-properly.patch queue-4.14/selftests-x86-pkeys-remove-unused-functions.patch queue-4.14/selftests-x86-clean-up-and-document-sscanf-usage.patch queue-4.14/x86-speculation-fix-up-array_index_nospec_mask-asm-constraint.patch queue-4.14/x86-entry-64-clear-extra-registers-beyond-syscall-arguments-to-reduce-speculation-attack-surface.patch queue-4.14/kvm-x86-reduce-retpoline-performance-impact-in-slot_handle_level_range-by-always-inlining-iterator-helper-methods.patch queue-4.14/selftests-x86-do-not-rely-on-int-0x80-in-test_mremap_vdso.c.patch queue-4.14/x86-mm-pti-fix-pti-comment-in-entry_syscall_64.patch queue-4.14/x86-entry-64-get-rid-of-the-alloc_pt_gpregs_on_stack-and-save_and_clear_regs-macros.patch queue-4.14/x86-speculation-clean-up-various-spectre-related-details.patch queue-4.14/x86-entry-64-introduce-the-push_and_clean_regs-macro.patch queue-4.14/revert-x86-speculation-simplify-indirect_branch_prediction_barrier.patch queue-4.14/x86-entry-64-compat-clear-registers-for-compat-syscalls-to-reduce-speculation-attack-surface.patch queue-4.14/x86-mm-rename-flush_tlb_single-and-flush_tlb_one-to-__flush_tlb_one_.patch queue-4.14/x86-entry-64-fix-cr3-restore-in-paranoid_exit.patch
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>