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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _CRIS_PGALLOC_H
  2. #define _CRIS_PGALLOC_H
  3. #include <asm/page.h>
  4. #include <linux/threads.h>
  5. extern struct pgtable_cache_struct {
  6.         unsigned long *pgd_cache;
  7.         unsigned long *pte_cache;
  8.         unsigned long pgtable_cache_sz;
  9. } quicklists;
  10. #define pgd_quicklist           (quicklists.pgd_cache)
  11. #define pmd_quicklist           ((unsigned long *)0)
  12. #define pte_quicklist           (quicklists.pte_cache)
  13. #define pgtable_cache_size      (quicklists.pgtable_cache_sz)
  14. #define pmd_populate(mm, pmd, pte) pmd_set(pmd, pte)
  15. /*
  16.  * Allocate and free page tables.
  17.  */
  18. extern __inline__ pgd_t *get_pgd_slow(void)
  19. {
  20.         pgd_t *ret = (pgd_t *)__get_free_page(GFP_KERNEL);
  21.         if (ret) {
  22.                 memset(ret, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
  23.                 memcpy(ret + USER_PTRS_PER_PGD, swapper_pg_dir + USER_PTRS_PER_PGD,
  24.        (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
  25.         }
  26.         return ret;
  27. }
  28. extern __inline__ void free_pgd_slow(pgd_t *pgd)
  29. {
  30.         free_page((unsigned long)pgd);
  31. }
  32. extern __inline__ pgd_t *get_pgd_fast(void)
  33. {
  34.         unsigned long *ret;
  35.         if ((ret = pgd_quicklist) != NULL) {
  36.                 pgd_quicklist = (unsigned long *)(*ret);
  37.                 ret[0] = 0;
  38.                 pgtable_cache_size--;
  39.         } else
  40.                 ret = (unsigned long *)get_pgd_slow();
  41.         return (pgd_t *)ret;
  42. }
  43. extern __inline__ void free_pgd_fast(pgd_t *pgd)
  44. {
  45.         *(unsigned long *)pgd = (unsigned long) pgd_quicklist;
  46.         pgd_quicklist = (unsigned long *) pgd;
  47.         pgtable_cache_size++;
  48. }
  49. static inline pte_t *pte_alloc_one(struct mm_struct *mm, unsigned long address)
  50. {
  51.         pte_t *pte;
  52.         pte = (pte_t *) __get_free_page(GFP_KERNEL);
  53.         if (pte)
  54.                 clear_page(pte);
  55.         return pte;
  56. }
  57. static inline pte_t *pte_alloc_one_fast(struct mm_struct *mm, unsigned long address)
  58. {
  59.         unsigned long *ret;
  60.         if((ret = (unsigned long *)pte_quicklist) != NULL) {
  61.                 pte_quicklist = (unsigned long *)(*ret);
  62.                 ret[0] = ret[1];
  63.                 pgtable_cache_size--;
  64.         }
  65.         return (pte_t *)ret;
  66. }
  67. static __inline__ void pte_free_fast(pte_t *pte)
  68. {
  69.         *(unsigned long *)pte = (unsigned long) pte_quicklist;
  70.         pte_quicklist = (unsigned long *) pte;
  71.         pgtable_cache_size++;
  72. }
  73. static __inline__ void pte_free_slow(pte_t *pte)
  74. {
  75.         free_page((unsigned long)pte);
  76. }
  77. #define pte_free(pte)      pte_free_slow(pte)
  78. #define pgd_free(pgd)      free_pgd_slow(pgd)
  79. #define pgd_alloc(mm)      get_pgd_fast()
  80. /*
  81.  * We don't have any real pmd's, and this code never triggers because
  82.  * the pgd will always be present..
  83.  */
  84. #define pmd_alloc_one_fast(mm, addr)    ({ BUG(); ((pmd_t *)1); })
  85. #define pmd_alloc_one(mm, addr)         ({ BUG(); ((pmd_t *)2); })
  86. #define pmd_free_slow(x)                do { } while (0)
  87. #define pmd_free_fast(x)                do { } while (0)
  88. #define pmd_free(x)                     do { } while (0)
  89. #define pgd_populate(mm, pmd, pte)      BUG()
  90. /* other stuff */
  91. extern int do_check_pgt_cache(int, int);
  92. #endif