root/arch/xtensa/include/asm/pgalloc.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. pgd_alloc
  2. pgd_free
  3. pte_alloc_one_kernel
  4. pte_alloc_one
  5. pte_free_kernel
  6. pte_free

   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * include/asm-xtensa/pgalloc.h
   4  *
   5  * Copyright (C) 2001-2007 Tensilica Inc.
   6  */
   7 
   8 #ifndef _XTENSA_PGALLOC_H
   9 #define _XTENSA_PGALLOC_H
  10 
  11 #include <linux/highmem.h>
  12 #include <linux/slab.h>
  13 
  14 /*
  15  * Allocating and freeing a pmd is trivial: the 1-entry pmd is
  16  * inside the pgd, so has no extra memory associated with it.
  17  */
  18 
  19 #define pmd_populate_kernel(mm, pmdp, ptep)                                  \
  20         (pmd_val(*(pmdp)) = ((unsigned long)ptep))
  21 #define pmd_populate(mm, pmdp, page)                                         \
  22         (pmd_val(*(pmdp)) = ((unsigned long)page_to_virt(page)))
  23 #define pmd_pgtable(pmd) pmd_page(pmd)
  24 
  25 static inline pgd_t*
  26 pgd_alloc(struct mm_struct *mm)
  27 {
  28         return (pgd_t*) __get_free_pages(GFP_KERNEL | __GFP_ZERO, PGD_ORDER);
  29 }
  30 
  31 static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
  32 {
  33         free_page((unsigned long)pgd);
  34 }
  35 
  36 static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
  37 {
  38         pte_t *ptep;
  39         int i;
  40 
  41         ptep = (pte_t *)__get_free_page(GFP_KERNEL);
  42         if (!ptep)
  43                 return NULL;
  44         for (i = 0; i < 1024; i++)
  45                 pte_clear(NULL, 0, ptep + i);
  46         return ptep;
  47 }
  48 
  49 static inline pgtable_t pte_alloc_one(struct mm_struct *mm)
  50 {
  51         pte_t *pte;
  52         struct page *page;
  53 
  54         pte = pte_alloc_one_kernel(mm);
  55         if (!pte)
  56                 return NULL;
  57         page = virt_to_page(pte);
  58         if (!pgtable_pte_page_ctor(page)) {
  59                 __free_page(page);
  60                 return NULL;
  61         }
  62         return page;
  63 }
  64 
  65 static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
  66 {
  67         free_page((unsigned long)pte);
  68 }
  69 
  70 static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
  71 {
  72         pgtable_pte_page_dtor(pte);
  73         __free_page(pte);
  74 }
  75 #define pmd_pgtable(pmd) pmd_page(pmd)
  76 
  77 #endif /* _XTENSA_PGALLOC_H */

/* [<][>][^][v][top][bottom][index][help] */