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