File Index
Files and directories
Sign in
FILE

tlbflush.h

File preview with syntax highlighting.

linux-6.19.14/arch/alpha/include/asm/tlbflush.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _ALPHA_TLBFLUSH_H
  3#define _ALPHA_TLBFLUSH_H
  4
  5#include <linux/mm.h>
  6#include <linux/sched.h>
  7#include <asm/compiler.h>
  8
  9#ifndef __EXTERN_INLINE
 10#define __EXTERN_INLINE extern inline
 11#define __MMU_EXTERN_INLINE
 12#endif
 13
 14extern void __load_new_mm_context(struct mm_struct *);
 15
 16
 17__EXTERN_INLINE void
 18ev5_flush_tlb_current(struct mm_struct *mm)
 19{
 20	__load_new_mm_context(mm);
 21}
 22
 23/* Flush just one page in the current TLB set.  We need to be very
 24   careful about the icache here, there is no way to invalidate a
 25   specific icache page.  */
 26
 27__EXTERN_INLINE void
 28ev5_flush_tlb_current_page(struct mm_struct * mm,
 29			   struct vm_area_struct *vma,
 30			   unsigned long addr)
 31{
 32	if (vma->vm_flags & VM_EXEC)
 33		__load_new_mm_context(mm);
 34	else
 35		tbi(2, addr);
 36}
 37
 38
 39#define flush_tlb_current	ev5_flush_tlb_current
 40#define flush_tlb_current_page	ev5_flush_tlb_current_page
 41
 42#ifdef __MMU_EXTERN_INLINE
 43#undef __EXTERN_INLINE
 44#undef __MMU_EXTERN_INLINE
 45#endif
 46
 47/* Flush current user mapping.  */
 48static inline void
 49flush_tlb(void)
 50{
 51	flush_tlb_current(current->active_mm);
 52}
 53
 54/* Flush someone else's user mapping.  */
 55static inline void
 56flush_tlb_other(struct mm_struct *mm)
 57{
 58	unsigned long *mmc = &mm->context[smp_processor_id()];
 59	/* Check it's not zero first to avoid cacheline ping pong
 60	   when possible.  */
 61
 62	if (READ_ONCE(*mmc))
 63		WRITE_ONCE(*mmc, 0);
 64}
 65
 66#ifndef CONFIG_SMP
 67/* Flush everything (kernel mapping may also have changed
 68   due to vmalloc/vfree).  */
 69static inline void flush_tlb_all(void)
 70{
 71	tbia();
 72}
 73
 74/* Flush a specified user mapping.  */
 75static inline void
 76flush_tlb_mm(struct mm_struct *mm)
 77{
 78	if (mm == current->active_mm)
 79		flush_tlb_current(mm);
 80	else
 81		flush_tlb_other(mm);
 82}
 83
 84/* Page-granular tlb flush.  */
 85static inline void
 86flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
 87{
 88	struct mm_struct *mm = vma->vm_mm;
 89
 90	if (mm == current->active_mm)
 91		flush_tlb_current_page(mm, vma, addr);
 92	else
 93		flush_tlb_other(mm);
 94}
 95
 96/* Flush a specified range of user mapping.  On the Alpha we flush
 97   the whole user tlb.  */
 98static inline void
 99flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
100		unsigned long end)
101{
102	flush_tlb_mm(vma->vm_mm);
103}
104
105#else /* CONFIG_SMP */
106
107extern void flush_tlb_all(void);
108extern void flush_tlb_mm(struct mm_struct *);
109extern void flush_tlb_page(struct vm_area_struct *, unsigned long);
110extern void flush_tlb_range(struct vm_area_struct *, unsigned long,
111			    unsigned long);
112
113#endif /* CONFIG_SMP */
114
115static inline void flush_tlb_kernel_range(unsigned long start,
116					unsigned long end)
117{
118	flush_tlb_all();
119}
120
121#endif /* _ALPHA_TLBFLUSH_H */
~/ Read-only file preview.