1#ifndef _LINUX_MM_H
2#define _LINUX_MM_H
3
4#include <linux/sched.h>
5#include <linux/errno.h>
6
7#ifdef __KERNEL__
8
9#include <linux/config.h>
10#include <linux/string.h>
11#include <linux/list.h>
12#include <linux/mmzone.h>
13
14extern unsigned long max_mapnr;
15extern unsigned long num_physpages;
16extern void * high_memory;
17extern int page_cluster;
18
19#include <asm/page.h>
20#include <asm/pgtable.h>
21#include <asm/atomic.h>
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38struct vm_area_struct {
39 struct mm_struct * vm_mm;
40 unsigned long vm_start;
41 unsigned long vm_end;
42
43
44 struct vm_area_struct *vm_next;
45
46 pgprot_t vm_page_prot;
47 unsigned long vm_flags;
48
49
50 short vm_avl_height;
51 struct vm_area_struct * vm_avl_left;
52 struct vm_area_struct * vm_avl_right;
53
54
55
56
57 struct vm_area_struct *vm_next_share;
58 struct vm_area_struct **vm_pprev_share;
59
60 struct vm_operations_struct * vm_ops;
61 unsigned long vm_pgoff;
62 struct file * vm_file;
63 void * vm_private_data;
64};
65
66
67
68
69#define VM_READ 0x00000001
70#define VM_WRITE 0x00000002
71#define VM_EXEC 0x00000004
72#define VM_SHARED 0x00000008
73
74#define VM_MAYREAD 0x00000010
75#define VM_MAYWRITE 0x00000020
76#define VM_MAYEXEC 0x00000040
77#define VM_MAYSHARE 0x00000080
78
79#define VM_GROWSDOWN 0x00000100
80#define VM_GROWSUP 0x00000200
81#define VM_SHM 0x00000400
82#define VM_DENYWRITE 0x00000800
83
84#define VM_EXECUTABLE 0x00001000
85#define VM_LOCKED 0x00002000
86#define VM_IO 0x00004000
87
88#define VM_STACK_FLAGS 0x00000177
89
90
91
92
93
94extern pgprot_t protection_map[16];
95
96
97
98
99
100
101
102struct vm_operations_struct {
103 void (*open)(struct vm_area_struct * area);
104 void (*close)(struct vm_area_struct * area);
105 void (*unmap)(struct vm_area_struct *area, unsigned long, size_t);
106 void (*protect)(struct vm_area_struct *area, unsigned long, size_t, unsigned int newprot);
107 int (*sync)(struct vm_area_struct *area, unsigned long, size_t, unsigned int flags);
108 void (*advise)(struct vm_area_struct *area, unsigned long, size_t, unsigned int advise);
109 struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int write_access);
110 struct page * (*wppage)(struct vm_area_struct * area, unsigned long address, struct page * page);
111 int (*swapout)(struct page *, struct file *);
112};
113
114
115
116
117
118
119typedef struct {
120 unsigned long val;
121} swp_entry_t;
122
123
124
125
126
127
128
129
130
131typedef struct page {
132 struct list_head list;
133 struct address_space *mapping;
134 unsigned long index;
135 struct page *next_hash;
136 atomic_t count;
137 unsigned long flags;
138 struct list_head lru;
139 wait_queue_head_t wait;
140 struct page **pprev_hash;
141 struct buffer_head * buffers;
142 unsigned long virtual;
143 struct zone_struct *zone;
144} mem_map_t;
145
146#define get_page(p) atomic_inc(&(p)->count)
147#define put_page(p) __free_page(p)
148#define put_page_testzero(p) atomic_dec_and_test(&(p)->count)
149#define page_count(p) atomic_read(&(p)->count)
150#define set_page_count(p,v) atomic_set(&(p)->count, v)
151
152
153#define PG_locked 0
154#define PG_error 1
155#define PG_referenced 2
156#define PG_uptodate 3
157#define PG__unused_00 4
158#define PG_decr_after 5
159#define PG_unused_01 6
160#define PG__unused_02 7
161#define PG_slab 8
162#define PG_swap_cache 9
163#define PG_skip 10
164#define PG_swap_entry 11
165#define PG_highmem 12
166
167#define PG_reserved 31
168
169
170
171#define Page_Uptodate(page) test_bit(PG_uptodate, &(page)->flags)
172#define SetPageUptodate(page) set_bit(PG_uptodate, &(page)->flags)
173#define ClearPageUptodate(page) clear_bit(PG_uptodate, &(page)->flags)
174#define PageLocked(page) test_bit(PG_locked, &(page)->flags)
175#define LockPage(page) set_bit(PG_locked, &(page)->flags)
176#define TryLockPage(page) test_and_set_bit(PG_locked, &(page)->flags)
177#define UnlockPage(page) do { \
178 clear_bit(PG_locked, &(page)->flags); \
179 wake_up(&page->wait); \
180 } while (0)
181#define PageError(page) test_bit(PG_error, &(page)->flags)
182#define SetPageError(page) test_and_set_bit(PG_error, &(page)->flags)
183#define ClearPageError(page) clear_bit(PG_error, &(page)->flags)
184#define PageReferenced(page) test_bit(PG_referenced, &(page)->flags)
185#define PageDecrAfter(page) test_bit(PG_decr_after, &(page)->flags)
186#define PageSlab(page) test_bit(PG_slab, &(page)->flags)
187#define PageSwapCache(page) test_bit(PG_swap_cache, &(page)->flags)
188#define PageReserved(page) test_bit(PG_reserved, &(page)->flags)
189
190#define PageSetSlab(page) set_bit(PG_slab, &(page)->flags)
191#define PageSetSwapCache(page) set_bit(PG_swap_cache, &(page)->flags)
192
193#define PageTestandSetSwapCache(page) test_and_set_bit(PG_swap_cache, &(page)->flags)
194
195#define PageClearSlab(page) clear_bit(PG_slab, &(page)->flags)
196#define PageClearSwapCache(page) clear_bit(PG_swap_cache, &(page)->flags)
197
198#define PageTestandClearSwapCache(page) test_and_clear_bit(PG_swap_cache, &(page)->flags)
199
200#ifdef CONFIG_HIGHMEM
201#define PageHighMem(page) test_bit(PG_highmem, &(page)->flags)
202#else
203#define PageHighMem(page) 0
204#endif
205
206#define SetPageReserved(page) set_bit(PG_reserved, &(page)->flags)
207#define ClearPageReserved(page) clear_bit(PG_reserved, &(page)->flags)
208
209
210
211
212#define NOPAGE_SIGBUS (NULL)
213#define NOPAGE_OOM ((struct page *) (-1))
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286extern mem_map_t * mem_map;
287
288
289
290
291
292
293
294extern struct page * FASTCALL(__alloc_pages(zonelist_t *zonelist, unsigned long order));
295extern struct page * alloc_pages_node(int nid, int gfp_mask, unsigned long order);
296
297#ifndef CONFIG_DISCONTIGMEM
298extern inline struct page * alloc_pages(int gfp_mask, unsigned long order)
299{
300
301 if (contig_page_data.node_zonelists[gfp_mask].gfp_mask != (gfp_mask))
302 BUG();
303
304
305
306 if (order >= MAX_ORDER)
307 return NULL;
308 return __alloc_pages(contig_page_data.node_zonelists+(gfp_mask), order);
309}
310#else
311extern struct page * alloc_pages(int gfp_mask, unsigned long order);
312#endif
313
314#define alloc_page(gfp_mask) \
315 alloc_pages(gfp_mask, 0)
316
317extern inline unsigned long __get_free_pages (int gfp_mask, unsigned long order)
318{
319 struct page * page;
320
321 page = alloc_pages(gfp_mask, order);
322 if (!page)
323 return 0;
324 return page_address(page);
325}
326
327#define __get_free_page(gfp_mask) \
328 __get_free_pages((gfp_mask),0)
329
330#define __get_dma_pages(gfp_mask, order) \
331 __get_free_pages((gfp_mask) | GFP_DMA,(order))
332
333extern inline unsigned long get_zeroed_page(int gfp_mask)
334{
335 unsigned long page;
336
337 page = __get_free_page(gfp_mask);
338 if (page)
339 clear_page((void *)page);
340 return page;
341}
342
343
344
345
346#define get_free_page get_zeroed_page
347
348
349
350
351extern void FASTCALL(__free_pages_ok(struct page * page, unsigned long order));
352
353extern inline void __free_pages(struct page *page, unsigned long order)
354{
355 if (!put_page_testzero(page))
356 return;
357 __free_pages_ok(page, order);
358}
359
360#define __free_page(page) __free_pages(page, 0)
361
362extern inline void free_pages(unsigned long addr, unsigned long order)
363{
364 unsigned long map_nr;
365
366#ifdef CONFIG_DISCONTIGMEM
367 if (addr == 0) return;
368#endif
369 map_nr = MAP_NR(addr);
370 if (map_nr < max_mapnr)
371 __free_pages(mem_map + map_nr, order);
372}
373
374#define free_page(addr) free_pages((addr),0)
375
376extern void show_free_areas(void);
377extern void show_free_areas_node(int nid);
378
379extern void clear_page_tables(struct mm_struct *, unsigned long, int);
380
381extern int map_zero_setup(struct vm_area_struct *);
382
383extern void zap_page_range(struct mm_struct *mm, unsigned long address, unsigned long size);
384extern int copy_page_range(struct mm_struct *dst, struct mm_struct *src, struct vm_area_struct *vma);
385extern int remap_page_range(unsigned long from, unsigned long to, unsigned long size, pgprot_t prot);
386extern int zeromap_page_range(unsigned long from, unsigned long size, pgprot_t prot);
387
388extern void vmtruncate(struct inode * inode, loff_t offset);
389extern int handle_mm_fault(struct task_struct *tsk,struct vm_area_struct *vma, unsigned long address, int write_access);
390extern int make_pages_present(unsigned long addr, unsigned long end);
391extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write);
392extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char *dst, int len);
393extern int ptrace_writedata(struct task_struct *tsk, char * src, unsigned long dst, int len);
394
395extern int pgt_cache_water[2];
396extern int check_pgt_cache(void);
397
398extern void free_area_init(unsigned long * zones_size);
399extern void free_area_init_node(int nid, pg_data_t *pgdat,
400 unsigned long * zones_size, unsigned long zone_start_paddr);
401extern void mem_init(void);
402extern void show_mem(void);
403extern void si_meminfo(struct sysinfo * val);
404extern void swapin_readahead(swp_entry_t);
405
406
407extern void vma_init(void);
408extern void merge_segments(struct mm_struct *, unsigned long, unsigned long);
409extern void insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
410extern void build_mmap_avl(struct mm_struct *);
411extern void exit_mmap(struct mm_struct *);
412extern unsigned long get_unmapped_area(unsigned long, unsigned long);
413
414extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
415 unsigned long len, unsigned long prot,
416 unsigned long flag, unsigned long pgoff);
417
418extern inline unsigned long do_mmap(struct file *file, unsigned long addr,
419 unsigned long len, unsigned long prot,
420 unsigned long flag, unsigned long offset)
421{
422 unsigned long ret = -EINVAL;
423 if ((offset + PAGE_ALIGN(len)) < offset)
424 goto out;
425 if (!(offset & ~PAGE_MASK))
426 ret = do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT);
427out:
428 return ret;
429}
430
431extern int do_munmap(unsigned long, size_t);
432extern unsigned long do_brk(unsigned long, unsigned long);
433
434struct zone_t;
435
436extern void remove_inode_page(struct page *);
437extern unsigned long page_unuse(struct page *);
438extern int shrink_mmap(int, int, zone_t *);
439extern void truncate_inode_pages(struct address_space *, loff_t);
440
441
442extern int filemap_swapout(struct page * page, struct file *file);
443extern pte_t filemap_swapin(struct vm_area_struct * vma,
444 unsigned long offset, unsigned long entry);
445extern int filemap_sync(struct vm_area_struct * vma, unsigned long address,
446 size_t size, unsigned int flags);
447extern struct page *filemap_nopage(struct vm_area_struct * area,
448 unsigned long address, int no_share);
449
450
451
452
453#define __GFP_WAIT 0x01
454#define __GFP_HIGH 0x02
455#define __GFP_IO 0x04
456#define __GFP_DMA 0x08
457#ifdef CONFIG_HIGHMEM
458#define __GFP_HIGHMEM 0x10
459#else
460#define __GFP_HIGHMEM 0x0
461#endif
462
463
464#define GFP_BUFFER (__GFP_HIGH | __GFP_WAIT)
465#define GFP_ATOMIC (__GFP_HIGH)
466#define GFP_USER (__GFP_WAIT | __GFP_IO)
467#define GFP_HIGHUSER (GFP_USER | __GFP_HIGHMEM)
468#define GFP_KERNEL (__GFP_HIGH | __GFP_WAIT | __GFP_IO)
469#define GFP_NFS (__GFP_HIGH | __GFP_WAIT | __GFP_IO)
470#define GFP_KSWAPD (__GFP_IO)
471
472
473
474
475#define GFP_DMA __GFP_DMA
476
477
478
479
480#define GFP_HIGHMEM __GFP_HIGHMEM
481
482
483
484static inline int expand_stack(struct vm_area_struct * vma, unsigned long address)
485{
486 unsigned long grow;
487
488 address &= PAGE_MASK;
489 grow = (vma->vm_start - address) >> PAGE_SHIFT;
490 if (vma->vm_end - address > current->rlim[RLIMIT_STACK].rlim_cur ||
491 ((vma->vm_mm->total_vm + grow) << PAGE_SHIFT) > current->rlim[RLIMIT_AS].rlim_cur)
492 return -ENOMEM;
493 vma->vm_start = address;
494 vma->vm_pgoff -= grow;
495 vma->vm_mm->total_vm += grow;
496 if (vma->vm_flags & VM_LOCKED)
497 vma->vm_mm->locked_vm += grow;
498 return 0;
499}
500
501
502extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr);
503extern struct vm_area_struct * find_vma_prev(struct mm_struct * mm, unsigned long addr,
504 struct vm_area_struct **pprev);
505
506
507
508static inline struct vm_area_struct * find_vma_intersection(struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr)
509{
510 struct vm_area_struct * vma = find_vma(mm,start_addr);
511
512 if (vma && end_addr <= vma->vm_start)
513 vma = NULL;
514 return vma;
515}
516
517extern struct vm_area_struct *find_extend_vma(struct task_struct *tsk, unsigned long addr);
518
519#define buffer_under_min() (atomic_read(&buffermem_pages) * 100 < \
520 buffer_mem.min_percent * num_physpages)
521#define pgcache_under_min() (atomic_read(&page_cache_size) * 100 < \
522 page_cache.min_percent * num_physpages)
523
524#define vmlist_access_lock(mm) spin_lock(&mm->page_table_lock)
525#define vmlist_access_unlock(mm) spin_unlock(&mm->page_table_lock)
526#define vmlist_modify_lock(mm) vmlist_access_lock(mm)
527#define vmlist_modify_unlock(mm) vmlist_access_unlock(mm)
528
529#endif
530
531#endif
532