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/gfp.h>
11#include <linux/list.h>
12#include <linux/mmzone.h>
13#include <linux/rbtree.h>
14#include <linux/prio_tree.h>
15#include <linux/fs.h>
16
17struct mempolicy;
18struct anon_vma;
19
20#ifndef CONFIG_DISCONTIGMEM
21extern unsigned long max_mapnr;
22#endif
23
24extern unsigned long num_physpages;
25extern void * high_memory;
26extern unsigned long vmalloc_earlyreserve;
27extern int page_cluster;
28
29#include <asm/page.h>
30#include <asm/pgtable.h>
31#include <asm/processor.h>
32#include <asm/atomic.h>
33
34#ifndef MM_VM_SIZE
35#define MM_VM_SIZE(mm) TASK_SIZE
36#endif
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53struct vm_area_struct {
54 struct mm_struct * vm_mm;
55 unsigned long vm_start;
56 unsigned long vm_end;
57
58
59
60 struct vm_area_struct *vm_next;
61
62 pgprot_t vm_page_prot;
63 unsigned long vm_flags;
64
65 struct rb_node vm_rb;
66
67
68
69
70
71
72
73 union {
74 struct {
75 struct list_head list;
76 void *parent;
77 struct vm_area_struct *head;
78 } vm_set;
79
80 struct prio_tree_node prio_tree_node;
81 } shared;
82
83
84
85
86
87
88
89 struct list_head anon_vma_node;
90 struct anon_vma *anon_vma;
91
92
93 struct vm_operations_struct * vm_ops;
94
95
96 unsigned long vm_pgoff;
97
98 struct file * vm_file;
99 void * vm_private_data;
100
101#ifdef CONFIG_NUMA
102 struct mempolicy *vm_policy;
103#endif
104};
105
106
107
108
109#define VM_READ 0x00000001
110#define VM_WRITE 0x00000002
111#define VM_EXEC 0x00000004
112#define VM_SHARED 0x00000008
113
114#define VM_MAYREAD 0x00000010
115#define VM_MAYWRITE 0x00000020
116#define VM_MAYEXEC 0x00000040
117#define VM_MAYSHARE 0x00000080
118
119#define VM_GROWSDOWN 0x00000100
120#define VM_GROWSUP 0x00000200
121#define VM_SHM 0x00000400
122#define VM_DENYWRITE 0x00000800
123
124#define VM_EXECUTABLE 0x00001000
125#define VM_LOCKED 0x00002000
126#define VM_IO 0x00004000
127
128
129#define VM_SEQ_READ 0x00008000
130#define VM_RAND_READ 0x00010000
131
132#define VM_DONTCOPY 0x00020000
133#define VM_DONTEXPAND 0x00040000
134#define VM_RESERVED 0x00080000
135#define VM_ACCOUNT 0x00100000
136#define VM_HUGETLB 0x00400000
137#define VM_NONLINEAR 0x00800000
138
139#ifndef VM_STACK_DEFAULT_FLAGS
140#define VM_STACK_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS
141#endif
142
143#ifdef CONFIG_STACK_GROWSUP
144#define VM_STACK_FLAGS (VM_GROWSUP | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
145#else
146#define VM_STACK_FLAGS (VM_GROWSDOWN | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
147#endif
148
149#define VM_READHINTMASK (VM_SEQ_READ | VM_RAND_READ)
150#define VM_ClearReadHint(v) (v)->vm_flags &= ~VM_READHINTMASK
151#define VM_NormalReadHint(v) (!((v)->vm_flags & VM_READHINTMASK))
152#define VM_SequentialReadHint(v) ((v)->vm_flags & VM_SEQ_READ)
153#define VM_RandomReadHint(v) ((v)->vm_flags & VM_RAND_READ)
154
155
156
157
158
159extern pgprot_t protection_map[16];
160
161
162
163
164
165
166
167struct vm_operations_struct {
168 void (*open)(struct vm_area_struct * area);
169 void (*close)(struct vm_area_struct * area);
170 struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int *type);
171 int (*populate)(struct vm_area_struct * area, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock);
172#ifdef CONFIG_NUMA
173 int (*set_policy)(struct vm_area_struct *vma, struct mempolicy *new);
174 struct mempolicy *(*get_policy)(struct vm_area_struct *vma,
175 unsigned long addr);
176#endif
177};
178
179struct mmu_gather;
180struct inode;
181
182#ifdef ARCH_HAS_ATOMIC_UNSIGNED
183typedef unsigned page_flags_t;
184#else
185typedef unsigned long page_flags_t;
186#endif
187
188
189
190
191
192
193
194struct page {
195 page_flags_t flags;
196
197 atomic_t _count;
198 unsigned int mapcount;
199
200
201
202
203 unsigned long private;
204
205
206
207
208 struct address_space *mapping;
209
210
211
212
213
214 pgoff_t index;
215 struct list_head lru;
216
217
218
219
220
221
222
223
224
225
226
227
228#if defined(WANT_PAGE_VIRTUAL)
229 void *virtual;
230
231#endif
232};
233
234
235
236
237
238#include <linux/page-flags.h>
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#define put_page_testzero(p) \
267 ({ \
268 BUG_ON(page_count(p) == 0); \
269 atomic_add_negative(-1, &(p)->_count); \
270 })
271
272
273
274
275
276#define get_page_testone(p) atomic_inc_and_test(&(p)->_count)
277
278#define set_page_count(p,v) atomic_set(&(p)->_count, v - 1)
279#define __put_page(p) atomic_dec(&(p)->_count)
280
281extern void FASTCALL(__page_cache_release(struct page *));
282
283#ifdef CONFIG_HUGETLB_PAGE
284
285static inline int page_count(struct page *p)
286{
287 if (PageCompound(p))
288 p = (struct page *)p->private;
289 return atomic_read(&(p)->_count) + 1;
290}
291
292static inline void get_page(struct page *page)
293{
294 if (unlikely(PageCompound(page)))
295 page = (struct page *)page->private;
296 atomic_inc(&page->_count);
297}
298
299void put_page(struct page *page);
300
301#else
302
303#define page_count(p) (atomic_read(&(p)->_count) + 1)
304
305static inline void get_page(struct page *page)
306{
307 atomic_inc(&page->_count);
308}
309
310static inline void put_page(struct page *page)
311{
312 if (!PageReserved(page) && put_page_testzero(page))
313 __page_cache_release(page);
314}
315
316#endif
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373#define NODEZONE_SHIFT (sizeof(page_flags_t)*8 - MAX_NODES_SHIFT - MAX_ZONES_SHIFT)
374#define NODEZONE(node, zone) ((node << ZONES_SHIFT) | zone)
375
376static inline unsigned long page_zonenum(struct page *page)
377{
378 return (page->flags >> NODEZONE_SHIFT) & (~(~0UL << ZONES_SHIFT));
379}
380static inline unsigned long page_to_nid(struct page *page)
381{
382 return (page->flags >> (NODEZONE_SHIFT + ZONES_SHIFT));
383}
384
385struct zone;
386extern struct zone *zone_table[];
387
388static inline struct zone *page_zone(struct page *page)
389{
390 return zone_table[page->flags >> NODEZONE_SHIFT];
391}
392
393static inline void set_page_zone(struct page *page, unsigned long nodezone_num)
394{
395 page->flags &= ~(~0UL << NODEZONE_SHIFT);
396 page->flags |= nodezone_num << NODEZONE_SHIFT;
397}
398
399#ifndef CONFIG_DISCONTIGMEM
400
401extern struct page *mem_map;
402#endif
403
404static inline void *lowmem_page_address(struct page *page)
405{
406 return __va(page_to_pfn(page) << PAGE_SHIFT);
407}
408
409#if defined(CONFIG_HIGHMEM) && !defined(WANT_PAGE_VIRTUAL)
410#define HASHED_PAGE_VIRTUAL
411#endif
412
413#if defined(WANT_PAGE_VIRTUAL)
414#define page_address(page) ((page)->virtual)
415#define set_page_address(page, address) \
416 do { \
417 (page)->virtual = (address); \
418 } while(0)
419#define page_address_init() do { } while(0)
420#endif
421
422#if defined(HASHED_PAGE_VIRTUAL)
423void *page_address(struct page *page);
424void set_page_address(struct page *page, void *virtual);
425void page_address_init(void);
426#endif
427
428#if !defined(HASHED_PAGE_VIRTUAL) && !defined(WANT_PAGE_VIRTUAL)
429#define page_address(page) lowmem_page_address(page)
430#define set_page_address(page, address) do { } while(0)
431#define page_address_init() do { } while(0)
432#endif
433
434
435
436
437
438
439
440
441
442extern struct address_space swapper_space;
443static inline struct address_space *page_mapping(struct page *page)
444{
445 struct address_space *mapping = NULL;
446
447 if (unlikely(PageSwapCache(page)))
448 mapping = &swapper_space;
449 else if (likely(!PageAnon(page)))
450 mapping = page->mapping;
451 return mapping;
452}
453
454
455
456
457
458static inline pgoff_t page_index(struct page *page)
459{
460 if (unlikely(PageSwapCache(page)))
461 return page->private;
462 return page->index;
463}
464
465
466
467
468static inline int page_mapped(struct page *page)
469{
470 return page->mapcount != 0;
471}
472
473
474
475
476#define NOPAGE_SIGBUS (NULL)
477#define NOPAGE_OOM ((struct page *) (-1))
478
479
480
481
482
483
484#define VM_FAULT_OOM (-1)
485#define VM_FAULT_SIGBUS 0
486#define VM_FAULT_MINOR 1
487#define VM_FAULT_MAJOR 2
488
489#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK)
490
491extern void show_free_areas(void);
492
493struct page *shmem_nopage(struct vm_area_struct * vma,
494 unsigned long address, int *type);
495int shmem_set_policy(struct vm_area_struct *vma, struct mempolicy *new);
496struct mempolicy *shmem_get_policy(struct vm_area_struct *vma,
497 unsigned long addr);
498struct file *shmem_file_setup(char * name, loff_t size, unsigned long flags);
499void shmem_lock(struct file * file, int lock);
500int shmem_zero_setup(struct vm_area_struct *);
501
502
503
504
505struct zap_details {
506 struct vm_area_struct *nonlinear_vma;
507 struct address_space *check_mapping;
508 pgoff_t first_index;
509 pgoff_t last_index;
510 int atomic;
511};
512
513void zap_page_range(struct vm_area_struct *vma, unsigned long address,
514 unsigned long size, struct zap_details *);
515int unmap_vmas(struct mmu_gather **tlbp, struct mm_struct *mm,
516 struct vm_area_struct *start_vma, unsigned long start_addr,
517 unsigned long end_addr, unsigned long *nr_accounted,
518 struct zap_details *);
519void clear_page_tables(struct mmu_gather *tlb, unsigned long first, int nr);
520int copy_page_range(struct mm_struct *dst, struct mm_struct *src,
521 struct vm_area_struct *vma);
522int zeromap_page_range(struct vm_area_struct *vma, unsigned long from,
523 unsigned long size, pgprot_t prot);
524void unmap_mapping_range(struct address_space *mapping,
525 loff_t const holebegin, loff_t const holelen, int even_cows);
526
527static inline void unmap_shared_mapping_range(struct address_space *mapping,
528 loff_t const holebegin, loff_t const holelen)
529{
530 unmap_mapping_range(mapping, holebegin, holelen, 0);
531}
532
533extern int vmtruncate(struct inode * inode, loff_t offset);
534extern pmd_t *FASTCALL(__pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address));
535extern pte_t *FASTCALL(pte_alloc_kernel(struct mm_struct *mm, pmd_t *pmd, unsigned long address));
536extern pte_t *FASTCALL(pte_alloc_map(struct mm_struct *mm, pmd_t *pmd, unsigned long address));
537extern int install_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, struct page *page, pgprot_t prot);
538extern int install_file_pte(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, unsigned long pgoff, pgprot_t prot);
539extern int handle_mm_fault(struct mm_struct *mm,struct vm_area_struct *vma, unsigned long address, int write_access);
540extern int make_pages_present(unsigned long addr, unsigned long end);
541extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write);
542void install_arg_page(struct vm_area_struct *, struct page *, unsigned long);
543
544int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, unsigned long start,
545 int len, int write, int force, struct page **pages, struct vm_area_struct **vmas);
546
547int __set_page_dirty_buffers(struct page *page);
548int __set_page_dirty_nobuffers(struct page *page);
549int redirty_page_for_writepage(struct writeback_control *wbc,
550 struct page *page);
551int FASTCALL(set_page_dirty(struct page *page));
552int set_page_dirty_lock(struct page *page);
553int clear_page_dirty_for_io(struct page *page);
554
555
556
557
558
559
560
561
562
563
564
565
566typedef int (*shrinker_t)(int nr_to_scan, unsigned int gfp_mask);
567
568
569
570
571
572
573#define DEFAULT_SEEKS 2
574struct shrinker;
575extern struct shrinker *set_shrinker(int, shrinker_t);
576extern void remove_shrinker(struct shrinker *shrinker);
577
578
579
580
581
582
583static inline pmd_t *pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
584{
585 if (pgd_none(*pgd))
586 return __pmd_alloc(mm, pgd, address);
587 return pmd_offset(pgd, address);
588}
589
590extern void free_area_init(unsigned long * zones_size);
591extern void free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap,
592 unsigned long * zones_size, unsigned long zone_start_pfn,
593 unsigned long *zholes_size);
594extern void memmap_init_zone(struct page *, unsigned long, int,
595 unsigned long, unsigned long);
596extern void mem_init(void);
597extern void show_mem(void);
598extern void si_meminfo(struct sysinfo * val);
599extern void si_meminfo_node(struct sysinfo *val, int nid);
600
601static inline void vma_prio_tree_init(struct vm_area_struct *vma)
602{
603 vma->shared.vm_set.list.next = NULL;
604 vma->shared.vm_set.list.prev = NULL;
605 vma->shared.vm_set.parent = NULL;
606 vma->shared.vm_set.head = NULL;
607}
608
609
610void vma_prio_tree_add(struct vm_area_struct *, struct vm_area_struct *old);
611void vma_prio_tree_insert(struct vm_area_struct *, struct prio_tree_root *);
612void vma_prio_tree_remove(struct vm_area_struct *, struct prio_tree_root *);
613struct vm_area_struct *vma_prio_tree_next(
614 struct vm_area_struct *, struct prio_tree_root *,
615 struct prio_tree_iter *, pgoff_t begin, pgoff_t end);
616
617
618extern void vma_adjust(struct vm_area_struct *vma, unsigned long start,
619 unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert);
620extern struct vm_area_struct *vma_merge(struct mm_struct *,
621 struct vm_area_struct *prev, unsigned long addr, unsigned long end,
622 unsigned long vm_flags, struct anon_vma *, struct file *, pgoff_t,
623 struct mempolicy *);
624extern struct anon_vma *find_mergeable_anon_vma(struct vm_area_struct *);
625extern int split_vma(struct mm_struct *,
626 struct vm_area_struct *, unsigned long addr, int new_below);
627extern void insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
628extern void __vma_link_rb(struct mm_struct *, struct vm_area_struct *,
629 struct rb_node **, struct rb_node *);
630extern struct vm_area_struct *copy_vma(struct vm_area_struct **,
631 unsigned long addr, unsigned long len, pgoff_t pgoff);
632extern void exit_mmap(struct mm_struct *);
633
634extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
635
636extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
637 unsigned long len, unsigned long prot,
638 unsigned long flag, unsigned long pgoff);
639
640static inline unsigned long do_mmap(struct file *file, unsigned long addr,
641 unsigned long len, unsigned long prot,
642 unsigned long flag, unsigned long offset)
643{
644 unsigned long ret = -EINVAL;
645 if ((offset + PAGE_ALIGN(len)) < offset)
646 goto out;
647 if (!(offset & ~PAGE_MASK))
648 ret = do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT);
649out:
650 return ret;
651}
652
653extern int do_munmap(struct mm_struct *, unsigned long, size_t);
654
655extern unsigned long do_brk(unsigned long, unsigned long);
656
657
658extern unsigned long page_unuse(struct page *);
659extern void truncate_inode_pages(struct address_space *, loff_t);
660
661
662struct page *filemap_nopage(struct vm_area_struct *, unsigned long, int *);
663
664
665int write_one_page(struct page *page, int wait);
666
667
668#define VM_MAX_READAHEAD 128
669#define VM_MIN_READAHEAD 16
670
671int do_page_cache_readahead(struct address_space *mapping, struct file *filp,
672 unsigned long offset, unsigned long nr_to_read);
673int force_page_cache_readahead(struct address_space *mapping, struct file *filp,
674 unsigned long offset, unsigned long nr_to_read);
675void page_cache_readahead(struct address_space *mapping,
676 struct file_ra_state *ra,
677 struct file *filp,
678 unsigned long offset);
679void handle_ra_miss(struct address_space *mapping,
680 struct file_ra_state *ra, pgoff_t offset);
681unsigned long max_sane_readahead(unsigned long nr);
682
683
684extern int expand_stack(struct vm_area_struct * vma, unsigned long address);
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
702static inline unsigned long vma_pages(struct vm_area_struct *vma)
703{
704 return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
705}
706
707extern struct vm_area_struct *find_extend_vma(struct mm_struct *mm, unsigned long addr);
708
709extern struct page * vmalloc_to_page(void *addr);
710extern struct page * follow_page(struct mm_struct *mm, unsigned long address,
711 int write);
712extern int remap_page_range(struct vm_area_struct *vma, unsigned long from,
713 unsigned long to, unsigned long size, pgprot_t prot);
714
715#ifndef CONFIG_DEBUG_PAGEALLOC
716static inline void
717kernel_map_pages(struct page *page, int numpages, int enable)
718{
719}
720#endif
721
722#ifndef CONFIG_ARCH_GATE_AREA
723extern struct vm_area_struct *get_gate_vma(struct task_struct *tsk);
724int in_gate_area(struct task_struct *task, unsigned long addr);
725#endif
726
727#endif
728#endif
729