pgalloc.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/asm-arm/pgalloc.h
  3.  *
  4.  *  Copyright (C) 2000-2001 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  */
  10. #ifndef _ASMARM_PGALLOC_H
  11. #define _ASMARM_PGALLOC_H
  12. #include <linux/config.h>
  13. #include <asm/processor.h>
  14. /*
  15.  * Get the cache handling stuff now.
  16.  */
  17. #include <asm/proc/cache.h>
  18. /*
  19.  * ARM processors do not cache TLB tables in RAM.
  20.  */
  21. #define flush_tlb_pgtables(mm,start,end) do { } while (0)
  22. /*
  23.  * Processor specific parts...
  24.  */
  25. #include <asm/proc/pgalloc.h>
  26. /*
  27.  * Page table cache stuff
  28.  */
  29. #ifndef CONFIG_NO_PGT_CACHE
  30. #ifdef CONFIG_SMP
  31. #error Pgtable caches have to be per-CPU, so that no locking is needed.
  32. #endif /* CONFIG_SMP */
  33. extern struct pgtable_cache_struct {
  34. unsigned long *pgd_cache;
  35. unsigned long *pte_cache;
  36. unsigned long pgtable_cache_sz;
  37. } quicklists;
  38. #define pgd_quicklist (quicklists.pgd_cache)
  39. #define pmd_quicklist ((unsigned long *)0)
  40. #define pte_quicklist (quicklists.pte_cache)
  41. #define pgtable_cache_size (quicklists.pgtable_cache_sz)
  42. /* used for quicklists */
  43. #define __pgd_next(pgd) (((unsigned long *)pgd)[1])
  44. #define __pte_next(pte) (((unsigned long *)pte)[0])
  45. static inline pgd_t *get_pgd_fast(void)
  46. {
  47. unsigned long *ret;
  48. if ((ret = pgd_quicklist) != NULL) {
  49. pgd_quicklist = (unsigned long *)__pgd_next(ret);
  50. ret[1] = ret[2];
  51. clean_dcache_entry(ret + 1);
  52. pgtable_cache_size--;
  53. }
  54. return (pgd_t *)ret;
  55. }
  56. static inline void free_pgd_fast(pgd_t *pgd)
  57. {
  58. __pgd_next(pgd) = (unsigned long) pgd_quicklist;
  59. pgd_quicklist = (unsigned long *) pgd;
  60. pgtable_cache_size++;
  61. }
  62. static inline pte_t *pte_alloc_one_fast(struct mm_struct *mm, unsigned long address)
  63. {
  64. unsigned long *ret;
  65. if((ret = pte_quicklist) != NULL) {
  66. pte_quicklist = (unsigned long *)__pte_next(ret);
  67. ret[0] = 0;
  68. clean_dcache_entry(ret);
  69. pgtable_cache_size--;
  70. }
  71. return (pte_t *)ret;
  72. }
  73. static inline void free_pte_fast(pte_t *pte)
  74. {
  75. __pte_next(pte) = (unsigned long) pte_quicklist;
  76. pte_quicklist = (unsigned long *) pte;
  77. pgtable_cache_size++;
  78. }
  79. #else /* CONFIG_NO_PGT_CACHE */
  80. #define pgd_quicklist ((unsigned long *)0)
  81. #define pmd_quicklist ((unsigned long *)0)
  82. #define pte_quicklist ((unsigned long *)0)
  83. #define get_pgd_fast() ((pgd_t *)0)
  84. #define pte_alloc_one_fast(mm,addr) ((pte_t *)0)
  85. #define free_pgd_fast(pgd) free_pgd_slow(pgd)
  86. #define free_pte_fast(pte) pte_free_slow(pte)
  87. #endif /* CONFIG_NO_PGT_CACHE */
  88. #define pte_free(pte) free_pte_fast(pte)
  89. /*
  90.  * Since we have only two-level page tables, these are trivial
  91.  */
  92. #define pmd_alloc_one_fast(mm,addr) ({ BUG(); ((pmd_t *)1); })
  93. #define pmd_alloc_one(mm,addr) ({ BUG(); ((pmd_t *)2); })
  94. #define pmd_free_slow(pmd) do { } while (0)
  95. #define pmd_free_fast(pmd) do { } while (0)
  96. #define pmd_free(pmd) do { } while (0)
  97. #define pgd_populate(mm,pmd,pte) BUG()
  98. extern pgd_t *get_pgd_slow(struct mm_struct *mm);
  99. extern void free_pgd_slow(pgd_t *pgd);
  100. static inline pgd_t *pgd_alloc(struct mm_struct *mm)
  101. {
  102. pgd_t *pgd;
  103. pgd = get_pgd_fast();
  104. if (!pgd)
  105. pgd = get_pgd_slow(mm);
  106. return pgd;
  107. }
  108. #define pgd_free(pgd) free_pgd_fast(pgd)
  109. extern int do_check_pgt_cache(int, int);
  110. #endif