pgalloc.h 1.8 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
#ifndef __ASM_SH_PGALLOC_H
#define __ASM_SH_PGALLOC_H

P
Paul Mundt 已提交
4 5 6
#include <linux/quicklist.h>
#include <asm/page.h>

7
#define QUICK_PT 0	/* Other page table pages that are zero on free */
P
Paul Mundt 已提交
8

9 10 11
extern pgd_t *pgd_alloc(struct mm_struct *);
extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);

12
#if PAGETABLE_LEVELS > 2
13 14 15
extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd);
extern pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address);
extern void pmd_free(struct mm_struct *mm, pmd_t *pmd);
16
#endif
17

S
Stuart Menefy 已提交
18 19 20 21 22
static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
				       pte_t *pte)
{
	set_pmd(pmd, __pmd((unsigned long)pte));
}
L
Linus Torvalds 已提交
23 24

static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
25
				pgtable_t pte)
L
Linus Torvalds 已提交
26
{
S
Stuart Menefy 已提交
27
	set_pmd(pmd, __pmd((unsigned long)page_address(pte)));
L
Linus Torvalds 已提交
28
}
29
#define pmd_pgtable(pmd) pmd_page(pmd)
L
Linus Torvalds 已提交
30 31 32 33 34 35 36

/*
 * Allocate and free page tables.
 */
static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
					  unsigned long address)
{
37
	return quicklist_alloc(QUICK_PT, GFP_KERNEL, NULL);
L
Linus Torvalds 已提交
38 39
}

40 41
static inline pgtable_t pte_alloc_one(struct mm_struct *mm,
					unsigned long address)
L
Linus Torvalds 已提交
42
{
43 44 45
	struct page *page;
	void *pg;

46
	pg = quicklist_alloc(QUICK_PT, GFP_KERNEL, NULL);
47 48 49
	if (!pg)
		return NULL;
	page = virt_to_page(pg);
50 51 52 53
	if (!pgtable_page_ctor(page)) {
		quicklist_free(QUICK_PT, NULL, pg);
		return NULL;
	}
54
	return page;
L
Linus Torvalds 已提交
55 56
}

57
static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
L
Linus Torvalds 已提交
58
{
P
Paul Mundt 已提交
59
	quicklist_free(QUICK_PT, NULL, pte);
L
Linus Torvalds 已提交
60 61
}

62
static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
L
Linus Torvalds 已提交
63
{
64
	pgtable_page_dtor(pte);
P
Paul Mundt 已提交
65
	quicklist_free_page(QUICK_PT, NULL, pte);
L
Linus Torvalds 已提交
66 67
}

68
#define __pte_free_tlb(tlb,pte,addr)			\
69 70 71 72
do {							\
	pgtable_page_dtor(pte);				\
	tlb_remove_page((tlb), (pte));			\
} while (0)
L
Linus Torvalds 已提交
73

P
Paul Mundt 已提交
74 75 76 77
static inline void check_pgt_cache(void)
{
	quicklist_trim(QUICK_PT, NULL, 25, 16);
}
L
Linus Torvalds 已提交
78 79

#endif /* __ASM_SH_PGALLOC_H */