linux/arch/sh/include/asm/pgalloc.h
<<
>>
Prefs
   1#ifndef __ASM_SH_PGALLOC_H
   2#define __ASM_SH_PGALLOC_H
   3
   4#include <linux/quicklist.h>
   5#include <asm/page.h>
   6
   7#define QUICK_PT 0      /* Other page table pages that are zero on free */
   8
   9extern pgd_t *pgd_alloc(struct mm_struct *);
  10extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);
  11
  12#if PAGETABLE_LEVELS > 2
  13extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd);
  14extern pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address);
  15extern void pmd_free(struct mm_struct *mm, pmd_t *pmd);
  16#endif
  17
  18static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
  19                                       pte_t *pte)
  20{
  21        set_pmd(pmd, __pmd((unsigned long)pte));
  22}
  23
  24static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
  25                                pgtable_t pte)
  26{
  27        set_pmd(pmd, __pmd((unsigned long)page_address(pte)));
  28}
  29#define pmd_pgtable(pmd) pmd_page(pmd)
  30
  31/*
  32 * Allocate and free page tables.
  33 */
  34static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
  35                                          unsigned long address)
  36{
  37        return quicklist_alloc(QUICK_PT, GFP_KERNEL | __GFP_REPEAT, NULL);
  38}
  39
  40static inline pgtable_t pte_alloc_one(struct mm_struct *mm,
  41                                        unsigned long address)
  42{
  43        struct page *page;
  44        void *pg;
  45
  46        pg = quicklist_alloc(QUICK_PT, GFP_KERNEL | __GFP_REPEAT, NULL);
  47        if (!pg)
  48                return NULL;
  49        page = virt_to_page(pg);
  50        pgtable_page_ctor(page);
  51        return page;
  52}
  53
  54static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
  55{
  56        quicklist_free(QUICK_PT, NULL, pte);
  57}
  58
  59static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
  60{
  61        pgtable_page_dtor(pte);
  62        quicklist_free_page(QUICK_PT, NULL, pte);
  63}
  64
  65#define __pte_free_tlb(tlb,pte,addr)                    \
  66do {                                                    \
  67        pgtable_page_dtor(pte);                         \
  68        tlb_remove_page((tlb), (pte));                  \
  69} while (0)
  70
  71static inline void check_pgt_cache(void)
  72{
  73        quicklist_trim(QUICK_PT, NULL, 25, 16);
  74}
  75
  76#endif /* __ASM_SH_PGALLOC_H */
  77