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 void shmem_lock(struct file * file, int lock);
390extern int shmem_zero_setup(struct vm_area_struct *);
391
392extern void zap_page_range(struct mm_struct *mm, unsigned long address, unsigned long size);
393extern int copy_page_range(struct mm_struct *dst, struct mm_struct *src, struct vm_area_struct *vma);
394extern int remap_page_range(unsigned long from, unsigned long to, unsigned long size, pgprot_t prot);
395extern int zeromap_page_range(unsigned long from, unsigned long size, pgprot_t prot);
396
397extern void vmtruncate(struct inode * inode, loff_t offset);
398extern int handle_mm_fault(struct mm_struct *mm,struct vm_area_struct *vma, unsigned long address, int write_access);
399extern int make_pages_present(unsigned long addr, unsigned long end);
400extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write);
401extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char *dst, int len);
402extern int ptrace_writedata(struct task_struct *tsk, char * src, unsigned long dst, int len);
403
404extern int pgt_cache_water[2];
405extern int check_pgt_cache(void);
406
407extern void free_area_init(unsigned long * zones_size);
408extern void free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap,
409 unsigned long * zones_size, unsigned long zone_start_paddr,
410 unsigned long *zholes_size);
411extern void mem_init(void);
412extern void show_mem(void);
413extern void si_meminfo(struct sysinfo * val);
414extern void swapin_readahead(swp_entry_t);
415
416
417extern void lock_vma_mappings(struct vm_area_struct *);
418extern void unlock_vma_mappings(struct vm_area_struct *);
419extern void insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
420extern void __insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
421extern void build_mmap_avl(struct mm_struct *);
422extern void exit_mmap(struct mm_struct *);
423extern unsigned long get_unmapped_area(unsigned long, unsigned long);
424
425extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
426 unsigned long len, unsigned long prot,
427 unsigned long flag, unsigned long pgoff);
428
429static inline unsigned long do_mmap(struct file *file, unsigned long addr,
430 unsigned long len, unsigned long prot,
431 unsigned long flag, unsigned long offset)
432{
433 unsigned long ret = -EINVAL;
434 if ((offset + PAGE_ALIGN(len)) < offset)
435 goto out;
436 if (!(offset & ~PAGE_MASK))
437 ret = do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT);
438out:
439 return ret;
440}
441
442extern int do_munmap(struct mm_struct *, unsigned long, size_t);
443
444extern unsigned long do_brk(unsigned long, unsigned long);
445
446struct zone_t;
447
448extern void remove_inode_page(struct page *);
449extern unsigned long page_unuse(struct page *);
450extern void truncate_inode_pages(struct address_space *, loff_t);
451
452
453extern int filemap_sync(struct vm_area_struct *, unsigned long, size_t, unsigned int);
454extern struct page *filemap_nopage(struct vm_area_struct *, unsigned long, int);
455
456
457
458
459#define __GFP_WAIT 0x01
460#define __GFP_HIGH 0x02
461#define __GFP_IO 0x04
462#define __GFP_DMA 0x08
463#ifdef CONFIG_HIGHMEM
464#define __GFP_HIGHMEM 0x10
465#else
466#define __GFP_HIGHMEM 0x0
467#endif
468#define __GFP_VM 0x20
469
470
471#define GFP_BUFFER (__GFP_HIGH | __GFP_WAIT)
472#define GFP_ATOMIC (__GFP_HIGH)
473#define GFP_USER ( __GFP_WAIT | __GFP_IO)
474#define GFP_HIGHUSER ( __GFP_WAIT | __GFP_IO | __GFP_HIGHMEM)
475#define GFP_KERNEL (__GFP_HIGH | __GFP_WAIT | __GFP_IO)
476#define GFP_NFS (__GFP_HIGH | __GFP_WAIT | __GFP_IO)
477#define GFP_KSWAPD ( __GFP_IO)
478
479
480
481
482#define GFP_DMA __GFP_DMA
483
484
485
486
487#define GFP_HIGHMEM __GFP_HIGHMEM
488
489
490
491static inline int expand_stack(struct vm_area_struct * vma, unsigned long address)
492{
493 unsigned long grow;
494
495 address &= PAGE_MASK;
496 grow = (vma->vm_start - address) >> PAGE_SHIFT;
497 if (vma->vm_end - address > current->rlim[RLIMIT_STACK].rlim_cur ||
498 ((vma->vm_mm->total_vm + grow) << PAGE_SHIFT) > current->rlim[RLIMIT_AS].rlim_cur)
499 return -ENOMEM;
500 vma->vm_start = address;
501 vma->vm_pgoff -= grow;
502 vma->vm_mm->total_vm += grow;
503 if (vma->vm_flags & VM_LOCKED)
504 vma->vm_mm->locked_vm += grow;
505 return 0;
506}
507
508
509extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr);
510extern struct vm_area_struct * find_vma_prev(struct mm_struct * mm, unsigned long addr,
511 struct vm_area_struct **pprev);
512
513
514
515static inline struct vm_area_struct * find_vma_intersection(struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr)
516{
517 struct vm_area_struct * vma = find_vma(mm,start_addr);
518
519 if (vma && end_addr <= vma->vm_start)
520 vma = NULL;
521 return vma;
522}
523
524extern struct vm_area_struct *find_extend_vma(struct mm_struct *mm, unsigned long addr);
525
526#define buffer_under_min() (atomic_read(&buffermem_pages) * 100 < \
527 buffer_mem.min_percent * num_physpages)
528#define pgcache_under_min() (atomic_read(&page_cache_size) * 100 < \
529 page_cache.min_percent * num_physpages)
530
531#endif
532
533#endif
534