Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
mm_types.h
Go to the documentation of this file.
1
#ifndef _LINUX_MM_TYPES_H
2
#define _LINUX_MM_TYPES_H
3
4
#include <linux/auxvec.h>
5
#include <linux/types.h>
6
#include <
linux/threads.h
>
7
#include <linux/list.h>
8
#include <
linux/spinlock.h
>
9
#include <linux/rbtree.h>
10
#include <
linux/rwsem.h
>
11
#include <
linux/completion.h
>
12
#include <
linux/cpumask.h
>
13
#include <
linux/page-debug-flags.h
>
14
#include <
linux/uprobes.h
>
15
#include <asm/page.h>
16
#include <asm/mmu.h>
17
18
#ifndef AT_VECTOR_SIZE_ARCH
19
#define AT_VECTOR_SIZE_ARCH 0
20
#endif
21
#define AT_VECTOR_SIZE (2*(AT_VECTOR_SIZE_ARCH + AT_VECTOR_SIZE_BASE + 1))
22
23
struct
address_space
;
24
25
#define USE_SPLIT_PTLOCKS (NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS)
26
27
/*
28
* Each physical page in the system has a struct page associated with
29
* it to keep track of whatever it is we are using the page for at the
30
* moment. Note that we have no way to track which tasks are using
31
* a page, though if it is a pagecache page, rmap structures can tell us
32
* who is mapping it.
33
*
34
* The objects in struct page are organized in double word blocks in
35
* order to allows us to use atomic double word operations on portions
36
* of struct page. That is currently only used by slub but the arrangement
37
* allows the use of atomic double word operations on the flags/mapping
38
* and lru list pointers also.
39
*/
40
struct
page
{
41
/* First double word block */
42
unsigned
long
flags
;
/* Atomic flags, some possibly
43
* updated asynchronously */
44
struct
address_space
*
mapping
;
/* If low bit clear, points to
45
* inode address_space, or NULL.
46
* If page mapped as anonymous
47
* memory, low bit is set, and
48
* it points to anon_vma object:
49
* see PAGE_MAPPING_ANON below.
50
*/
51
/* Second double word */
52
struct
{
53
union
{
54
pgoff_t
index
;
/* Our offset within mapping. */
55
void
*
freelist
;
/* slub/slob first free object */
56
bool
pfmemalloc
;
/* If set by the page allocator,
57
* ALLOC_NO_WATERMARKS was set
58
* and the low watermark was not
59
* met implying that the system
60
* is under some pressure. The
61
* caller should try ensure
62
* this page is only used to
63
* free other pages.
64
*/
65
};
66
67
union
{
68
#if defined(CONFIG_HAVE_CMPXCHG_DOUBLE) && \
69
defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE)
70
/* Used for cmpxchg_double in slub */
71
unsigned
long
counters
;
72
#else
73
/*
74
* Keep _count separate from slub cmpxchg_double data.
75
* As the rest of the double word is protected by
76
* slab_lock but _count is not.
77
*/
78
unsigned
counters
;
79
#endif
80
81
struct
{
82
83
union
{
84
/*
85
* Count of ptes mapped in
86
* mms, to show when page is
87
* mapped & limit reverse map
88
* searches.
89
*
90
* Used also for tail pages
91
* refcounting instead of
92
* _count. Tail pages cannot
93
* be mapped and keeping the
94
* tail page _count zero at
95
* all times guarantees
96
* get_page_unless_zero() will
97
* never succeed on tail
98
* pages.
99
*/
100
atomic_t
_mapcount
;
101
102
struct
{
/* SLUB */
103
unsigned
inuse
:16;
104
unsigned
objects
:15;
105
unsigned
frozen
:1;
106
};
107
int
units
;
/* SLOB */
108
};
109
atomic_t
_count
;
/* Usage count, see below. */
110
};
111
};
112
};
113
114
/* Third double word block */
115
union
{
116
struct
list_head
lru
;
/* Pageout list, eg. active_list
117
* protected by zone->lru_lock !
118
*/
119
struct
{
/* slub per cpu partial pages */
120
struct
page
*
next
;
/* Next partial slab */
121
#ifdef CONFIG_64BIT
122
int
pages
;
/* Nr of partial slabs left */
123
int
pobjects
;
/* Approximate # of objects */
124
#else
125
short
int
pages
;
126
short
int
pobjects
;
127
#endif
128
};
129
130
struct
list_head
list
;
/* slobs list of pages */
131
struct
{
/* slab fields */
132
struct
kmem_cache
*
slab_cache
;
133
struct
slab
*
slab_page
;
134
};
135
};
136
137
/* Remainder is not double word aligned */
138
union
{
139
unsigned
long
private
;
/* Mapping-private opaque data:
140
* usually used for buffer_heads
141
* if PagePrivate set; used for
142
* swp_entry_t if PageSwapCache;
143
* indicates order in the buddy
144
* system if PG_buddy is set.
145
*/
146
#if USE_SPLIT_PTLOCKS
147
spinlock_t
ptl
;
148
#endif
149
struct
kmem_cache
*
slab
;
/* SLUB: Pointer to slab */
150
struct
page
*
first_page
;
/* Compound tail pages */
151
};
152
153
/*
154
* On machines where all RAM is mapped into kernel address space,
155
* we can simply calculate the virtual address. On machines with
156
* highmem some memory is mapped into kernel virtual memory
157
* dynamically, so we need a place to store that address.
158
* Note that this field could be 16 bits on x86 ... ;)
159
*
160
* Architectures with slow multiplication can define
161
* WANT_PAGE_VIRTUAL in asm/page.h
162
*/
163
#if defined(WANT_PAGE_VIRTUAL)
164
void
*
virtual
;
/* Kernel virtual address (NULL if
165
not kmapped, ie. highmem) */
166
#endif
/* WANT_PAGE_VIRTUAL */
167
#ifdef CONFIG_WANT_PAGE_DEBUG_FLAGS
168
unsigned
long
debug_flags
;
/* Use atomic bitops on this */
169
#endif
170
171
#ifdef CONFIG_KMEMCHECK
172
/*
173
* kmemcheck wants to track the status of each byte in a page; this
174
* is a pointer to such a status block. NULL if not tracked.
175
*/
176
void
*
shadow
;
177
#endif
178
}
179
/*
180
* The struct page can be forced to be double word aligned so that atomic ops
181
* on double words work. The SLUB allocator can make use of such a feature.
182
*/
183
#ifdef CONFIG_HAVE_ALIGNED_STRUCT_PAGE
184
__aligned
(2 *
sizeof
(
unsigned
long
))
185
#endif
186
;
187
188
struct
page_frag
{
189
struct
page
*
page
;
190
#if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536)
191
__u32
offset
;
192
__u32
size
;
193
#else
194
__u16
offset
;
195
__u16
size
;
196
#endif
197
};
198
199
typedef
unsigned
long
__nocast
vm_flags_t
;
200
201
/*
202
* A region containing a mapping of a non-memory backed file under NOMMU
203
* conditions. These are held in a global tree and are pinned by the VMAs that
204
* map parts of them.
205
*/
206
struct
vm_region
{
207
struct
rb_node
vm_rb
;
/* link in global region tree */
208
vm_flags_t
vm_flags
;
/* VMA vm_flags */
209
unsigned
long
vm_start
;
/* start address of region */
210
unsigned
long
vm_end
;
/* region initialised to here */
211
unsigned
long
vm_top
;
/* region allocated to here */
212
unsigned
long
vm_pgoff
;
/* the offset in vm_file corresponding to vm_start */
213
struct
file
*
vm_file
;
/* the backing file or NULL */
214
215
int
vm_usage
;
/* region usage count (access under nommu_region_sem) */
216
bool
vm_icache_flushed
: 1;
/* true if the icache has been flushed for
217
* this region */
218
};
219
220
/*
221
* This struct defines a memory VMM memory area. There is one of these
222
* per VM-area/task. A VM area is any part of the process virtual memory
223
* space that has a special rule for the page-fault handlers (ie a shared
224
* library, the executable area etc).
225
*/
226
struct
vm_area_struct
{
227
struct
mm_struct
*
vm_mm
;
/* The address space we belong to. */
228
unsigned
long
vm_start
;
/* Our start address within vm_mm. */
229
unsigned
long
vm_end
;
/* The first byte after our end address
230
within vm_mm. */
231
232
/* linked list of VM areas per task, sorted by address */
233
struct
vm_area_struct
*
vm_next
, *
vm_prev
;
234
235
pgprot_t
vm_page_prot
;
/* Access permissions of this VMA. */
236
unsigned
long
vm_flags
;
/* Flags, see mm.h. */
237
238
struct
rb_node
vm_rb
;
239
240
/*
241
* For areas with an address space and backing store,
242
* linkage into the address_space->i_mmap interval tree, or
243
* linkage of vma in the address_space->i_mmap_nonlinear list.
244
*/
245
union
{
246
struct
{
247
struct
rb_node
rb
;
248
unsigned
long
rb_subtree_last
;
249
}
linear
;
250
struct
list_head
nonlinear
;
251
}
shared
;
252
253
/*
254
* A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma
255
* list, after a COW of one of the file pages. A MAP_SHARED vma
256
* can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack
257
* or brk vma (with NULL file) can only be in an anon_vma list.
258
*/
259
struct
list_head
anon_vma_chain
;
/* Serialized by mmap_sem &
260
* page_table_lock */
261
struct
anon_vma
*
anon_vma
;
/* Serialized by page_table_lock */
262
263
/* Function pointers to deal with this struct. */
264
const
struct
vm_operations_struct *
vm_ops
;
265
266
/* Information about our backing store: */
267
unsigned
long
vm_pgoff
;
/* Offset (within vm_file) in PAGE_SIZE
268
units, *not* PAGE_CACHE_SIZE */
269
struct
file
*
vm_file
;
/* File we map to (can be NULL). */
270
void
*
vm_private_data
;
/* was vm_pte (shared mem) */
271
272
#ifndef CONFIG_MMU
273
struct
vm_region
*
vm_region
;
/* NOMMU mapping region */
274
#endif
275
#ifdef CONFIG_NUMA
276
struct
mempolicy
*vm_policy;
/* NUMA policy for the VMA */
277
#endif
278
};
279
280
struct
core_thread
{
281
struct
task_struct
*
task
;
282
struct
core_thread
*
next
;
283
};
284
285
struct
core_state
{
286
atomic_t
nr_threads
;
287
struct
core_thread
dumper
;
288
struct
completion
startup
;
289
};
290
291
enum
{
292
MM_FILEPAGES
,
293
MM_ANONPAGES
,
294
MM_SWAPENTS
,
295
NR_MM_COUNTERS
296
};
297
298
#if USE_SPLIT_PTLOCKS && defined(CONFIG_MMU)
299
#define SPLIT_RSS_COUNTING
300
/* per-thread cached information, */
301
struct
task_rss_stat {
302
int
events
;
/* for synchronization threshold */
303
int
count
[
NR_MM_COUNTERS
];
304
};
305
#endif
/* USE_SPLIT_PTLOCKS */
306
307
struct
mm_rss_stat
{
308
atomic_long_t
count
[
NR_MM_COUNTERS
];
309
};
310
311
struct
mm_struct
{
312
struct
vm_area_struct
*
mmap
;
/* list of VMAs */
313
struct
rb_root
mm_rb
;
314
struct
vm_area_struct
*
mmap_cache
;
/* last find_vma result */
315
#ifdef CONFIG_MMU
316
unsigned
long
(*
get_unmapped_area
) (
struct
file
*filp,
317
unsigned
long
addr
,
unsigned
long
len
,
318
unsigned
long
pgoff,
unsigned
long
flags
);
319
void
(*unmap_area) (
struct
mm_struct
*mm,
unsigned
long
addr
);
320
#endif
321
unsigned
long
mmap_base
;
/* base of mmap area */
322
unsigned
long
task_size
;
/* size of task vm space */
323
unsigned
long
cached_hole_size
;
/* if non-zero, the largest hole below free_area_cache */
324
unsigned
long
free_area_cache
;
/* first hole of size cached_hole_size or larger */
325
pgd_t
*
pgd
;
326
atomic_t
mm_users
;
/* How many users with user space? */
327
atomic_t
mm_count
;
/* How many references to "struct mm_struct" (users count as 1) */
328
int
map_count
;
/* number of VMAs */
329
330
spinlock_t
page_table_lock
;
/* Protects page tables and some counters */
331
struct
rw_semaphore
mmap_sem
;
332
333
struct
list_head
mmlist
;
/* List of maybe swapped mm's. These are globally strung
334
* together off init_mm.mmlist, and are protected
335
* by mmlist_lock
336
*/
337
338
339
unsigned
long
hiwater_rss
;
/* High-watermark of RSS usage */
340
unsigned
long
hiwater_vm
;
/* High-water virtual memory usage */
341
342
unsigned
long
total_vm
;
/* Total pages mapped */
343
unsigned
long
locked_vm
;
/* Pages that have PG_mlocked set */
344
unsigned
long
pinned_vm
;
/* Refcount permanently increased */
345
unsigned
long
shared_vm
;
/* Shared pages (files) */
346
unsigned
long
exec_vm
;
/* VM_EXEC & ~VM_WRITE */
347
unsigned
long
stack_vm
;
/* VM_GROWSUP/DOWN */
348
unsigned
long
def_flags
;
349
unsigned
long
nr_ptes
;
/* Page table pages */
350
unsigned
long
start_code
,
end_code
,
start_data
,
end_data
;
351
unsigned
long
start_brk
,
brk
,
start_stack
;
352
unsigned
long
arg_start
,
arg_end
,
env_start
,
env_end
;
353
354
unsigned
long
saved_auxv
[
AT_VECTOR_SIZE
];
/* for /proc/PID/auxv */
355
356
/*
357
* Special counters, in some configurations protected by the
358
* page_table_lock, in other configurations by being atomic.
359
*/
360
struct
mm_rss_stat
rss_stat
;
361
362
struct
linux_binfmt
*
binfmt
;
363
364
cpumask_var_t
cpu_vm_mask_var
;
365
366
/* Architecture-specific MM context */
367
mm_context_t
context
;
368
369
unsigned
long
flags
;
/* Must use atomic bitops to access the bits */
370
371
struct
core_state
*
core_state
;
/* coredumping support */
372
#ifdef CONFIG_AIO
373
spinlock_t
ioctx_lock;
374
struct
hlist_head
ioctx_list;
375
#endif
376
#ifdef CONFIG_MM_OWNER
377
/*
378
* "owner" points to a task that is regarded as the canonical
379
* user/owner of this mm. All of the following must be true in
380
* order for it to be changed:
381
*
382
* current == mm->owner
383
* current->mm != mm
384
* new_owner->mm == mm
385
* new_owner->alloc_lock is held
386
*/
387
struct
task_struct
__rcu
*
owner
;
388
#endif
389
390
/* store ref to file /proc/<pid>/exe symlink points to */
391
struct
file
*
exe_file
;
392
#ifdef CONFIG_MMU_NOTIFIER
393
struct
mmu_notifier_mm *mmu_notifier_mm;
394
#endif
395
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
396
pgtable_t
pmd_huge_pte;
/* protected by page_table_lock */
397
#endif
398
#ifdef CONFIG_CPUMASK_OFFSTACK
399
struct
cpumask
cpumask_allocation;
400
#endif
401
struct
uprobes_state
uprobes_state
;
402
};
403
404
static
inline
void
mm_init_cpumask(
struct
mm_struct
*mm)
405
{
406
#ifdef CONFIG_CPUMASK_OFFSTACK
407
mm->
cpu_vm_mask_var
= &mm->cpumask_allocation;
408
#endif
409
}
410
411
/* Future-safe accessor for struct mm_struct's cpu_vm_mask. */
412
static
inline
cpumask_t
*mm_cpumask(
struct
mm_struct
*mm)
413
{
414
return
mm->
cpu_vm_mask_var
;
415
}
416
417
#endif
/* _LINUX_MM_TYPES_H */
Generated on Thu Jan 10 2013 14:51:59 for Linux Kernel by
1.8.2