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#include <linux/swap.h>
14#include <linux/rbtree.h>
15
16extern unsigned long max_mapnr;
17extern unsigned long num_physpages;
18extern unsigned long num_mappedpages;
19extern void * high_memory;
20extern int page_cluster;
21
22extern struct list_head active_list;
23extern struct list_head inactive_list;
24
25#include <asm/page.h>
26#include <asm/pgtable.h>
27#include <asm/atomic.h>
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44struct vm_area_struct {
45 struct mm_struct * vm_mm;
46 unsigned long vm_start;
47 unsigned long vm_end;
48
49
50
51 struct vm_area_struct *vm_next;
52
53 pgprot_t vm_page_prot;
54 unsigned long vm_flags;
55
56 rb_node_t vm_rb;
57
58
59
60
61
62
63 struct vm_area_struct *vm_next_share;
64 struct vm_area_struct **vm_pprev_share;
65
66
67 struct vm_operations_struct * vm_ops;
68
69
70 unsigned long vm_pgoff;
71
72 struct file * vm_file;
73 unsigned long vm_raend;
74 void * vm_private_data;
75};
76
77
78
79
80#define VM_READ 0x00000001
81#define VM_WRITE 0x00000002
82#define VM_EXEC 0x00000004
83#define VM_SHARED 0x00000008
84
85#define VM_MAYREAD 0x00000010
86#define VM_MAYWRITE 0x00000020
87#define VM_MAYEXEC 0x00000040
88#define VM_MAYSHARE 0x00000080
89
90#define VM_GROWSDOWN 0x00000100
91#define VM_GROWSUP 0x00000200
92#define VM_SHM 0x00000400
93#define VM_DENYWRITE 0x00000800
94
95#define VM_EXECUTABLE 0x00001000
96#define VM_LOCKED 0x00002000
97#define VM_IO 0x00004000
98
99
100#define VM_SEQ_READ 0x00008000
101#define VM_RAND_READ 0x00010000
102
103#define VM_DONTCOPY 0x00020000
104#define VM_DONTEXPAND 0x00040000
105#define VM_RESERVED 0x00080000
106
107#define VM_STACK_FLAGS 0x00000177
108
109#define VM_READHINTMASK (VM_SEQ_READ | VM_RAND_READ)
110#define VM_ClearReadHint(v) (v)->vm_flags &= ~VM_READHINTMASK
111#define VM_NormalReadHint(v) (!((v)->vm_flags & VM_READHINTMASK))
112#define VM_SequentialReadHint(v) ((v)->vm_flags & VM_SEQ_READ)
113#define VM_RandomReadHint(v) ((v)->vm_flags & VM_RAND_READ)
114
115
116extern int vm_min_readahead;
117extern int vm_max_readahead;
118
119
120
121
122
123extern pgprot_t protection_map[16];
124
125
126
127
128
129
130
131struct vm_operations_struct {
132 void (*open)(struct vm_area_struct * area);
133 void (*close)(struct vm_area_struct * area);
134 struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int unused);
135};
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152typedef struct page {
153 struct list_head list;
154 struct address_space *mapping;
155 unsigned long index;
156 struct page *next_hash;
157
158 atomic_t count;
159 unsigned long flags;
160
161 struct list_head lru;
162
163 struct page **pprev_hash;
164 struct buffer_head * buffers;
165
166
167
168
169
170
171
172
173
174
175
176#if defined(CONFIG_HIGHMEM) || defined(WANT_PAGE_VIRTUAL)
177 void *virtual;
178
179#endif
180} mem_map_t;
181
182
183
184
185
186
187
188
189
190
191
192
193
194#define get_page(p) atomic_inc(&(p)->count)
195#define put_page(p) __free_page(p)
196#define put_page_testzero(p) atomic_dec_and_test(&(p)->count)
197#define page_count(p) atomic_read(&(p)->count)
198#define set_page_count(p,v) atomic_set(&(p)->count, v)
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
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#define PG_locked 0
286#define PG_error 1
287#define PG_referenced 2
288#define PG_uptodate 3
289#define PG_dirty 4
290#define PG_unused 5
291#define PG_lru 6
292#define PG_active 7
293#define PG_slab 8
294#define PG_skip 10
295#define PG_highmem 11
296#define PG_checked 12
297#define PG_arch_1 13
298#define PG_reserved 14
299#define PG_launder 15
300#define PG_fs_1 16
301
302
303#define UnlockPage(page) unlock_page(page)
304#define Page_Uptodate(page) test_bit(PG_uptodate, &(page)->flags)
305#define SetPageUptodate(page) set_bit(PG_uptodate, &(page)->flags)
306#define ClearPageUptodate(page) clear_bit(PG_uptodate, &(page)->flags)
307#define PageDirty(page) test_bit(PG_dirty, &(page)->flags)
308#define SetPageDirty(page) set_bit(PG_dirty, &(page)->flags)
309#define ClearPageDirty(page) clear_bit(PG_dirty, &(page)->flags)
310#define PageLocked(page) test_bit(PG_locked, &(page)->flags)
311#define LockPage(page) set_bit(PG_locked, &(page)->flags)
312#define TryLockPage(page) test_and_set_bit(PG_locked, &(page)->flags)
313#define PageChecked(page) test_bit(PG_checked, &(page)->flags)
314#define SetPageChecked(page) set_bit(PG_checked, &(page)->flags)
315#define PageLaunder(page) test_bit(PG_launder, &(page)->flags)
316#define SetPageLaunder(page) set_bit(PG_launder, &(page)->flags)
317#define ClearPageLaunder(page) clear_bit(PG_launder, &(page)->flags)
318
319
320
321
322
323#define NODE_SHIFT 4
324#define ZONE_SHIFT (BITS_PER_LONG - 8)
325
326struct zone_struct;
327extern struct zone_struct *zone_table[];
328
329static inline zone_t *page_zone(struct page *page)
330{
331 return zone_table[page->flags >> ZONE_SHIFT];
332}
333
334static inline void set_page_zone(struct page *page, unsigned long zone_num)
335{
336 page->flags &= ~(~0UL << ZONE_SHIFT);
337 page->flags |= zone_num << ZONE_SHIFT;
338}
339
340
341
342
343
344
345
346#if defined(CONFIG_HIGHMEM) || defined(WANT_PAGE_VIRTUAL)
347
348#define set_page_address(page, address) \
349 do { \
350 (page)->virtual = (address); \
351 } while(0)
352
353#else
354#define set_page_address(page, address) do { } while(0)
355#endif
356
357
358
359
360
361#if defined(CONFIG_HIGHMEM) || defined(WANT_PAGE_VIRTUAL)
362
363#define page_address(page) ((page)->virtual)
364
365#else
366
367#define page_address(page) \
368 __va( (((page) - page_zone(page)->zone_mem_map) << PAGE_SHIFT) \
369 + page_zone(page)->zone_start_paddr)
370
371#endif
372
373extern void FASTCALL(set_page_dirty(struct page *));
374
375
376
377
378
379
380
381#define PageError(page) test_bit(PG_error, &(page)->flags)
382#define SetPageError(page) set_bit(PG_error, &(page)->flags)
383#define ClearPageError(page) clear_bit(PG_error, &(page)->flags)
384#define PageReferenced(page) test_bit(PG_referenced, &(page)->flags)
385#define SetPageReferenced(page) set_bit(PG_referenced, &(page)->flags)
386#define ClearPageReferenced(page) clear_bit(PG_referenced, &(page)->flags)
387#define PageTestandClearReferenced(page) test_and_clear_bit(PG_referenced, &(page)->flags)
388#define PageSlab(page) test_bit(PG_slab, &(page)->flags)
389#define PageSetSlab(page) set_bit(PG_slab, &(page)->flags)
390#define PageClearSlab(page) clear_bit(PG_slab, &(page)->flags)
391#define PageReserved(page) test_bit(PG_reserved, &(page)->flags)
392
393#define PageActive(page) test_bit(PG_active, &(page)->flags)
394#define SetPageActive(page) set_bit(PG_active, &(page)->flags)
395#define ClearPageActive(page) clear_bit(PG_active, &(page)->flags)
396
397#define PageLRU(page) test_bit(PG_lru, &(page)->flags)
398#define TestSetPageLRU(page) test_and_set_bit(PG_lru, &(page)->flags)
399#define TestClearPageLRU(page) test_and_clear_bit(PG_lru, &(page)->flags)
400
401#ifdef CONFIG_HIGHMEM
402#define PageHighMem(page) test_bit(PG_highmem, &(page)->flags)
403#else
404#define PageHighMem(page) 0
405#endif
406
407#define SetPageReserved(page) set_bit(PG_reserved, &(page)->flags)
408#define ClearPageReserved(page) clear_bit(PG_reserved, &(page)->flags)
409
410
411
412
413#define NOPAGE_SIGBUS (NULL)
414#define NOPAGE_OOM ((struct page *) (-1))
415
416
417extern mem_map_t * mem_map;
418
419
420
421
422
423
424
425extern struct page * FASTCALL(_alloc_pages(unsigned int gfp_mask, unsigned int order));
426extern struct page * FASTCALL(__alloc_pages(unsigned int gfp_mask, unsigned int order, zonelist_t *zonelist));
427extern struct page * alloc_pages_node(int nid, unsigned int gfp_mask, unsigned int order);
428
429static inline struct page * alloc_pages(unsigned int gfp_mask, unsigned int order)
430{
431
432
433
434 if (order >= MAX_ORDER)
435 return NULL;
436 return _alloc_pages(gfp_mask, order);
437}
438
439#define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0)
440
441extern unsigned long FASTCALL(__get_free_pages(unsigned int gfp_mask, unsigned int order));
442extern unsigned long FASTCALL(get_zeroed_page(unsigned int gfp_mask));
443
444#define __get_free_page(gfp_mask) \
445 __get_free_pages((gfp_mask),0)
446
447#define __get_dma_pages(gfp_mask, order) \
448 __get_free_pages((gfp_mask) | GFP_DMA,(order))
449
450
451
452
453#define get_free_page get_zeroed_page
454
455
456
457
458extern void FASTCALL(__free_pages(struct page *page, unsigned int order));
459extern void FASTCALL(free_pages(unsigned long addr, unsigned int order));
460
461#define __free_page(page) __free_pages((page), 0)
462#define free_page(addr) free_pages((addr),0)
463
464extern void show_free_areas(void);
465extern void show_free_areas_node(pg_data_t *pgdat);
466
467extern void clear_page_tables(struct mm_struct *, unsigned long, int);
468
469extern int fail_writepage(struct page *);
470struct page * shmem_nopage(struct vm_area_struct * vma, unsigned long address, int unused);
471struct file *shmem_file_setup(char * name, loff_t size);
472extern void shmem_lock(struct file * file, int lock);
473extern int shmem_zero_setup(struct vm_area_struct *);
474
475extern void zap_page_range(struct mm_struct *mm, unsigned long address, unsigned long size);
476extern int copy_page_range(struct mm_struct *dst, struct mm_struct *src, struct vm_area_struct *vma);
477extern int remap_page_range(unsigned long from, unsigned long to, unsigned long size, pgprot_t prot);
478extern int zeromap_page_range(unsigned long from, unsigned long size, pgprot_t prot);
479
480extern int vmtruncate(struct inode * inode, loff_t offset);
481extern pmd_t *FASTCALL(__pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address));
482extern pte_t *FASTCALL(pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address));
483extern int handle_mm_fault(struct mm_struct *mm,struct vm_area_struct *vma, unsigned long address, int write_access);
484extern int make_pages_present(unsigned long addr, unsigned long end);
485extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write);
486extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char *dst, int len);
487extern int ptrace_writedata(struct task_struct *tsk, char * src, unsigned long dst, int len);
488extern int ptrace_attach(struct task_struct *tsk);
489extern int ptrace_detach(struct task_struct *, unsigned int);
490extern void ptrace_disable(struct task_struct *);
491extern int ptrace_check_attach(struct task_struct *task, int kill);
492
493int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, unsigned long start,
494 int len, int write, int force, struct page **pages, struct vm_area_struct **vmas);
495
496
497
498
499
500
501static inline pmd_t *pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
502{
503 if (pgd_none(*pgd))
504 return __pmd_alloc(mm, pgd, address);
505 return pmd_offset(pgd, address);
506}
507
508extern int pgt_cache_water[2];
509extern int check_pgt_cache(void);
510
511extern void free_area_init(unsigned long * zones_size);
512extern void free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap,
513 unsigned long * zones_size, unsigned long zone_start_paddr,
514 unsigned long *zholes_size);
515extern void mem_init(void);
516extern void show_mem(void);
517extern void si_meminfo(struct sysinfo * val);
518extern void swapin_readahead(swp_entry_t);
519
520extern struct address_space swapper_space;
521#define PageSwapCache(page) ((page)->mapping == &swapper_space)
522
523static inline int is_page_cache_freeable(struct page * page)
524{
525 return page_count(page) - !!page->buffers == 1;
526}
527
528extern int can_share_swap_page(struct page *);
529extern int remove_exclusive_swap_page(struct page *);
530
531extern void __free_pte(pte_t);
532
533
534extern void lock_vma_mappings(struct vm_area_struct *);
535extern void unlock_vma_mappings(struct vm_area_struct *);
536extern void insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
537extern void __insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
538extern void build_mmap_rb(struct mm_struct *);
539extern void exit_mmap(struct mm_struct *);
540
541extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
542
543extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
544 unsigned long len, unsigned long prot,
545 unsigned long flag, unsigned long pgoff);
546
547static inline unsigned long do_mmap(struct file *file, unsigned long addr,
548 unsigned long len, unsigned long prot,
549 unsigned long flag, unsigned long offset)
550{
551 unsigned long ret = -EINVAL;
552 if ((offset + PAGE_ALIGN(len)) < offset)
553 goto out;
554 if (!(offset & ~PAGE_MASK))
555 ret = do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT);
556out:
557 return ret;
558}
559
560extern int do_munmap(struct mm_struct *, unsigned long, size_t);
561
562extern unsigned long do_brk(unsigned long, unsigned long);
563
564static inline void __vma_unlink(struct mm_struct * mm, struct vm_area_struct * vma, struct vm_area_struct * prev)
565{
566 prev->vm_next = vma->vm_next;
567 rb_erase(&vma->vm_rb, &mm->mm_rb);
568 if (mm->mmap_cache == vma)
569 mm->mmap_cache = prev;
570}
571
572static inline int can_vma_merge(struct vm_area_struct * vma, unsigned long vm_flags)
573{
574 if (!vma->vm_file && vma->vm_flags == vm_flags)
575 return 1;
576 else
577 return 0;
578}
579
580struct zone_t;
581
582extern void remove_inode_page(struct page *);
583extern unsigned long page_unuse(struct page *);
584extern void truncate_inode_pages(struct address_space *, loff_t);
585
586
587extern int filemap_sync(struct vm_area_struct *, unsigned long, size_t, unsigned int);
588extern struct page *filemap_nopage(struct vm_area_struct *, unsigned long, int);
589
590
591
592
593
594#define __GFP_DMA 0x01
595#define __GFP_HIGHMEM 0x02
596
597
598#define __GFP_WAIT 0x10
599#define __GFP_HIGH 0x20
600#define __GFP_IO 0x40
601#define __GFP_HIGHIO 0x80
602#define __GFP_FS 0x100
603
604#define GFP_NOHIGHIO (__GFP_HIGH | __GFP_WAIT | __GFP_IO)
605#define GFP_NOIO (__GFP_HIGH | __GFP_WAIT)
606#define GFP_NOFS (__GFP_HIGH | __GFP_WAIT | __GFP_IO | __GFP_HIGHIO)
607#define GFP_ATOMIC (__GFP_HIGH)
608#define GFP_USER ( __GFP_WAIT | __GFP_IO | __GFP_HIGHIO | __GFP_FS)
609#define GFP_HIGHUSER ( __GFP_WAIT | __GFP_IO | __GFP_HIGHIO | __GFP_FS | __GFP_HIGHMEM)
610#define GFP_KERNEL (__GFP_HIGH | __GFP_WAIT | __GFP_IO | __GFP_HIGHIO | __GFP_FS)
611#define GFP_NFS (__GFP_HIGH | __GFP_WAIT | __GFP_IO | __GFP_HIGHIO | __GFP_FS)
612#define GFP_KSWAPD ( __GFP_WAIT | __GFP_IO | __GFP_HIGHIO | __GFP_FS)
613
614
615
616
617#define GFP_DMA __GFP_DMA
618
619static inline unsigned int pf_gfp_mask(unsigned int gfp_mask)
620{
621
622 if (current->flags & PF_NOIO)
623 gfp_mask &= ~(__GFP_IO | __GFP_HIGHIO | __GFP_FS);
624
625 return gfp_mask;
626}
627
628
629
630static inline int expand_stack(struct vm_area_struct * vma, unsigned long address)
631{
632 unsigned long grow;
633
634
635
636
637
638
639 address &= PAGE_MASK;
640 spin_lock(&vma->vm_mm->page_table_lock);
641 grow = (vma->vm_start - address) >> PAGE_SHIFT;
642 if (vma->vm_end - address > current->rlim[RLIMIT_STACK].rlim_cur ||
643 ((vma->vm_mm->total_vm + grow) << PAGE_SHIFT) > current->rlim[RLIMIT_AS].rlim_cur) {
644 spin_unlock(&vma->vm_mm->page_table_lock);
645 return -ENOMEM;
646 }
647 vma->vm_start = address;
648 vma->vm_pgoff -= grow;
649 vma->vm_mm->total_vm += grow;
650 if (vma->vm_flags & VM_LOCKED)
651 vma->vm_mm->locked_vm += grow;
652 spin_unlock(&vma->vm_mm->page_table_lock);
653 return 0;
654}
655
656
657extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr);
658extern struct vm_area_struct * find_vma_prev(struct mm_struct * mm, unsigned long addr,
659 struct vm_area_struct **pprev);
660
661
662
663static inline struct vm_area_struct * find_vma_intersection(struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr)
664{
665 struct vm_area_struct * vma = find_vma(mm,start_addr);
666
667 if (vma && end_addr <= vma->vm_start)
668 vma = NULL;
669 return vma;
670}
671
672extern struct vm_area_struct *find_extend_vma(struct mm_struct *mm, unsigned long addr);
673
674extern struct page * vmalloc_to_page(void *addr);
675
676#endif
677
678#endif
679