Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _ASM_IA64_TLBFLUSH_H
  3#define _ASM_IA64_TLBFLUSH_H
  4
  5/*
  6 * Copyright (C) 2002 Hewlett-Packard Co
  7 *	David Mosberger-Tang <davidm@hpl.hp.com>
  8 */
  9
 10
 11#include <linux/mm.h>
 12
 13#include <asm/intrinsics.h>
 14#include <asm/mmu_context.h>
 15#include <asm/page.h>
 16
 17/*
 18 * Now for some TLB flushing routines.  This is the kind of stuff that
 19 * can be very expensive, so try to avoid them whenever possible.
 20 */
 21extern void setup_ptcg_sem(int max_purges, int from_palo);
 22
 23/*
 24 * Flush everything (kernel mapping may also have changed due to
 25 * vmalloc/vfree).
 26 */
 27extern void local_flush_tlb_all (void);
 28
 29#ifdef CONFIG_SMP
 30  extern void smp_flush_tlb_all (void);
 31  extern void smp_flush_tlb_mm (struct mm_struct *mm);
 32  extern void smp_flush_tlb_cpumask (cpumask_t xcpumask);
 33# define flush_tlb_all()	smp_flush_tlb_all()
 34#else
 35# define flush_tlb_all()	local_flush_tlb_all()
 36# define smp_flush_tlb_cpumask(m) local_flush_tlb_all()
 37#endif
 38
 39static inline void
 40local_finish_flush_tlb_mm (struct mm_struct *mm)
 41{
 42	if (mm == current->active_mm)
 43		activate_context(mm);
 44}
 45
 46/*
 47 * Flush a specified user mapping.  This is called, e.g., as a result of fork() and
 48 * exit().  fork() ends up here because the copy-on-write mechanism needs to write-protect
 49 * the PTEs of the parent task.
 50 */
 51static inline void
 52flush_tlb_mm (struct mm_struct *mm)
 53{
 54	if (!mm)
 55		return;
 56
 57	set_bit(mm->context, ia64_ctx.flushmap);
 58	mm->context = 0;
 59
 60	if (atomic_read(&mm->mm_users) == 0)
 61		return;		/* happens as a result of exit_mmap() */
 62
 63#ifdef CONFIG_SMP
 64	smp_flush_tlb_mm(mm);
 65#else
 66	local_finish_flush_tlb_mm(mm);
 67#endif
 68}
 69
 70extern void flush_tlb_range (struct vm_area_struct *vma, unsigned long start, unsigned long end);
 71
 72/*
 73 * Page-granular tlb flush.
 74 */
 75static inline void
 76flush_tlb_page (struct vm_area_struct *vma, unsigned long addr)
 77{
 78#ifdef CONFIG_SMP
 79	flush_tlb_range(vma, (addr & PAGE_MASK), (addr & PAGE_MASK) + PAGE_SIZE);
 80#else
 81	if (vma->vm_mm == current->active_mm)
 82		ia64_ptcl(addr, (PAGE_SHIFT << 2));
 83	else
 84		vma->vm_mm->context = 0;
 85#endif
 86}
 87
 88/*
 89 * Flush the local TLB. Invoked from another cpu using an IPI.
 90 */
 91#ifdef CONFIG_SMP
 92void smp_local_flush_tlb(void);
 93#else
 94#define smp_local_flush_tlb()
 95#endif
 96
 97static inline void flush_tlb_kernel_range(unsigned long start,
 98					  unsigned long end)
 99{
100	flush_tlb_all();	/* XXX fix me */
101}
102
103#endif /* _ASM_IA64_TLBFLUSH_H */