diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/asm-powerpc/pgalloc-64.h | 3 | ||||
| -rw-r--r-- | include/asm-powerpc/tlb.h | 9 |
2 files changed, 11 insertions, 1 deletions
diff --git a/include/asm-powerpc/pgalloc-64.h b/include/asm-powerpc/pgalloc-64.h index d9a3a8ca58a1..94d0294341d6 100644 --- a/include/asm-powerpc/pgalloc-64.h +++ b/include/asm-powerpc/pgalloc-64.h | |||
| @@ -90,7 +90,8 @@ static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, | |||
| 90 | static inline struct page *pte_alloc_one(struct mm_struct *mm, | 90 | static inline struct page *pte_alloc_one(struct mm_struct *mm, |
| 91 | unsigned long address) | 91 | unsigned long address) |
| 92 | { | 92 | { |
| 93 | return virt_to_page(pte_alloc_one_kernel(mm, address)); | 93 | pte_t *pte = pte_alloc_one_kernel(mm, address); |
| 94 | return pte ? virt_to_page(pte) : NULL; | ||
| 94 | } | 95 | } |
| 95 | 96 | ||
| 96 | static inline void pte_free_kernel(pte_t *pte) | 97 | static inline void pte_free_kernel(pte_t *pte) |
diff --git a/include/asm-powerpc/tlb.h b/include/asm-powerpc/tlb.h index 0a17682663d8..66714042e438 100644 --- a/include/asm-powerpc/tlb.h +++ b/include/asm-powerpc/tlb.h | |||
| @@ -38,6 +38,15 @@ extern void pte_free_finish(void); | |||
| 38 | 38 | ||
| 39 | static inline void tlb_flush(struct mmu_gather *tlb) | 39 | static inline void tlb_flush(struct mmu_gather *tlb) |
| 40 | { | 40 | { |
| 41 | struct ppc64_tlb_batch *tlbbatch = &__get_cpu_var(ppc64_tlb_batch); | ||
| 42 | |||
| 43 | /* If there's a TLB batch pending, then we must flush it because the | ||
| 44 | * pages are going to be freed and we really don't want to have a CPU | ||
| 45 | * access a freed page because it has a stale TLB | ||
| 46 | */ | ||
| 47 | if (tlbbatch->index) | ||
| 48 | __flush_tlb_pending(tlbbatch); | ||
| 49 | |||
| 41 | pte_free_finish(); | 50 | pte_free_finish(); |
| 42 | } | 51 | } |
| 43 | 52 | ||
