linux/arch/powerpc/include/asm/pgalloc.h
<<
>>
Prefs
   1#ifndef _ASM_POWERPC_PGALLOC_H
   2#define _ASM_POWERPC_PGALLOC_H
   3#ifdef __KERNEL__
   4
   5#include <linux/mm.h>
   6
   7#ifdef CONFIG_PPC_BOOK3E
   8extern void tlb_flush_pgtable(struct mmu_gather *tlb, unsigned long address);
   9#else /* CONFIG_PPC_BOOK3E */
  10static inline void tlb_flush_pgtable(struct mmu_gather *tlb,
  11                                     unsigned long address)
  12{
  13}
  14#endif /* !CONFIG_PPC_BOOK3E */
  15
  16static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
  17{
  18        free_page((unsigned long)pte);
  19}
  20
  21static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage)
  22{
  23        pgtable_page_dtor(ptepage);
  24        __free_page(ptepage);
  25}
  26
  27typedef struct pgtable_free {
  28        unsigned long val;
  29} pgtable_free_t;
  30
  31/* This needs to be big enough to allow for MMU_PAGE_COUNT + 2 to be stored
  32 * and small enough to fit in the low bits of any naturally aligned page
  33 * table cache entry. Arbitrarily set to 0x1f, that should give us some
  34 * room to grow
  35 */
  36#define PGF_CACHENUM_MASK       0x1f
  37
  38static inline pgtable_free_t pgtable_free_cache(void *p, int cachenum,
  39                                                unsigned long mask)
  40{
  41        BUG_ON(cachenum > PGF_CACHENUM_MASK);
  42
  43        return (pgtable_free_t){.val = ((unsigned long) p & ~mask) | cachenum};
  44}
  45
  46#ifdef CONFIG_PPC64
  47#include <asm/pgalloc-64.h>
  48#else
  49#include <asm/pgalloc-32.h>
  50#endif
  51
  52#ifdef CONFIG_SMP
  53extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf);
  54extern void pte_free_finish(void);
  55#else /* CONFIG_SMP */
  56static inline void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf)
  57{
  58        pgtable_free(pgf);
  59}
  60static inline void pte_free_finish(void) { }
  61#endif /* !CONFIG_SMP */
  62
  63static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *ptepage,
  64                                  unsigned long address)
  65{
  66        pgtable_free_t pgf = pgtable_free_cache(page_address(ptepage),
  67                                                PTE_NONCACHE_NUM,
  68                                                PTE_TABLE_SIZE-1);
  69        tlb_flush_pgtable(tlb, address);
  70        pgtable_page_dtor(ptepage);
  71        pgtable_free_tlb(tlb, pgf);
  72}
  73
  74#endif /* __KERNEL__ */
  75#endif /* _ASM_POWERPC_PGALLOC_H */
  76