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