diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /arch/mips/mm/highmem.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'arch/mips/mm/highmem.c')
-rw-r--r-- | arch/mips/mm/highmem.c | 51 |
1 files changed, 28 insertions, 23 deletions
diff --git a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c index 6a2b1bf9ef11..3634c7ea06ac 100644 --- a/arch/mips/mm/highmem.c +++ b/arch/mips/mm/highmem.c | |||
@@ -9,7 +9,7 @@ static pte_t *kmap_pte; | |||
9 | 9 | ||
10 | unsigned long highstart_pfn, highend_pfn; | 10 | unsigned long highstart_pfn, highend_pfn; |
11 | 11 | ||
12 | void *__kmap(struct page *page) | 12 | void *kmap(struct page *page) |
13 | { | 13 | { |
14 | void *addr; | 14 | void *addr; |
15 | 15 | ||
@@ -21,16 +21,16 @@ void *__kmap(struct page *page) | |||
21 | 21 | ||
22 | return addr; | 22 | return addr; |
23 | } | 23 | } |
24 | EXPORT_SYMBOL(__kmap); | 24 | EXPORT_SYMBOL(kmap); |
25 | 25 | ||
26 | void __kunmap(struct page *page) | 26 | void kunmap(struct page *page) |
27 | { | 27 | { |
28 | BUG_ON(in_interrupt()); | 28 | BUG_ON(in_interrupt()); |
29 | if (!PageHighMem(page)) | 29 | if (!PageHighMem(page)) |
30 | return; | 30 | return; |
31 | kunmap_high(page); | 31 | kunmap_high(page); |
32 | } | 32 | } |
33 | EXPORT_SYMBOL(__kunmap); | 33 | EXPORT_SYMBOL(kunmap); |
34 | 34 | ||
35 | /* | 35 | /* |
36 | * kmap_atomic/kunmap_atomic is significantly faster than kmap/kunmap because | 36 | * kmap_atomic/kunmap_atomic is significantly faster than kmap/kunmap because |
@@ -41,17 +41,17 @@ EXPORT_SYMBOL(__kunmap); | |||
41 | * kmaps are appropriate for short, tight code paths only. | 41 | * kmaps are appropriate for short, tight code paths only. |
42 | */ | 42 | */ |
43 | 43 | ||
44 | void *__kmap_atomic(struct page *page, enum km_type type) | 44 | void *__kmap_atomic(struct page *page) |
45 | { | 45 | { |
46 | enum fixed_addresses idx; | ||
47 | unsigned long vaddr; | 46 | unsigned long vaddr; |
47 | int idx, type; | ||
48 | 48 | ||
49 | /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ | 49 | /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ |
50 | pagefault_disable(); | 50 | pagefault_disable(); |
51 | if (!PageHighMem(page)) | 51 | if (!PageHighMem(page)) |
52 | return page_address(page); | 52 | return page_address(page); |
53 | 53 | ||
54 | debug_kmap_atomic(type); | 54 | type = kmap_atomic_idx_push(); |
55 | idx = type + KM_TYPE_NR*smp_processor_id(); | 55 | idx = type + KM_TYPE_NR*smp_processor_id(); |
56 | vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); | 56 | vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); |
57 | #ifdef CONFIG_DEBUG_HIGHMEM | 57 | #ifdef CONFIG_DEBUG_HIGHMEM |
@@ -64,43 +64,48 @@ void *__kmap_atomic(struct page *page, enum km_type type) | |||
64 | } | 64 | } |
65 | EXPORT_SYMBOL(__kmap_atomic); | 65 | EXPORT_SYMBOL(__kmap_atomic); |
66 | 66 | ||
67 | void __kunmap_atomic_notypecheck(void *kvaddr, enum km_type type) | 67 | void __kunmap_atomic(void *kvaddr) |
68 | { | 68 | { |
69 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
70 | unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; | 69 | unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; |
71 | enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id(); | 70 | int type; |
72 | 71 | ||
73 | if (vaddr < FIXADDR_START) { // FIXME | 72 | if (vaddr < FIXADDR_START) { // FIXME |
74 | pagefault_enable(); | 73 | pagefault_enable(); |
75 | return; | 74 | return; |
76 | } | 75 | } |
77 | 76 | ||
78 | BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); | 77 | type = kmap_atomic_idx(); |
78 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
79 | { | ||
80 | int idx = type + KM_TYPE_NR * smp_processor_id(); | ||
79 | 81 | ||
80 | /* | 82 | BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); |
81 | * force other mappings to Oops if they'll try to access | ||
82 | * this pte without first remap it | ||
83 | */ | ||
84 | pte_clear(&init_mm, vaddr, kmap_pte-idx); | ||
85 | local_flush_tlb_one(vaddr); | ||
86 | #endif | ||
87 | 83 | ||
84 | /* | ||
85 | * force other mappings to Oops if they'll try to access | ||
86 | * this pte without first remap it | ||
87 | */ | ||
88 | pte_clear(&init_mm, vaddr, kmap_pte-idx); | ||
89 | local_flush_tlb_one(vaddr); | ||
90 | } | ||
91 | #endif | ||
92 | kmap_atomic_idx_pop(); | ||
88 | pagefault_enable(); | 93 | pagefault_enable(); |
89 | } | 94 | } |
90 | EXPORT_SYMBOL(__kunmap_atomic_notypecheck); | 95 | EXPORT_SYMBOL(__kunmap_atomic); |
91 | 96 | ||
92 | /* | 97 | /* |
93 | * This is the same as kmap_atomic() but can map memory that doesn't | 98 | * This is the same as kmap_atomic() but can map memory that doesn't |
94 | * have a struct page associated with it. | 99 | * have a struct page associated with it. |
95 | */ | 100 | */ |
96 | void *kmap_atomic_pfn(unsigned long pfn, enum km_type type) | 101 | void *kmap_atomic_pfn(unsigned long pfn) |
97 | { | 102 | { |
98 | enum fixed_addresses idx; | ||
99 | unsigned long vaddr; | 103 | unsigned long vaddr; |
104 | int idx, type; | ||
100 | 105 | ||
101 | pagefault_disable(); | 106 | pagefault_disable(); |
102 | 107 | ||
103 | debug_kmap_atomic(type); | 108 | type = kmap_atomic_idx_push(); |
104 | idx = type + KM_TYPE_NR*smp_processor_id(); | 109 | idx = type + KM_TYPE_NR*smp_processor_id(); |
105 | vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); | 110 | vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); |
106 | set_pte(kmap_pte-idx, pfn_pte(pfn, PAGE_KERNEL)); | 111 | set_pte(kmap_pte-idx, pfn_pte(pfn, PAGE_KERNEL)); |
@@ -109,7 +114,7 @@ void *kmap_atomic_pfn(unsigned long pfn, enum km_type type) | |||
109 | return (void*) vaddr; | 114 | return (void*) vaddr; |
110 | } | 115 | } |
111 | 116 | ||
112 | struct page *__kmap_atomic_to_page(void *ptr) | 117 | struct page *kmap_atomic_to_page(void *ptr) |
113 | { | 118 | { |
114 | unsigned long idx, vaddr = (unsigned long)ptr; | 119 | unsigned long idx, vaddr = (unsigned long)ptr; |
115 | pte_t *pte; | 120 | pte_t *pte; |