pgalloc.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #ifndef _ASM_POWERPC_PGALLOC_H
  2. #define _ASM_POWERPC_PGALLOC_H
  3. #ifdef __KERNEL__
  4. #include <linux/mm.h>
  5. #ifdef CONFIG_PPC_BOOK3E
  6. extern void tlb_flush_pgtable(struct mmu_gather *tlb, unsigned long address);
  7. #else /* CONFIG_PPC_BOOK3E */
  8. static inline void tlb_flush_pgtable(struct mmu_gather *tlb,
  9. unsigned long address)
  10. {
  11. }
  12. #endif /* !CONFIG_PPC_BOOK3E */
  13. static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
  14. {
  15. free_page((unsigned long)pte);
  16. }
  17. static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage)
  18. {
  19. pgtable_page_dtor(ptepage);
  20. __free_page(ptepage);
  21. }
  22. typedef struct pgtable_free {
  23. unsigned long val;
  24. } pgtable_free_t;
  25. #define PGF_CACHENUM_MASK 0x7
  26. static inline pgtable_free_t pgtable_free_cache(void *p, int cachenum,
  27. unsigned long mask)
  28. {
  29. BUG_ON(cachenum > PGF_CACHENUM_MASK);
  30. return (pgtable_free_t){.val = ((unsigned long) p & ~mask) | cachenum};
  31. }
  32. #ifdef CONFIG_PPC64
  33. #include <asm/pgalloc-64.h>
  34. #else
  35. #include <asm/pgalloc-32.h>
  36. #endif
  37. #ifdef CONFIG_SMP
  38. extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf);
  39. extern void pte_free_finish(void);
  40. #else /* CONFIG_SMP */
  41. static inline void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf)
  42. {
  43. pgtable_free(pgf);
  44. }
  45. static inline void pte_free_finish(void) { }
  46. #endif /* !CONFIG_SMP */
  47. static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *ptepage,
  48. unsigned long address)
  49. {
  50. pgtable_free_t pgf = pgtable_free_cache(page_address(ptepage),
  51. PTE_NONCACHE_NUM,
  52. PTE_TABLE_SIZE-1);
  53. tlb_flush_pgtable(tlb, address);
  54. pgtable_page_dtor(ptepage);
  55. pgtable_free_tlb(tlb, pgf);
  56. }
  57. #endif /* __KERNEL__ */
  58. #endif /* _ASM_POWERPC_PGALLOC_H */