diff options
Diffstat (limited to 'arch/csky/include/asm/pgalloc.h')
| -rw-r--r-- | arch/csky/include/asm/pgalloc.h | 43 |
1 files changed, 18 insertions, 25 deletions
diff --git a/arch/csky/include/asm/pgalloc.h b/arch/csky/include/asm/pgalloc.h index bf4f4a0e140e..d213bb47b717 100644 --- a/arch/csky/include/asm/pgalloc.h +++ b/arch/csky/include/asm/pgalloc.h | |||
| @@ -24,41 +24,34 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, | |||
| 24 | 24 | ||
| 25 | extern void pgd_init(unsigned long *p); | 25 | extern void pgd_init(unsigned long *p); |
| 26 | 26 | ||
| 27 | static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, | 27 | static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm) |
| 28 | unsigned long address) | ||
| 29 | { | 28 | { |
| 30 | pte_t *pte; | 29 | pte_t *pte; |
| 31 | unsigned long *kaddr, i; | 30 | unsigned long i; |
| 32 | 31 | ||
| 33 | pte = (pte_t *) __get_free_pages(GFP_KERNEL | __GFP_RETRY_MAYFAIL, | 32 | pte = (pte_t *) __get_free_page(GFP_KERNEL); |
| 34 | PTE_ORDER); | 33 | if (!pte) |
| 35 | kaddr = (unsigned long *)pte; | 34 | return NULL; |
| 36 | if (address & 0x80000000) | 35 | |
| 37 | for (i = 0; i < (PAGE_SIZE/4); i++) | 36 | for (i = 0; i < PAGE_SIZE/sizeof(pte_t); i++) |
| 38 | *(kaddr + i) = 0x1; | 37 | (pte + i)->pte_low = _PAGE_GLOBAL; |
| 39 | else | ||
| 40 | clear_page(kaddr); | ||
| 41 | 38 | ||
| 42 | return pte; | 39 | return pte; |
| 43 | } | 40 | } |
| 44 | 41 | ||
| 45 | static inline struct page *pte_alloc_one(struct mm_struct *mm, | 42 | static inline struct page *pte_alloc_one(struct mm_struct *mm) |
| 46 | unsigned long address) | ||
| 47 | { | 43 | { |
| 48 | struct page *pte; | 44 | struct page *pte; |
| 49 | unsigned long *kaddr, i; | 45 | |
| 50 | 46 | pte = alloc_pages(GFP_KERNEL | __GFP_ZERO, 0); | |
| 51 | pte = alloc_pages(GFP_KERNEL | __GFP_RETRY_MAYFAIL, PTE_ORDER); | 47 | if (!pte) |
| 52 | if (pte) { | 48 | return NULL; |
| 53 | kaddr = kmap_atomic(pte); | 49 | |
| 54 | if (address & 0x80000000) { | 50 | if (!pgtable_page_ctor(pte)) { |
| 55 | for (i = 0; i < (PAGE_SIZE/4); i++) | 51 | __free_page(pte); |
| 56 | *(kaddr + i) = 0x1; | 52 | return NULL; |
| 57 | } else | ||
| 58 | clear_page(kaddr); | ||
| 59 | kunmap_atomic(kaddr); | ||
| 60 | pgtable_page_ctor(pte); | ||
| 61 | } | 53 | } |
| 54 | |||
| 62 | return pte; | 55 | return pte; |
| 63 | } | 56 | } |
| 64 | 57 | ||
