home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / linux / rmap.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  3.4 KB  |  126 lines

  1. #ifndef _LINUX_RMAP_H
  2. #define _LINUX_RMAP_H
  3. /*
  4.  * Declarations for Reverse Mapping functions in mm/rmap.c
  5.  */
  6.  
  7. #include <linux/list.h>
  8. #include <linux/slab.h>
  9. #include <linux/mm.h>
  10. #include <linux/spinlock.h>
  11.  
  12. /*
  13.  * The anon_vma heads a list of private "related" vmas, to scan if
  14.  * an anonymous page pointing to this anon_vma needs to be unmapped:
  15.  * the vmas on the list will be related by forking, or by splitting.
  16.  *
  17.  * Since vmas come and go as they are split and merged (particularly
  18.  * in mprotect), the mapping field of an anonymous page cannot point
  19.  * directly to a vma: instead it points to an anon_vma, on whose list
  20.  * the related vmas can be easily linked or unlinked.
  21.  *
  22.  * After unlinking the last vma on the list, we must garbage collect
  23.  * the anon_vma object itself: we're guaranteed no page can be
  24.  * pointing to this anon_vma once its vma list is empty.
  25.  */
  26. struct anon_vma {
  27.     spinlock_t lock;    /* Serialize access to vma list */
  28.     struct list_head head;    /* List of private "related" vmas */
  29. };
  30.  
  31. #ifdef CONFIG_MMU
  32.  
  33. extern kmem_cache_t *anon_vma_cachep;
  34.  
  35. static inline struct anon_vma *anon_vma_alloc(void)
  36. {
  37.     return kmem_cache_alloc(anon_vma_cachep, SLAB_KERNEL);
  38. }
  39.  
  40. static inline void anon_vma_free(struct anon_vma *anon_vma)
  41. {
  42.     kmem_cache_free(anon_vma_cachep, anon_vma);
  43. }
  44.  
  45. static inline void anon_vma_lock(struct vm_area_struct *vma)
  46. {
  47.     struct anon_vma *anon_vma = vma->anon_vma;
  48.     if (anon_vma)
  49.         spin_lock(&anon_vma->lock);
  50. }
  51.  
  52. static inline void anon_vma_unlock(struct vm_area_struct *vma)
  53. {
  54.     struct anon_vma *anon_vma = vma->anon_vma;
  55.     if (anon_vma)
  56.         spin_unlock(&anon_vma->lock);
  57. }
  58.  
  59. /*
  60.  * anon_vma helper functions.
  61.  */
  62. void anon_vma_init(void);    /* create anon_vma_cachep */
  63. int  anon_vma_prepare(struct vm_area_struct *);
  64. void __anon_vma_merge(struct vm_area_struct *, struct vm_area_struct *);
  65. void anon_vma_unlink(struct vm_area_struct *);
  66. void anon_vma_link(struct vm_area_struct *);
  67. void __anon_vma_link(struct vm_area_struct *);
  68.  
  69. /*
  70.  * rmap interfaces called when adding or removing pte of page
  71.  */
  72. void page_add_anon_rmap(struct page *, struct vm_area_struct *, unsigned long);
  73. void page_add_new_anon_rmap(struct page *, struct vm_area_struct *, unsigned long);
  74. void page_add_file_rmap(struct page *);
  75. void page_remove_rmap(struct page *);
  76.  
  77. /**
  78.  * page_dup_rmap - duplicate pte mapping to a page
  79.  * @page:    the page to add the mapping to
  80.  *
  81.  * For copy_page_range only: minimal extract from page_add_rmap,
  82.  * avoiding unnecessary tests (already checked) so it's quicker.
  83.  */
  84. static inline void page_dup_rmap(struct page *page)
  85. {
  86.     atomic_inc(&page->_mapcount);
  87. }
  88.  
  89. /*
  90.  * Called from mm/vmscan.c to handle paging out
  91.  */
  92. int page_referenced(struct page *, int is_locked);
  93. int try_to_unmap(struct page *, int ignore_refs);
  94. void remove_from_swap(struct page *page);
  95.  
  96. /*
  97.  * Called from mm/filemap_xip.c to unmap empty zero page
  98.  */
  99. pte_t *page_check_address(struct page *, struct mm_struct *,
  100.                 unsigned long, spinlock_t **);
  101.  
  102. /*
  103.  * Used by swapoff to help locate where page is expected in vma.
  104.  */
  105. unsigned long page_address_in_vma(struct page *, struct vm_area_struct *);
  106.  
  107. #else    /* !CONFIG_MMU */
  108.  
  109. #define anon_vma_init()        do {} while (0)
  110. #define anon_vma_prepare(vma)    (0)
  111. #define anon_vma_link(vma)    do {} while (0)
  112.  
  113. #define page_referenced(page,l) TestClearPageReferenced(page)
  114. #define try_to_unmap(page, refs) SWAP_FAIL
  115.  
  116. #endif    /* CONFIG_MMU */
  117.  
  118. /*
  119.  * Return values of try_to_unmap
  120.  */
  121. #define SWAP_SUCCESS    0
  122. #define SWAP_AGAIN    1
  123. #define SWAP_FAIL    2
  124.  
  125. #endif    /* _LINUX_RMAP_H */
  126.