This source file includes following definitions.
- __tlb_remove_page_size
- tlb_flush
- pte_free_tlb
- pmd_free_tlb
- p4d_free_tlb
- pud_free_tlb
1
2 #ifndef _S390_TLB_H
3 #define _S390_TLB_H
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 void __tlb_remove_table(void *_table);
26 static inline void tlb_flush(struct mmu_gather *tlb);
27 static inline bool __tlb_remove_page_size(struct mmu_gather *tlb,
28 struct page *page, int page_size);
29
30 #define tlb_start_vma(tlb, vma) do { } while (0)
31 #define tlb_end_vma(tlb, vma) do { } while (0)
32
33 #define tlb_flush tlb_flush
34 #define pte_free_tlb pte_free_tlb
35 #define pmd_free_tlb pmd_free_tlb
36 #define p4d_free_tlb p4d_free_tlb
37 #define pud_free_tlb pud_free_tlb
38
39 #include <asm/pgalloc.h>
40 #include <asm/tlbflush.h>
41 #include <asm-generic/tlb.h>
42
43
44
45
46
47
48 static inline bool __tlb_remove_page_size(struct mmu_gather *tlb,
49 struct page *page, int page_size)
50 {
51 free_page_and_swap_cache(page);
52 return false;
53 }
54
55 static inline void tlb_flush(struct mmu_gather *tlb)
56 {
57 __tlb_flush_mm_lazy(tlb->mm);
58 }
59
60
61
62
63
64 static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
65 unsigned long address)
66 {
67 __tlb_adjust_range(tlb, address, PAGE_SIZE);
68 tlb->mm->context.flush_mm = 1;
69 tlb->freed_tables = 1;
70 tlb->cleared_ptes = 1;
71
72
73
74
75
76 page_table_free_rcu(tlb, (unsigned long *) pte, address);
77 }
78
79
80
81
82
83
84
85
86 static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
87 unsigned long address)
88 {
89 if (mm_pmd_folded(tlb->mm))
90 return;
91 pgtable_pmd_page_dtor(virt_to_page(pmd));
92 __tlb_adjust_range(tlb, address, PAGE_SIZE);
93 tlb->mm->context.flush_mm = 1;
94 tlb->freed_tables = 1;
95 tlb->cleared_puds = 1;
96 tlb_remove_table(tlb, pmd);
97 }
98
99
100
101
102
103
104
105
106 static inline void p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d,
107 unsigned long address)
108 {
109 if (mm_p4d_folded(tlb->mm))
110 return;
111 __tlb_adjust_range(tlb, address, PAGE_SIZE);
112 tlb->mm->context.flush_mm = 1;
113 tlb->freed_tables = 1;
114 tlb->cleared_p4ds = 1;
115 tlb_remove_table(tlb, p4d);
116 }
117
118
119
120
121
122
123
124
125 static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
126 unsigned long address)
127 {
128 if (mm_pud_folded(tlb->mm))
129 return;
130 tlb->mm->context.flush_mm = 1;
131 tlb->freed_tables = 1;
132 tlb->cleared_puds = 1;
133 tlb_remove_table(tlb, pud);
134 }
135
136
137 #endif