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