Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #ifndef __ASMARM_TLB_H |
2 | #define __ASMARM_TLB_H | |
3 | ||
4 | #include <asm/pgalloc.h> | |
5 | #include <asm/tlbflush.h> | |
6 | ||
7 | /* | |
8 | * TLB handling. This allows us to remove pages from the page | |
9 | * tables, and efficiently handle the TLB issues. | |
10 | */ | |
11 | struct mmu_gather { | |
12 | struct mm_struct *mm; | |
13 | unsigned int freed; | |
14 | unsigned int fullmm; | |
15 | ||
16 | unsigned int flushes; | |
17 | unsigned int avoided_flushes; | |
18 | }; | |
19 | ||
20 | extern struct mmu_gather mmu_gathers[NR_CPUS]; | |
21 | ||
22 | static inline struct mmu_gather * | |
23 | tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush) | |
24 | { | |
25 | int cpu = smp_processor_id(); | |
26 | struct mmu_gather *tlb = &mmu_gathers[cpu]; | |
27 | ||
28 | tlb->mm = mm; | |
29 | tlb->freed = 0; | |
30 | tlb->fullmm = full_mm_flush; | |
31 | ||
32 | return tlb; | |
33 | } | |
34 | ||
35 | static inline void | |
36 | tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) | |
37 | { | |
38 | struct mm_struct *mm = tlb->mm; | |
39 | unsigned long freed = tlb->freed; | |
40 | int rss = get_mm_counter(mm, rss); | |
41 | ||
42 | if (rss < freed) | |
43 | freed = rss; | |
44 | add_mm_counter(mm, rss, -freed); | |
45 | ||
46 | if (freed) { | |
47 | flush_tlb_mm(mm); | |
48 | tlb->flushes++; | |
49 | } else { | |
50 | tlb->avoided_flushes++; | |
51 | } | |
52 | ||
53 | /* keep the page table cache within bounds */ | |
54 | check_pgt_cache(); | |
55 | } | |
56 | ||
57 | ||
58 | static inline unsigned int | |
59 | tlb_is_full_mm(struct mmu_gather *tlb) | |
60 | { | |
61 | return tlb->fullmm; | |
62 | } | |
63 | ||
64 | #define tlb_remove_tlb_entry(tlb,ptep,address) do { } while (0) | |
65 | //#define tlb_start_vma(tlb,vma) do { } while (0) | |
66 | //FIXME - ARM32 uses this now that things changed in the kernel. seems like it may be pointless on arm26, however to get things compiling... | |
67 | #define tlb_start_vma(tlb,vma) \ | |
68 | do { \ | |
69 | if (!tlb->fullmm) \ | |
70 | flush_cache_range(vma, vma->vm_start, vma->vm_end); \ | |
71 | } while (0) | |
72 | #define tlb_end_vma(tlb,vma) do { } while (0) | |
73 | ||
74 | #define tlb_remove_page(tlb,page) free_page_and_swap_cache(page) | |
75 | #define pte_free_tlb(tlb,ptep) pte_free(ptep) | |
76 | #define pmd_free_tlb(tlb,pmdp) pmd_free(pmdp) | |
77 | ||
78 | #endif |