root/arch/sparc/include/asm/pgalloc_64.h

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

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. __pgd_populate
  2. pgd_alloc
  3. pgd_free
  4. __pud_populate
  5. pud_alloc_one
  6. pud_free
  7. pmd_alloc_one
  8. pmd_free
  9. pgtable_free_tlb
  10. __tlb_remove_table
  11. pgtable_free_tlb
  12. __pte_free_tlb

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef _SPARC64_PGALLOC_H
   3 #define _SPARC64_PGALLOC_H
   4 
   5 #include <linux/kernel.h>
   6 #include <linux/sched.h>
   7 #include <linux/mm.h>
   8 #include <linux/slab.h>
   9 
  10 #include <asm/spitfire.h>
  11 #include <asm/cpudata.h>
  12 #include <asm/cacheflush.h>
  13 #include <asm/page.h>
  14 
  15 /* Page table allocation/freeing. */
  16 
  17 extern struct kmem_cache *pgtable_cache;
  18 
  19 static inline void __pgd_populate(pgd_t *pgd, pud_t *pud)
  20 {
  21         pgd_set(pgd, pud);
  22 }
  23 
  24 #define pgd_populate(MM, PGD, PUD)      __pgd_populate(PGD, PUD)
  25 
  26 static inline pgd_t *pgd_alloc(struct mm_struct *mm)
  27 {
  28         return kmem_cache_alloc(pgtable_cache, GFP_KERNEL);
  29 }
  30 
  31 static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
  32 {
  33         kmem_cache_free(pgtable_cache, pgd);
  34 }
  35 
  36 static inline void __pud_populate(pud_t *pud, pmd_t *pmd)
  37 {
  38         pud_set(pud, pmd);
  39 }
  40 
  41 #define pud_populate(MM, PUD, PMD)      __pud_populate(PUD, PMD)
  42 
  43 static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
  44 {
  45         return kmem_cache_alloc(pgtable_cache, GFP_KERNEL);
  46 }
  47 
  48 static inline void pud_free(struct mm_struct *mm, pud_t *pud)
  49 {
  50         kmem_cache_free(pgtable_cache, pud);
  51 }
  52 
  53 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
  54 {
  55         return kmem_cache_alloc(pgtable_cache, GFP_KERNEL);
  56 }
  57 
  58 static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
  59 {
  60         kmem_cache_free(pgtable_cache, pmd);
  61 }
  62 
  63 pte_t *pte_alloc_one_kernel(struct mm_struct *mm);
  64 pgtable_t pte_alloc_one(struct mm_struct *mm);
  65 void pte_free_kernel(struct mm_struct *mm, pte_t *pte);
  66 void pte_free(struct mm_struct *mm, pgtable_t ptepage);
  67 
  68 #define pmd_populate_kernel(MM, PMD, PTE)       pmd_set(MM, PMD, PTE)
  69 #define pmd_populate(MM, PMD, PTE)              pmd_set(MM, PMD, PTE)
  70 #define pmd_pgtable(PMD)                        ((pte_t *)__pmd_page(PMD))
  71 
  72 void pgtable_free(void *table, bool is_page);
  73 
  74 #ifdef CONFIG_SMP
  75 
  76 struct mmu_gather;
  77 void tlb_remove_table(struct mmu_gather *, void *);
  78 
  79 static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, bool is_page)
  80 {
  81         unsigned long pgf = (unsigned long)table;
  82         if (is_page)
  83                 pgf |= 0x1UL;
  84         tlb_remove_table(tlb, (void *)pgf);
  85 }
  86 
  87 static inline void __tlb_remove_table(void *_table)
  88 {
  89         void *table = (void *)((unsigned long)_table & ~0x1UL);
  90         bool is_page = false;
  91 
  92         if ((unsigned long)_table & 0x1UL)
  93                 is_page = true;
  94         pgtable_free(table, is_page);
  95 }
  96 #else /* CONFIG_SMP */
  97 static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, bool is_page)
  98 {
  99         pgtable_free(table, is_page);
 100 }
 101 #endif /* !CONFIG_SMP */
 102 
 103 static inline void __pte_free_tlb(struct mmu_gather *tlb, pte_t *pte,
 104                                   unsigned long address)
 105 {
 106         pgtable_free_tlb(tlb, pte, true);
 107 }
 108 
 109 #define __pmd_free_tlb(tlb, pmd, addr)                \
 110         pgtable_free_tlb(tlb, pmd, false)
 111 
 112 #define __pud_free_tlb(tlb, pud, addr)                \
 113         pgtable_free_tlb(tlb, pud, false)
 114 
 115 #endif /* _SPARC64_PGALLOC_H */

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