pgalloc.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _PPC64_PGALLOC_H
  2. #define _PPC64_PGALLOC_H
  3. #include <linux/threads.h>
  4. #include <asm/processor.h>
  5. #include <asm/naca.h>
  6. #include <asm/paca.h>
  7. /*
  8.  * This program is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU General Public License
  10.  * as published by the Free Software Foundation; either version
  11.  * 2 of the License, or (at your option) any later version.
  12.  */
  13. #define quicklists      get_paca()
  14. #define pgd_quicklist  (quicklists->pgd_cache)
  15. #define pmd_quicklist  (quicklists->pmd_cache)
  16. #define pte_quicklist  (quicklists->pte_cache)
  17. #define pgtable_cache_size  (quicklists->pgtable_cache_sz)
  18. static inline pgd_t*
  19. pgd_alloc_one_fast (struct mm_struct *mm)
  20. {
  21. unsigned long *ret = pgd_quicklist;
  22. if (ret != NULL) {
  23. pgd_quicklist = (unsigned long *)(*ret);
  24. ret[0] = 0;
  25. --pgtable_cache_size;
  26. } else
  27. ret = NULL;
  28. return (pgd_t *) ret;
  29. }
  30. static inline pgd_t*
  31. pgd_alloc (struct mm_struct *mm)
  32. {
  33. /* the VM system never calls pgd_alloc_one_fast(), so we do it here. */
  34. pgd_t *pgd = pgd_alloc_one_fast(mm);
  35. if (pgd == NULL) {
  36. pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
  37. if (pgd != NULL)
  38. clear_page(pgd);
  39. }
  40. return pgd;
  41. }
  42. static inline void
  43. pgd_free (pgd_t *pgd)
  44. {
  45. *(unsigned long *)pgd = (unsigned long) pgd_quicklist;
  46. pgd_quicklist = (unsigned long *) pgd;
  47. ++pgtable_cache_size;
  48. }
  49. #define pgd_populate(MM, PGD, PMD) pgd_set(PGD, PMD)
  50. static inline pmd_t*
  51. pmd_alloc_one_fast (struct mm_struct *mm, unsigned long addr)
  52. {
  53. unsigned long *ret = (unsigned long *)pmd_quicklist;
  54. if (ret != NULL) {
  55. pmd_quicklist = (unsigned long *)(*ret);
  56. ret[0] = 0;
  57. --pgtable_cache_size;
  58. }
  59. return (pmd_t *)ret;
  60. }
  61. static inline pmd_t*
  62. pmd_alloc_one (struct mm_struct *mm, unsigned long addr)
  63. {
  64. pmd_t *pmd = (pmd_t *) __get_free_page(GFP_KERNEL);
  65. if (pmd != NULL)
  66. clear_page(pmd);
  67. return pmd;
  68. }
  69. static inline void
  70. pmd_free (pmd_t *pmd)
  71. {
  72. *(unsigned long *)pmd = (unsigned long) pmd_quicklist;
  73. pmd_quicklist = (unsigned long *) pmd;
  74. ++pgtable_cache_size;
  75. }
  76. #define pmd_populate(MM, PMD, PTE) pmd_set(PMD, PTE)
  77. static inline pte_t*
  78. pte_alloc_one_fast (struct mm_struct *mm, unsigned long addr)
  79. {
  80. unsigned long *ret = (unsigned long *)pte_quicklist;
  81. if (ret != NULL) {
  82. pte_quicklist = (unsigned long *)(*ret);
  83. ret[0] = 0;
  84. --pgtable_cache_size;
  85. }
  86. return (pte_t *)ret;
  87. }
  88. static inline pte_t*
  89. pte_alloc_one (struct mm_struct *mm, unsigned long addr)
  90. {
  91. pte_t *pte = (pte_t *) __get_free_page(GFP_KERNEL);
  92. if (pte != NULL)
  93. clear_page(pte);
  94. return pte;
  95. }
  96. static inline void
  97. pte_free (pte_t *pte)
  98. {
  99. *(unsigned long *)pte = (unsigned long) pte_quicklist;
  100. pte_quicklist = (unsigned long *) pte;
  101. ++pgtable_cache_size;
  102. }
  103. extern int do_check_pgt_cache(int, int);
  104. #endif /* _PPC64_PGALLOC_H */