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