linux/arch/mips/include/asm/pgalloc.h
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * Copyright (C) 1994 - 2001, 2003 by Ralf Baechle
   7 * Copyright (C) 1999, 2000, 2001 Silicon Graphics, Inc.
   8 */
   9#ifndef _ASM_PGALLOC_H
  10#define _ASM_PGALLOC_H
  11
  12#include <linux/highmem.h>
  13#include <linux/mm.h>
  14#include <linux/sched.h>
  15
  16#define __HAVE_ARCH_PMD_ALLOC_ONE
  17#define __HAVE_ARCH_PUD_ALLOC_ONE
  18#include <asm-generic/pgalloc.h>
  19
  20static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
  21        pte_t *pte)
  22{
  23        set_pmd(pmd, __pmd((unsigned long)pte));
  24}
  25
  26static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
  27        pgtable_t pte)
  28{
  29        set_pmd(pmd, __pmd((unsigned long)page_address(pte)));
  30}
  31
  32/*
  33 * Initialize a new pmd table with invalid pointers.
  34 */
  35extern void pmd_init(unsigned long page, unsigned long pagetable);
  36
  37#ifndef __PAGETABLE_PMD_FOLDED
  38
  39static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
  40{
  41        set_pud(pud, __pud((unsigned long)pmd));
  42}
  43#endif
  44
  45/*
  46 * Initialize a new pgd / pmd table with invalid pointers.
  47 */
  48extern void pgd_init(unsigned long page);
  49extern pgd_t *pgd_alloc(struct mm_struct *mm);
  50
  51#define __pte_free_tlb(tlb,pte,address)                 \
  52do {                                                    \
  53        pgtable_pte_page_dtor(pte);                     \
  54        tlb_remove_page((tlb), pte);                    \
  55} while (0)
  56
  57#ifndef __PAGETABLE_PMD_FOLDED
  58
  59static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
  60{
  61        pmd_t *pmd;
  62        struct page *pg;
  63
  64        pg = alloc_pages(GFP_KERNEL_ACCOUNT, PMD_ORDER);
  65        if (!pg)
  66                return NULL;
  67
  68        if (!pgtable_pmd_page_ctor(pg)) {
  69                __free_pages(pg, PMD_ORDER);
  70                return NULL;
  71        }
  72
  73        pmd = (pmd_t *)page_address(pg);
  74        pmd_init((unsigned long)pmd, (unsigned long)invalid_pte_table);
  75        return pmd;
  76}
  77
  78#define __pmd_free_tlb(tlb, x, addr)    pmd_free((tlb)->mm, x)
  79
  80#endif
  81
  82#ifndef __PAGETABLE_PUD_FOLDED
  83
  84static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address)
  85{
  86        pud_t *pud;
  87
  88        pud = (pud_t *) __get_free_pages(GFP_KERNEL, PUD_ORDER);
  89        if (pud)
  90                pud_init((unsigned long)pud, (unsigned long)invalid_pmd_table);
  91        return pud;
  92}
  93
  94static inline void p4d_populate(struct mm_struct *mm, p4d_t *p4d, pud_t *pud)
  95{
  96        set_p4d(p4d, __p4d((unsigned long)pud));
  97}
  98
  99#define __pud_free_tlb(tlb, x, addr)    pud_free((tlb)->mm, x)
 100
 101#endif /* __PAGETABLE_PUD_FOLDED */
 102
 103extern void pagetable_init(void);
 104
 105#endif /* _ASM_PGALLOC_H */
 106