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