pgalloc.h (13224794cb0832caa403ad583d8605202cabc6bc) pgalloc.h (6fb12766f7fcd7934b09fbfbd32a725cc2febf96)
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ASM_SH_PGALLOC_H
3#define __ASM_SH_PGALLOC_H
4
5#include <asm/page.h>
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ASM_SH_PGALLOC_H
3#define __ASM_SH_PGALLOC_H
4
5#include <asm/page.h>
6#include <asm-generic/pgalloc.h>
6
7extern pgd_t *pgd_alloc(struct mm_struct *);
8extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);
9
10#if PAGETABLE_LEVELS > 2
11extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd);
12extern pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address);
13extern void pmd_free(struct mm_struct *mm, pmd_t *pmd);

--- 7 unchanged lines hidden (view full) ---

21
22static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
23 pgtable_t pte)
24{
25 set_pmd(pmd, __pmd((unsigned long)page_address(pte)));
26}
27#define pmd_pgtable(pmd) pmd_page(pmd)
28
7
8extern pgd_t *pgd_alloc(struct mm_struct *);
9extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);
10
11#if PAGETABLE_LEVELS > 2
12extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd);
13extern pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address);
14extern void pmd_free(struct mm_struct *mm, pmd_t *pmd);

--- 7 unchanged lines hidden (view full) ---

22
23static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
24 pgtable_t pte)
25{
26 set_pmd(pmd, __pmd((unsigned long)page_address(pte)));
27}
28#define pmd_pgtable(pmd) pmd_page(pmd)
29
29/*
30 * Allocate and free page tables.
31 */
32static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
33{
34 return (pte_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO);
35}
36
37static inline pgtable_t pte_alloc_one(struct mm_struct *mm)
38{
39 struct page *page;
40
41 page = alloc_page(GFP_KERNEL | __GFP_ZERO);
42 if (!page)
43 return NULL;
44 if (!pgtable_page_ctor(page)) {
45 __free_page(page);
46 return NULL;
47 }
48 return page;
49}
50
51static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
52{
53 free_page((unsigned long)pte);
54}
55
56static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
57{
58 pgtable_page_dtor(pte);
59 __free_page(pte);
60}
61
62#define __pte_free_tlb(tlb,pte,addr) \
63do { \
64 pgtable_page_dtor(pte); \
65 tlb_remove_page((tlb), (pte)); \
66} while (0)
67
68#if CONFIG_PGTABLE_LEVELS > 2
69#define __pmd_free_tlb(tlb, pmdp, addr) \
70do { \
71 struct page *page = virt_to_page(pmdp); \
72 pgtable_pmd_page_dtor(page); \
73 tlb_remove_page((tlb), page); \
74} while (0);
75#endif
76
77#endif /* __ASM_SH_PGALLOC_H */
30#define __pte_free_tlb(tlb,pte,addr) \
31do { \
32 pgtable_page_dtor(pte); \
33 tlb_remove_page((tlb), (pte)); \
34} while (0)
35
36#if CONFIG_PGTABLE_LEVELS > 2
37#define __pmd_free_tlb(tlb, pmdp, addr) \
38do { \
39 struct page *page = virt_to_page(pmdp); \
40 pgtable_pmd_page_dtor(page); \
41 tlb_remove_page((tlb), page); \
42} while (0);
43#endif
44
45#endif /* __ASM_SH_PGALLOC_H */