diff options
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/mm.h | 6 | ||||
-rw-r--r-- | include/linux/mm_types.h | 3 | ||||
-rw-r--r-- | include/linux/rmap.h | 35 |
3 files changed, 38 insertions, 6 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index 8e580c07d171..8e2841a2f441 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -97,7 +97,11 @@ extern unsigned int kobjsize(const void *objp); | |||
97 | #define VM_NORESERVE 0x00200000 /* should the VM suppress accounting */ | 97 | #define VM_NORESERVE 0x00200000 /* should the VM suppress accounting */ |
98 | #define VM_HUGETLB 0x00400000 /* Huge TLB Page VM */ | 98 | #define VM_HUGETLB 0x00400000 /* Huge TLB Page VM */ |
99 | #define VM_NONLINEAR 0x00800000 /* Is non-linear (remap_file_pages) */ | 99 | #define VM_NONLINEAR 0x00800000 /* Is non-linear (remap_file_pages) */ |
100 | #ifdef CONFIG_MMU | ||
101 | #define VM_LOCK_RMAP 0x01000000 /* Do not follow this rmap (mmu mmap) */ | ||
102 | #else | ||
100 | #define VM_MAPPED_COPY 0x01000000 /* T if mapped copy of data (nommu mmap) */ | 103 | #define VM_MAPPED_COPY 0x01000000 /* T if mapped copy of data (nommu mmap) */ |
104 | #endif | ||
101 | #define VM_INSERTPAGE 0x02000000 /* The vma has had "vm_insert_page()" done on it */ | 105 | #define VM_INSERTPAGE 0x02000000 /* The vma has had "vm_insert_page()" done on it */ |
102 | #define VM_ALWAYSDUMP 0x04000000 /* Always include in core dumps */ | 106 | #define VM_ALWAYSDUMP 0x04000000 /* Always include in core dumps */ |
103 | 107 | ||
@@ -1216,7 +1220,7 @@ static inline void vma_nonlinear_insert(struct vm_area_struct *vma, | |||
1216 | 1220 | ||
1217 | /* mmap.c */ | 1221 | /* mmap.c */ |
1218 | extern int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin); | 1222 | extern int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin); |
1219 | extern void vma_adjust(struct vm_area_struct *vma, unsigned long start, | 1223 | extern int vma_adjust(struct vm_area_struct *vma, unsigned long start, |
1220 | unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert); | 1224 | unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert); |
1221 | extern struct vm_area_struct *vma_merge(struct mm_struct *, | 1225 | extern struct vm_area_struct *vma_merge(struct mm_struct *, |
1222 | struct vm_area_struct *prev, unsigned long addr, unsigned long end, | 1226 | struct vm_area_struct *prev, unsigned long addr, unsigned long end, |
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 19549d7275ab..048b46270aa5 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h | |||
@@ -163,7 +163,8 @@ struct vm_area_struct { | |||
163 | * can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack | 163 | * can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack |
164 | * or brk vma (with NULL file) can only be in an anon_vma list. | 164 | * or brk vma (with NULL file) can only be in an anon_vma list. |
165 | */ | 165 | */ |
166 | struct list_head anon_vma_node; /* Serialized by anon_vma->lock */ | 166 | struct list_head anon_vma_chain; /* Serialized by mmap_sem & |
167 | * page_table_lock */ | ||
167 | struct anon_vma *anon_vma; /* Serialized by page_table_lock */ | 168 | struct anon_vma *anon_vma; /* Serialized by page_table_lock */ |
168 | 169 | ||
169 | /* Function pointers to deal with this struct. */ | 170 | /* Function pointers to deal with this struct. */ |
diff --git a/include/linux/rmap.h b/include/linux/rmap.h index b019ae64e2ab..62da2001d55c 100644 --- a/include/linux/rmap.h +++ b/include/linux/rmap.h | |||
@@ -37,7 +37,27 @@ struct anon_vma { | |||
37 | * is serialized by a system wide lock only visible to | 37 | * is serialized by a system wide lock only visible to |
38 | * mm_take_all_locks() (mm_all_locks_mutex). | 38 | * mm_take_all_locks() (mm_all_locks_mutex). |
39 | */ | 39 | */ |
40 | struct list_head head; /* List of private "related" vmas */ | 40 | struct list_head head; /* Chain of private "related" vmas */ |
41 | }; | ||
42 | |||
43 | /* | ||
44 | * The copy-on-write semantics of fork mean that an anon_vma | ||
45 | * can become associated with multiple processes. Furthermore, | ||
46 | * each child process will have its own anon_vma, where new | ||
47 | * pages for that process are instantiated. | ||
48 | * | ||
49 | * This structure allows us to find the anon_vmas associated | ||
50 | * with a VMA, or the VMAs associated with an anon_vma. | ||
51 | * The "same_vma" list contains the anon_vma_chains linking | ||
52 | * all the anon_vmas associated with this VMA. | ||
53 | * The "same_anon_vma" list contains the anon_vma_chains | ||
54 | * which link all the VMAs associated with this anon_vma. | ||
55 | */ | ||
56 | struct anon_vma_chain { | ||
57 | struct vm_area_struct *vma; | ||
58 | struct anon_vma *anon_vma; | ||
59 | struct list_head same_vma; /* locked by mmap_sem & page_table_lock */ | ||
60 | struct list_head same_anon_vma; /* locked by anon_vma->lock */ | ||
41 | }; | 61 | }; |
42 | 62 | ||
43 | #ifdef CONFIG_MMU | 63 | #ifdef CONFIG_MMU |
@@ -89,12 +109,19 @@ static inline void anon_vma_unlock(struct vm_area_struct *vma) | |||
89 | */ | 109 | */ |
90 | void anon_vma_init(void); /* create anon_vma_cachep */ | 110 | void anon_vma_init(void); /* create anon_vma_cachep */ |
91 | int anon_vma_prepare(struct vm_area_struct *); | 111 | int anon_vma_prepare(struct vm_area_struct *); |
92 | void __anon_vma_merge(struct vm_area_struct *, struct vm_area_struct *); | 112 | void unlink_anon_vmas(struct vm_area_struct *); |
93 | void anon_vma_unlink(struct vm_area_struct *); | 113 | int anon_vma_clone(struct vm_area_struct *, struct vm_area_struct *); |
94 | void anon_vma_link(struct vm_area_struct *); | 114 | int anon_vma_fork(struct vm_area_struct *, struct vm_area_struct *); |
95 | void __anon_vma_link(struct vm_area_struct *); | 115 | void __anon_vma_link(struct vm_area_struct *); |
96 | void anon_vma_free(struct anon_vma *); | 116 | void anon_vma_free(struct anon_vma *); |
97 | 117 | ||
118 | static inline void anon_vma_merge(struct vm_area_struct *vma, | ||
119 | struct vm_area_struct *next) | ||
120 | { | ||
121 | VM_BUG_ON(vma->anon_vma != next->anon_vma); | ||
122 | unlink_anon_vmas(next); | ||
123 | } | ||
124 | |||
98 | /* | 125 | /* |
99 | * rmap interfaces called when adding or removing pte of page | 126 | * rmap interfaces called when adding or removing pte of page |
100 | */ | 127 | */ |