diff options
-rw-r--r-- | include/linux/mm.h | 63 | ||||
-rw-r--r-- | include/linux/mm_types.h | 144 | ||||
-rw-r--r-- | include/linux/sched.h | 74 |
3 files changed, 145 insertions, 136 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index fbbc29a29dff..6a68d41444f8 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -50,69 +50,6 @@ extern int sysctl_legacy_va_layout; | |||
50 | * mmap() functions). | 50 | * mmap() functions). |
51 | */ | 51 | */ |
52 | 52 | ||
53 | /* | ||
54 | * This struct defines a memory VMM memory area. There is one of these | ||
55 | * per VM-area/task. A VM area is any part of the process virtual memory | ||
56 | * space that has a special rule for the page-fault handlers (ie a shared | ||
57 | * library, the executable area etc). | ||
58 | */ | ||
59 | struct vm_area_struct { | ||
60 | struct mm_struct * vm_mm; /* The address space we belong to. */ | ||
61 | unsigned long vm_start; /* Our start address within vm_mm. */ | ||
62 | unsigned long vm_end; /* The first byte after our end address | ||
63 | within vm_mm. */ | ||
64 | |||
65 | /* linked list of VM areas per task, sorted by address */ | ||
66 | struct vm_area_struct *vm_next; | ||
67 | |||
68 | pgprot_t vm_page_prot; /* Access permissions of this VMA. */ | ||
69 | unsigned long vm_flags; /* Flags, listed below. */ | ||
70 | |||
71 | struct rb_node vm_rb; | ||
72 | |||
73 | /* | ||
74 | * For areas with an address space and backing store, | ||
75 | * linkage into the address_space->i_mmap prio tree, or | ||
76 | * linkage to the list of like vmas hanging off its node, or | ||
77 | * linkage of vma in the address_space->i_mmap_nonlinear list. | ||
78 | */ | ||
79 | union { | ||
80 | struct { | ||
81 | struct list_head list; | ||
82 | void *parent; /* aligns with prio_tree_node parent */ | ||
83 | struct vm_area_struct *head; | ||
84 | } vm_set; | ||
85 | |||
86 | struct raw_prio_tree_node prio_tree_node; | ||
87 | } shared; | ||
88 | |||
89 | /* | ||
90 | * A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma | ||
91 | * list, after a COW of one of the file pages. A MAP_SHARED vma | ||
92 | * can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack | ||
93 | * or brk vma (with NULL file) can only be in an anon_vma list. | ||
94 | */ | ||
95 | struct list_head anon_vma_node; /* Serialized by anon_vma->lock */ | ||
96 | struct anon_vma *anon_vma; /* Serialized by page_table_lock */ | ||
97 | |||
98 | /* Function pointers to deal with this struct. */ | ||
99 | struct vm_operations_struct * vm_ops; | ||
100 | |||
101 | /* Information about our backing store: */ | ||
102 | unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE | ||
103 | units, *not* PAGE_CACHE_SIZE */ | ||
104 | struct file * vm_file; /* File we map to (can be NULL). */ | ||
105 | void * vm_private_data; /* was vm_pte (shared mem) */ | ||
106 | unsigned long vm_truncate_count;/* truncate_count or restart_addr */ | ||
107 | |||
108 | #ifndef CONFIG_MMU | ||
109 | atomic_t vm_usage; /* refcount (VMAs shared if !MMU) */ | ||
110 | #endif | ||
111 | #ifdef CONFIG_NUMA | ||
112 | struct mempolicy *vm_policy; /* NUMA policy for the VMA */ | ||
113 | #endif | ||
114 | }; | ||
115 | |||
116 | extern struct kmem_cache *vm_area_cachep; | 53 | extern struct kmem_cache *vm_area_cachep; |
117 | 54 | ||
118 | /* | 55 | /* |
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index d5bb1796e12b..145b3d053048 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h | |||
@@ -1,13 +1,26 @@ | |||
1 | #ifndef _LINUX_MM_TYPES_H | 1 | #ifndef _LINUX_MM_TYPES_H |
2 | #define _LINUX_MM_TYPES_H | 2 | #define _LINUX_MM_TYPES_H |
3 | 3 | ||
4 | #include <linux/auxvec.h> /* For AT_VECTOR_SIZE */ | ||
4 | #include <linux/types.h> | 5 | #include <linux/types.h> |
5 | #include <linux/threads.h> | 6 | #include <linux/threads.h> |
6 | #include <linux/list.h> | 7 | #include <linux/list.h> |
7 | #include <linux/spinlock.h> | 8 | #include <linux/spinlock.h> |
9 | #include <linux/prio_tree.h> | ||
10 | #include <linux/rbtree.h> | ||
11 | #include <linux/rwsem.h> | ||
12 | #include <linux/completion.h> | ||
13 | #include <asm/page.h> | ||
14 | #include <asm/mmu.h> | ||
8 | 15 | ||
9 | struct address_space; | 16 | struct address_space; |
10 | 17 | ||
18 | #if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS | ||
19 | typedef atomic_long_t mm_counter_t; | ||
20 | #else /* NR_CPUS < CONFIG_SPLIT_PTLOCK_CPUS */ | ||
21 | typedef unsigned long mm_counter_t; | ||
22 | #endif /* NR_CPUS < CONFIG_SPLIT_PTLOCK_CPUS */ | ||
23 | |||
11 | /* | 24 | /* |
12 | * Each physical page in the system has a struct page associated with | 25 | * Each physical page in the system has a struct page associated with |
13 | * it to keep track of whatever it is we are using the page for at the | 26 | * it to keep track of whatever it is we are using the page for at the |
@@ -80,4 +93,135 @@ struct page { | |||
80 | #endif /* WANT_PAGE_VIRTUAL */ | 93 | #endif /* WANT_PAGE_VIRTUAL */ |
81 | }; | 94 | }; |
82 | 95 | ||
96 | /* | ||
97 | * This struct defines a memory VMM memory area. There is one of these | ||
98 | * per VM-area/task. A VM area is any part of the process virtual memory | ||
99 | * space that has a special rule for the page-fault handlers (ie a shared | ||
100 | * library, the executable area etc). | ||
101 | */ | ||
102 | struct vm_area_struct { | ||
103 | struct mm_struct * vm_mm; /* The address space we belong to. */ | ||
104 | unsigned long vm_start; /* Our start address within vm_mm. */ | ||
105 | unsigned long vm_end; /* The first byte after our end address | ||
106 | within vm_mm. */ | ||
107 | |||
108 | /* linked list of VM areas per task, sorted by address */ | ||
109 | struct vm_area_struct *vm_next; | ||
110 | |||
111 | pgprot_t vm_page_prot; /* Access permissions of this VMA. */ | ||
112 | unsigned long vm_flags; /* Flags, listed below. */ | ||
113 | |||
114 | struct rb_node vm_rb; | ||
115 | |||
116 | /* | ||
117 | * For areas with an address space and backing store, | ||
118 | * linkage into the address_space->i_mmap prio tree, or | ||
119 | * linkage to the list of like vmas hanging off its node, or | ||
120 | * linkage of vma in the address_space->i_mmap_nonlinear list. | ||
121 | */ | ||
122 | union { | ||
123 | struct { | ||
124 | struct list_head list; | ||
125 | void *parent; /* aligns with prio_tree_node parent */ | ||
126 | struct vm_area_struct *head; | ||
127 | } vm_set; | ||
128 | |||
129 | struct raw_prio_tree_node prio_tree_node; | ||
130 | } shared; | ||
131 | |||
132 | /* | ||
133 | * A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma | ||
134 | * list, after a COW of one of the file pages. A MAP_SHARED vma | ||
135 | * can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack | ||
136 | * or brk vma (with NULL file) can only be in an anon_vma list. | ||
137 | */ | ||
138 | struct list_head anon_vma_node; /* Serialized by anon_vma->lock */ | ||
139 | struct anon_vma *anon_vma; /* Serialized by page_table_lock */ | ||
140 | |||
141 | /* Function pointers to deal with this struct. */ | ||
142 | struct vm_operations_struct * vm_ops; | ||
143 | |||
144 | /* Information about our backing store: */ | ||
145 | unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE | ||
146 | units, *not* PAGE_CACHE_SIZE */ | ||
147 | struct file * vm_file; /* File we map to (can be NULL). */ | ||
148 | void * vm_private_data; /* was vm_pte (shared mem) */ | ||
149 | unsigned long vm_truncate_count;/* truncate_count or restart_addr */ | ||
150 | |||
151 | #ifndef CONFIG_MMU | ||
152 | atomic_t vm_usage; /* refcount (VMAs shared if !MMU) */ | ||
153 | #endif | ||
154 | #ifdef CONFIG_NUMA | ||
155 | struct mempolicy *vm_policy; /* NUMA policy for the VMA */ | ||
156 | #endif | ||
157 | }; | ||
158 | |||
159 | struct mm_struct { | ||
160 | struct vm_area_struct * mmap; /* list of VMAs */ | ||
161 | struct rb_root mm_rb; | ||
162 | struct vm_area_struct * mmap_cache; /* last find_vma result */ | ||
163 | unsigned long (*get_unmapped_area) (struct file *filp, | ||
164 | unsigned long addr, unsigned long len, | ||
165 | unsigned long pgoff, unsigned long flags); | ||
166 | void (*unmap_area) (struct mm_struct *mm, unsigned long addr); | ||
167 | unsigned long mmap_base; /* base of mmap area */ | ||
168 | unsigned long task_size; /* size of task vm space */ | ||
169 | unsigned long cached_hole_size; /* if non-zero, the largest hole below free_area_cache */ | ||
170 | unsigned long free_area_cache; /* first hole of size cached_hole_size or larger */ | ||
171 | pgd_t * pgd; | ||
172 | atomic_t mm_users; /* How many users with user space? */ | ||
173 | atomic_t mm_count; /* How many references to "struct mm_struct" (users count as 1) */ | ||
174 | int map_count; /* number of VMAs */ | ||
175 | struct rw_semaphore mmap_sem; | ||
176 | spinlock_t page_table_lock; /* Protects page tables and some counters */ | ||
177 | |||
178 | struct list_head mmlist; /* List of maybe swapped mm's. These are globally strung | ||
179 | * together off init_mm.mmlist, and are protected | ||
180 | * by mmlist_lock | ||
181 | */ | ||
182 | |||
183 | /* Special counters, in some configurations protected by the | ||
184 | * page_table_lock, in other configurations by being atomic. | ||
185 | */ | ||
186 | mm_counter_t _file_rss; | ||
187 | mm_counter_t _anon_rss; | ||
188 | |||
189 | unsigned long hiwater_rss; /* High-watermark of RSS usage */ | ||
190 | unsigned long hiwater_vm; /* High-water virtual memory usage */ | ||
191 | |||
192 | unsigned long total_vm, locked_vm, shared_vm, exec_vm; | ||
193 | unsigned long stack_vm, reserved_vm, def_flags, nr_ptes; | ||
194 | unsigned long start_code, end_code, start_data, end_data; | ||
195 | unsigned long start_brk, brk, start_stack; | ||
196 | unsigned long arg_start, arg_end, env_start, env_end; | ||
197 | |||
198 | unsigned long saved_auxv[AT_VECTOR_SIZE]; /* for /proc/PID/auxv */ | ||
199 | |||
200 | cpumask_t cpu_vm_mask; | ||
201 | |||
202 | /* Architecture-specific MM context */ | ||
203 | mm_context_t context; | ||
204 | |||
205 | /* Swap token stuff */ | ||
206 | /* | ||
207 | * Last value of global fault stamp as seen by this process. | ||
208 | * In other words, this value gives an indication of how long | ||
209 | * it has been since this task got the token. | ||
210 | * Look at mm/thrash.c | ||
211 | */ | ||
212 | unsigned int faultstamp; | ||
213 | unsigned int token_priority; | ||
214 | unsigned int last_interval; | ||
215 | |||
216 | unsigned long flags; /* Must use atomic bitops to access the bits */ | ||
217 | |||
218 | /* coredumping support */ | ||
219 | int core_waiters; | ||
220 | struct completion *core_startup_done, core_done; | ||
221 | |||
222 | /* aio bits */ | ||
223 | rwlock_t ioctx_list_lock; | ||
224 | struct kioctx *ioctx_list; | ||
225 | }; | ||
226 | |||
83 | #endif /* _LINUX_MM_TYPES_H */ | 227 | #endif /* _LINUX_MM_TYPES_H */ |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 228e0a8ce248..285ee4827a3c 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -1,8 +1,6 @@ | |||
1 | #ifndef _LINUX_SCHED_H | 1 | #ifndef _LINUX_SCHED_H |
2 | #define _LINUX_SCHED_H | 2 | #define _LINUX_SCHED_H |
3 | 3 | ||
4 | #include <linux/auxvec.h> /* For AT_VECTOR_SIZE */ | ||
5 | |||
6 | /* | 4 | /* |
7 | * cloning flags: | 5 | * cloning flags: |
8 | */ | 6 | */ |
@@ -58,12 +56,12 @@ struct sched_param { | |||
58 | #include <linux/cpumask.h> | 56 | #include <linux/cpumask.h> |
59 | #include <linux/errno.h> | 57 | #include <linux/errno.h> |
60 | #include <linux/nodemask.h> | 58 | #include <linux/nodemask.h> |
59 | #include <linux/mm_types.h> | ||
61 | 60 | ||
62 | #include <asm/system.h> | 61 | #include <asm/system.h> |
63 | #include <asm/semaphore.h> | 62 | #include <asm/semaphore.h> |
64 | #include <asm/page.h> | 63 | #include <asm/page.h> |
65 | #include <asm/ptrace.h> | 64 | #include <asm/ptrace.h> |
66 | #include <asm/mmu.h> | ||
67 | #include <asm/cputime.h> | 65 | #include <asm/cputime.h> |
68 | 66 | ||
69 | #include <linux/smp.h> | 67 | #include <linux/smp.h> |
@@ -319,7 +317,6 @@ extern void arch_unmap_area_topdown(struct mm_struct *, unsigned long); | |||
319 | #define add_mm_counter(mm, member, value) atomic_long_add(value, &(mm)->_##member) | 317 | #define add_mm_counter(mm, member, value) atomic_long_add(value, &(mm)->_##member) |
320 | #define inc_mm_counter(mm, member) atomic_long_inc(&(mm)->_##member) | 318 | #define inc_mm_counter(mm, member) atomic_long_inc(&(mm)->_##member) |
321 | #define dec_mm_counter(mm, member) atomic_long_dec(&(mm)->_##member) | 319 | #define dec_mm_counter(mm, member) atomic_long_dec(&(mm)->_##member) |
322 | typedef atomic_long_t mm_counter_t; | ||
323 | 320 | ||
324 | #else /* NR_CPUS < CONFIG_SPLIT_PTLOCK_CPUS */ | 321 | #else /* NR_CPUS < CONFIG_SPLIT_PTLOCK_CPUS */ |
325 | /* | 322 | /* |
@@ -331,7 +328,6 @@ typedef atomic_long_t mm_counter_t; | |||
331 | #define add_mm_counter(mm, member, value) (mm)->_##member += (value) | 328 | #define add_mm_counter(mm, member, value) (mm)->_##member += (value) |
332 | #define inc_mm_counter(mm, member) (mm)->_##member++ | 329 | #define inc_mm_counter(mm, member) (mm)->_##member++ |
333 | #define dec_mm_counter(mm, member) (mm)->_##member-- | 330 | #define dec_mm_counter(mm, member) (mm)->_##member-- |
334 | typedef unsigned long mm_counter_t; | ||
335 | 331 | ||
336 | #endif /* NR_CPUS < CONFIG_SPLIT_PTLOCK_CPUS */ | 332 | #endif /* NR_CPUS < CONFIG_SPLIT_PTLOCK_CPUS */ |
337 | 333 | ||
@@ -368,74 +364,6 @@ extern int get_dumpable(struct mm_struct *mm); | |||
368 | #define MMF_DUMP_FILTER_DEFAULT \ | 364 | #define MMF_DUMP_FILTER_DEFAULT \ |
369 | ((1 << MMF_DUMP_ANON_PRIVATE) | (1 << MMF_DUMP_ANON_SHARED)) | 365 | ((1 << MMF_DUMP_ANON_PRIVATE) | (1 << MMF_DUMP_ANON_SHARED)) |
370 | 366 | ||
371 | struct mm_struct { | ||
372 | struct vm_area_struct * mmap; /* list of VMAs */ | ||
373 | struct rb_root mm_rb; | ||
374 | struct vm_area_struct * mmap_cache; /* last find_vma result */ | ||
375 | unsigned long (*get_unmapped_area) (struct file *filp, | ||
376 | unsigned long addr, unsigned long len, | ||
377 | unsigned long pgoff, unsigned long flags); | ||
378 | void (*unmap_area) (struct mm_struct *mm, unsigned long addr); | ||
379 | unsigned long mmap_base; /* base of mmap area */ | ||
380 | unsigned long task_size; /* size of task vm space */ | ||
381 | unsigned long cached_hole_size; /* if non-zero, the largest hole below free_area_cache */ | ||
382 | unsigned long free_area_cache; /* first hole of size cached_hole_size or larger */ | ||
383 | pgd_t * pgd; | ||
384 | atomic_t mm_users; /* How many users with user space? */ | ||
385 | atomic_t mm_count; /* How many references to "struct mm_struct" (users count as 1) */ | ||
386 | int map_count; /* number of VMAs */ | ||
387 | struct rw_semaphore mmap_sem; | ||
388 | spinlock_t page_table_lock; /* Protects page tables and some counters */ | ||
389 | |||
390 | struct list_head mmlist; /* List of maybe swapped mm's. These are globally strung | ||
391 | * together off init_mm.mmlist, and are protected | ||
392 | * by mmlist_lock | ||
393 | */ | ||
394 | |||
395 | /* Special counters, in some configurations protected by the | ||
396 | * page_table_lock, in other configurations by being atomic. | ||
397 | */ | ||
398 | mm_counter_t _file_rss; | ||
399 | mm_counter_t _anon_rss; | ||
400 | |||
401 | unsigned long hiwater_rss; /* High-watermark of RSS usage */ | ||
402 | unsigned long hiwater_vm; /* High-water virtual memory usage */ | ||
403 | |||
404 | unsigned long total_vm, locked_vm, shared_vm, exec_vm; | ||
405 | unsigned long stack_vm, reserved_vm, def_flags, nr_ptes; | ||
406 | unsigned long start_code, end_code, start_data, end_data; | ||
407 | unsigned long start_brk, brk, start_stack; | ||
408 | unsigned long arg_start, arg_end, env_start, env_end; | ||
409 | |||
410 | unsigned long saved_auxv[AT_VECTOR_SIZE]; /* for /proc/PID/auxv */ | ||
411 | |||
412 | cpumask_t cpu_vm_mask; | ||
413 | |||
414 | /* Architecture-specific MM context */ | ||
415 | mm_context_t context; | ||
416 | |||
417 | /* Swap token stuff */ | ||
418 | /* | ||
419 | * Last value of global fault stamp as seen by this process. | ||
420 | * In other words, this value gives an indication of how long | ||
421 | * it has been since this task got the token. | ||
422 | * Look at mm/thrash.c | ||
423 | */ | ||
424 | unsigned int faultstamp; | ||
425 | unsigned int token_priority; | ||
426 | unsigned int last_interval; | ||
427 | |||
428 | unsigned long flags; /* Must use atomic bitops to access the bits */ | ||
429 | |||
430 | /* coredumping support */ | ||
431 | int core_waiters; | ||
432 | struct completion *core_startup_done, core_done; | ||
433 | |||
434 | /* aio bits */ | ||
435 | rwlock_t ioctx_list_lock; | ||
436 | struct kioctx *ioctx_list; | ||
437 | }; | ||
438 | |||
439 | struct sighand_struct { | 367 | struct sighand_struct { |
440 | atomic_t count; | 368 | atomic_t count; |
441 | struct k_sigaction action[_NSIG]; | 369 | struct k_sigaction action[_NSIG]; |