Merge branch 'akpm' (patches from Andrew)
[linux-2.6-block.git] / arch / sh / include / asm / pgalloc.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
1da177e4
LT
2#ifndef __ASM_SH_PGALLOC_H
3#define __ASM_SH_PGALLOC_H
4
5f8c9908
PM
5#include <linux/quicklist.h>
6#include <asm/page.h>
7
0176bd3d 8#define QUICK_PT 0 /* Other page table pages that are zero on free */
5f8c9908 9
2a5eacca
MF
10extern pgd_t *pgd_alloc(struct mm_struct *);
11extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);
12
782bb5a5 13#if PAGETABLE_LEVELS > 2
2a5eacca
MF
14extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd);
15extern pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address);
16extern void pmd_free(struct mm_struct *mm, pmd_t *pmd);
5d9b4b19 17#endif
b73c8063 18
99a596f9
SM
19static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
20 pte_t *pte)
21{
22 set_pmd(pmd, __pmd((unsigned long)pte));
23}
1da177e4
LT
24
25static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
2f569afd 26 pgtable_t pte)
1da177e4 27{
99a596f9 28 set_pmd(pmd, __pmd((unsigned long)page_address(pte)));
1da177e4 29}
2f569afd 30#define pmd_pgtable(pmd) pmd_page(pmd)
1da177e4
LT
31
32/*
33 * Allocate and free page tables.
34 */
4cf58924 35static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
1da177e4 36{
32d6bd90 37 return quicklist_alloc(QUICK_PT, GFP_KERNEL, NULL);
1da177e4
LT
38}
39
4cf58924 40static inline pgtable_t pte_alloc_one(struct mm_struct *mm)
1da177e4 41{
2f569afd
MS
42 struct page *page;
43 void *pg;
44
32d6bd90 45 pg = quicklist_alloc(QUICK_PT, GFP_KERNEL, NULL);
2f569afd
MS
46 if (!pg)
47 return NULL;
48 page = virt_to_page(pg);
478cf8ca
KS
49 if (!pgtable_page_ctor(page)) {
50 quicklist_free(QUICK_PT, NULL, pg);
51 return NULL;
52 }
2f569afd 53 return page;
1da177e4
LT
54}
55
5e541973 56static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
1da177e4 57{
5f8c9908 58 quicklist_free(QUICK_PT, NULL, pte);
1da177e4
LT
59}
60
2f569afd 61static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
1da177e4 62{
2f569afd 63 pgtable_page_dtor(pte);
5f8c9908 64 quicklist_free_page(QUICK_PT, NULL, pte);
1da177e4
LT
65}
66
9e1b32ca 67#define __pte_free_tlb(tlb,pte,addr) \
2f569afd
MS
68do { \
69 pgtable_page_dtor(pte); \
70 tlb_remove_page((tlb), (pte)); \
71} while (0)
1da177e4 72
5f8c9908
PM
73static inline void check_pgt_cache(void)
74{
5f8c9908
PM
75 quicklist_trim(QUICK_PT, NULL, 25, 16);
76}
1da177e4 77
1da177e4 78#endif /* __ASM_SH_PGALLOC_H */