1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#ifndef __ASM_TLB_H
20#define __ASM_TLB_H
21
22#include <linux/pagemap.h>
23#include <linux/swap.h>
24
25static inline void __tlb_remove_table(void *_table)
26{
27 free_page_and_swap_cache((struct page *)_table);
28}
29
30#define tlb_flush tlb_flush
31static void tlb_flush(struct mmu_gather *tlb);
32
33#include <asm-generic/tlb.h>
34
35static inline void tlb_flush(struct mmu_gather *tlb)
36{
37 struct vm_area_struct vma = TLB_FLUSH_VMA(tlb->mm, 0);
38
39
40
41
42
43 if (tlb->fullmm)
44 return;
45
46
47
48
49
50
51 __flush_tlb_range(&vma, tlb->start, tlb->end, PAGE_SIZE, true);
52}
53
54static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
55 unsigned long addr)
56{
57 __flush_tlb_pgtable(tlb->mm, addr);
58 pgtable_page_dtor(pte);
59 tlb_remove_table(tlb, pte);
60}
61
62#if CONFIG_PGTABLE_LEVELS > 2
63static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp,
64 unsigned long addr)
65{
66 __flush_tlb_pgtable(tlb->mm, addr);
67 tlb_remove_table(tlb, virt_to_page(pmdp));
68}
69#endif
70
71#if CONFIG_PGTABLE_LEVELS > 3
72static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pudp,
73 unsigned long addr)
74{
75 __flush_tlb_pgtable(tlb->mm, addr);
76 tlb_remove_table(tlb, virt_to_page(pudp));
77}
78#endif
79
80#endif
81