1#ifndef _LINUX_MM_H
2#define _LINUX_MM_H
3
4#include <linux/errno.h>
5
6#ifdef __KERNEL__
7
8#include <linux/gfp.h>
9#include <linux/list.h>
10#include <linux/mmzone.h>
11#include <linux/rbtree.h>
12#include <linux/prio_tree.h>
13#include <linux/mutex.h>
14#include <linux/debug_locks.h>
15#include <linux/backing-dev.h>
16#include <linux/mm_types.h>
17
18struct mempolicy;
19struct anon_vma;
20struct file_ra_state;
21struct user_struct;
22struct writeback_control;
23
24#ifndef CONFIG_DISCONTIGMEM
25extern unsigned long max_mapnr;
26#endif
27
28extern unsigned long num_physpages;
29extern void * high_memory;
30extern int page_cluster;
31
32#ifdef CONFIG_SYSCTL
33extern int sysctl_legacy_va_layout;
34#else
35#define sysctl_legacy_va_layout 0
36#endif
37
38#include <asm/page.h>
39#include <asm/pgtable.h>
40#include <asm/processor.h>
41
42#define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n))
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 raw_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 unsigned long vm_truncate_count;
107
108#ifndef CONFIG_MMU
109 atomic_t vm_usage;
110#endif
111#ifdef CONFIG_NUMA
112 struct mempolicy *vm_policy;
113#endif
114};
115
116extern struct kmem_cache *vm_area_cachep;
117
118
119
120
121
122
123struct vm_list_struct {
124 struct vm_list_struct *next;
125 struct vm_area_struct *vma;
126};
127
128#ifndef CONFIG_MMU
129extern struct rb_root nommu_vma_tree;
130extern struct rw_semaphore nommu_vma_sem;
131
132extern unsigned int kobjsize(const void *objp);
133#endif
134
135
136
137
138#define VM_READ 0x00000001
139#define VM_WRITE 0x00000002
140#define VM_EXEC 0x00000004
141#define VM_SHARED 0x00000008
142
143
144#define VM_MAYREAD 0x00000010
145#define VM_MAYWRITE 0x00000020
146#define VM_MAYEXEC 0x00000040
147#define VM_MAYSHARE 0x00000080
148
149#define VM_GROWSDOWN 0x00000100
150#define VM_GROWSUP 0x00000200
151#define VM_PFNMAP 0x00000400
152#define VM_DENYWRITE 0x00000800
153
154#define VM_EXECUTABLE 0x00001000
155#define VM_LOCKED 0x00002000
156#define VM_IO 0x00004000
157
158
159#define VM_SEQ_READ 0x00008000
160#define VM_RAND_READ 0x00010000
161
162#define VM_DONTCOPY 0x00020000
163#define VM_DONTEXPAND 0x00040000
164#define VM_RESERVED 0x00080000
165#define VM_ACCOUNT 0x00100000
166#define VM_HUGETLB 0x00400000
167#define VM_NONLINEAR 0x00800000
168#define VM_MAPPED_COPY 0x01000000
169#define VM_INSERTPAGE 0x02000000
170#define VM_ALWAYSDUMP 0x04000000
171
172#define VM_CAN_NONLINEAR 0x08000000
173
174#ifndef VM_STACK_DEFAULT_FLAGS
175#define VM_STACK_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS
176#endif
177
178#ifdef CONFIG_STACK_GROWSUP
179#define VM_STACK_FLAGS (VM_GROWSUP | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
180#else
181#define VM_STACK_FLAGS (VM_GROWSDOWN | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
182#endif
183
184#define VM_READHINTMASK (VM_SEQ_READ | VM_RAND_READ)
185#define VM_ClearReadHint(v) (v)->vm_flags &= ~VM_READHINTMASK
186#define VM_NormalReadHint(v) (!((v)->vm_flags & VM_READHINTMASK))
187#define VM_SequentialReadHint(v) ((v)->vm_flags & VM_SEQ_READ)
188#define VM_RandomReadHint(v) ((v)->vm_flags & VM_RAND_READ)
189
190
191
192
193
194extern pgprot_t protection_map[16];
195
196#define FAULT_FLAG_WRITE 0x01
197#define FAULT_FLAG_NONLINEAR 0x02
198
199
200
201
202
203
204
205
206
207
208
209struct vm_fault {
210 unsigned int flags;
211 pgoff_t pgoff;
212 void __user *virtual_address;
213
214 struct page *page;
215
216
217
218
219};
220
221
222
223
224
225
226struct vm_operations_struct {
227 void (*open)(struct vm_area_struct * area);
228 void (*close)(struct vm_area_struct * area);
229 int (*fault)(struct vm_area_struct *vma, struct vm_fault *vmf);
230 struct page *(*nopage)(struct vm_area_struct *area,
231 unsigned long address, int *type);
232 unsigned long (*nopfn)(struct vm_area_struct *area,
233 unsigned long address);
234
235
236
237 int (*page_mkwrite)(struct vm_area_struct *vma, struct page *page);
238#ifdef CONFIG_NUMA
239 int (*set_policy)(struct vm_area_struct *vma, struct mempolicy *new);
240 struct mempolicy *(*get_policy)(struct vm_area_struct *vma,
241 unsigned long addr);
242 int (*migrate)(struct vm_area_struct *vma, const nodemask_t *from,
243 const nodemask_t *to, unsigned long flags);
244#endif
245};
246
247struct mmu_gather;
248struct inode;
249
250#define page_private(page) ((page)->private)
251#define set_page_private(page, v) ((page)->private = (v))
252
253
254
255
256
257#include <linux/page-flags.h>
258
259#ifdef CONFIG_DEBUG_VM
260#define VM_BUG_ON(cond) BUG_ON(cond)
261#else
262#define VM_BUG_ON(condition) do { } while(0)
263#endif
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281static inline int put_page_testzero(struct page *page)
282{
283 VM_BUG_ON(atomic_read(&page->_count) == 0);
284 return atomic_dec_and_test(&page->_count);
285}
286
287
288
289
290
291static inline int get_page_unless_zero(struct page *page)
292{
293 VM_BUG_ON(PageCompound(page));
294 return atomic_inc_not_zero(&page->_count);
295}
296
297static inline struct page *compound_head(struct page *page)
298{
299 if (unlikely(PageTail(page)))
300 return page->first_page;
301 return page;
302}
303
304static inline int page_count(struct page *page)
305{
306 return atomic_read(&compound_head(page)->_count);
307}
308
309static inline void get_page(struct page *page)
310{
311 page = compound_head(page);
312 VM_BUG_ON(atomic_read(&page->_count) == 0);
313 atomic_inc(&page->_count);
314}
315
316static inline struct page *virt_to_head_page(const void *x)
317{
318 struct page *page = virt_to_page(x);
319 return compound_head(page);
320}
321
322
323
324
325
326static inline void init_page_count(struct page *page)
327{
328 atomic_set(&page->_count, 1);
329}
330
331void put_page(struct page *page);
332void put_pages_list(struct list_head *pages);
333
334void split_page(struct page *page, unsigned int order);
335
336
337
338
339
340
341typedef void compound_page_dtor(struct page *);
342
343static inline void set_compound_page_dtor(struct page *page,
344 compound_page_dtor *dtor)
345{
346 page[1].lru.next = (void *)dtor;
347}
348
349static inline compound_page_dtor *get_compound_page_dtor(struct page *page)
350{
351 return (compound_page_dtor *)page[1].lru.next;
352}
353
354static inline int compound_order(struct page *page)
355{
356 if (!PageHead(page))
357 return 0;
358 return (unsigned long)page[1].lru.prev;
359}
360
361static inline void set_compound_order(struct page *page, unsigned long order)
362{
363 page[1].lru.prev = (void *)order;
364}
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446#ifdef CONFIG_SPARSEMEM
447#define SECTIONS_WIDTH SECTIONS_SHIFT
448#else
449#define SECTIONS_WIDTH 0
450#endif
451
452#define ZONES_WIDTH ZONES_SHIFT
453
454#if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT <= FLAGS_RESERVED
455#define NODES_WIDTH NODES_SHIFT
456#else
457#define NODES_WIDTH 0
458#endif
459
460
461#define SECTIONS_PGOFF ((sizeof(unsigned long)*8) - SECTIONS_WIDTH)
462#define NODES_PGOFF (SECTIONS_PGOFF - NODES_WIDTH)
463#define ZONES_PGOFF (NODES_PGOFF - ZONES_WIDTH)
464
465
466
467
468
469#if !(NODES_WIDTH > 0 || NODES_SHIFT == 0)
470#define NODE_NOT_IN_PAGE_FLAGS
471#endif
472
473#ifndef PFN_SECTION_SHIFT
474#define PFN_SECTION_SHIFT 0
475#endif
476
477
478
479
480
481
482#define SECTIONS_PGSHIFT (SECTIONS_PGOFF * (SECTIONS_WIDTH != 0))
483#define NODES_PGSHIFT (NODES_PGOFF * (NODES_WIDTH != 0))
484#define ZONES_PGSHIFT (ZONES_PGOFF * (ZONES_WIDTH != 0))
485
486
487#ifdef NODE_NOT_IN_PAGEFLAGS
488#define ZONEID_SHIFT (SECTIONS_SHIFT + ZONES_SHIFT)
489#define ZONEID_PGOFF ((SECTIONS_PGOFF < ZONES_PGOFF)? \
490 SECTIONS_PGOFF : ZONES_PGOFF)
491#else
492#define ZONEID_SHIFT (NODES_SHIFT + ZONES_SHIFT)
493#define ZONEID_PGOFF ((NODES_PGOFF < ZONES_PGOFF)? \
494 NODES_PGOFF : ZONES_PGOFF)
495#endif
496
497#define ZONEID_PGSHIFT (ZONEID_PGOFF * (ZONEID_SHIFT != 0))
498
499#if SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH > FLAGS_RESERVED
500#error SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH > FLAGS_RESERVED
501#endif
502
503#define ZONES_MASK ((1UL << ZONES_WIDTH) - 1)
504#define NODES_MASK ((1UL << NODES_WIDTH) - 1)
505#define SECTIONS_MASK ((1UL << SECTIONS_WIDTH) - 1)
506#define ZONEID_MASK ((1UL << ZONEID_SHIFT) - 1)
507
508static inline enum zone_type page_zonenum(struct page *page)
509{
510 return (page->flags >> ZONES_PGSHIFT) & ZONES_MASK;
511}
512
513
514
515
516
517
518
519
520
521static inline int page_zone_id(struct page *page)
522{
523 return (page->flags >> ZONEID_PGSHIFT) & ZONEID_MASK;
524}
525
526static inline int zone_to_nid(struct zone *zone)
527{
528#ifdef CONFIG_NUMA
529 return zone->node;
530#else
531 return 0;
532#endif
533}
534
535#ifdef NODE_NOT_IN_PAGE_FLAGS
536extern int page_to_nid(struct page *page);
537#else
538static inline int page_to_nid(struct page *page)
539{
540 return (page->flags >> NODES_PGSHIFT) & NODES_MASK;
541}
542#endif
543
544static inline struct zone *page_zone(struct page *page)
545{
546 return &NODE_DATA(page_to_nid(page))->node_zones[page_zonenum(page)];
547}
548
549static inline unsigned long page_to_section(struct page *page)
550{
551 return (page->flags >> SECTIONS_PGSHIFT) & SECTIONS_MASK;
552}
553
554static inline void set_page_zone(struct page *page, enum zone_type zone)
555{
556 page->flags &= ~(ZONES_MASK << ZONES_PGSHIFT);
557 page->flags |= (zone & ZONES_MASK) << ZONES_PGSHIFT;
558}
559
560static inline void set_page_node(struct page *page, unsigned long node)
561{
562 page->flags &= ~(NODES_MASK << NODES_PGSHIFT);
563 page->flags |= (node & NODES_MASK) << NODES_PGSHIFT;
564}
565
566static inline void set_page_section(struct page *page, unsigned long section)
567{
568 page->flags &= ~(SECTIONS_MASK << SECTIONS_PGSHIFT);
569 page->flags |= (section & SECTIONS_MASK) << SECTIONS_PGSHIFT;
570}
571
572static inline void set_page_links(struct page *page, enum zone_type zone,
573 unsigned long node, unsigned long pfn)
574{
575 set_page_zone(page, zone);
576 set_page_node(page, node);
577 set_page_section(page, pfn_to_section_nr(pfn));
578}
579
580
581
582
583#include <linux/vmstat.h>
584
585static __always_inline void *lowmem_page_address(struct page *page)
586{
587 return __va(page_to_pfn(page) << PAGE_SHIFT);
588}
589
590#if defined(CONFIG_HIGHMEM) && !defined(WANT_PAGE_VIRTUAL)
591#define HASHED_PAGE_VIRTUAL
592#endif
593
594#if defined(WANT_PAGE_VIRTUAL)
595#define page_address(page) ((page)->virtual)
596#define set_page_address(page, address) \
597 do { \
598 (page)->virtual = (address); \
599 } while(0)
600#define page_address_init() do { } while(0)
601#endif
602
603#if defined(HASHED_PAGE_VIRTUAL)
604void *page_address(struct page *page);
605void set_page_address(struct page *page, void *virtual);
606void page_address_init(void);
607#endif
608
609#if !defined(HASHED_PAGE_VIRTUAL) && !defined(WANT_PAGE_VIRTUAL)
610#define page_address(page) lowmem_page_address(page)
611#define set_page_address(page, address) do { } while(0)
612#define page_address_init() do { } while(0)
613#endif
614
615
616
617
618
619
620
621
622
623
624#define PAGE_MAPPING_ANON 1
625
626extern struct address_space swapper_space;
627static inline struct address_space *page_mapping(struct page *page)
628{
629 struct address_space *mapping = page->mapping;
630
631 VM_BUG_ON(PageSlab(page));
632 if (unlikely(PageSwapCache(page)))
633 mapping = &swapper_space;
634#ifdef CONFIG_SLUB
635 else if (unlikely(PageSlab(page)))
636 mapping = NULL;
637#endif
638 else if (unlikely((unsigned long)mapping & PAGE_MAPPING_ANON))
639 mapping = NULL;
640 return mapping;
641}
642
643static inline int PageAnon(struct page *page)
644{
645 return ((unsigned long)page->mapping & PAGE_MAPPING_ANON) != 0;
646}
647
648
649
650
651
652static inline pgoff_t page_index(struct page *page)
653{
654 if (unlikely(PageSwapCache(page)))
655 return page_private(page);
656 return page->index;
657}
658
659
660
661
662
663
664static inline void reset_page_mapcount(struct page *page)
665{
666 atomic_set(&(page)->_mapcount, -1);
667}
668
669static inline int page_mapcount(struct page *page)
670{
671 return atomic_read(&(page)->_mapcount) + 1;
672}
673
674
675
676
677static inline int page_mapped(struct page *page)
678{
679 return atomic_read(&(page)->_mapcount) >= 0;
680}
681
682
683
684
685#define NOPAGE_SIGBUS (NULL)
686#define NOPAGE_OOM ((struct page *) (-1))
687
688
689
690
691#define NOPFN_SIGBUS ((unsigned long) -1)
692#define NOPFN_OOM ((unsigned long) -2)
693#define NOPFN_REFAULT ((unsigned long) -3)
694
695
696
697
698
699
700
701#define VM_FAULT_MINOR 0
702
703#define VM_FAULT_OOM 0x0001
704#define VM_FAULT_SIGBUS 0x0002
705#define VM_FAULT_MAJOR 0x0004
706#define VM_FAULT_WRITE 0x0008
707
708#define VM_FAULT_NOPAGE 0x0100
709#define VM_FAULT_LOCKED 0x0200
710
711#define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS)
712
713#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK)
714
715extern void show_free_areas(void);
716
717#ifdef CONFIG_SHMEM
718int shmem_set_policy(struct vm_area_struct *vma, struct mempolicy *new);
719struct mempolicy *shmem_get_policy(struct vm_area_struct *vma,
720 unsigned long addr);
721int shmem_lock(struct file *file, int lock, struct user_struct *user);
722#else
723static inline int shmem_lock(struct file *file, int lock,
724 struct user_struct *user)
725{
726 return 0;
727}
728
729static inline int shmem_set_policy(struct vm_area_struct *vma,
730 struct mempolicy *new)
731{
732 return 0;
733}
734
735static inline struct mempolicy *shmem_get_policy(struct vm_area_struct *vma,
736 unsigned long addr)
737{
738 return NULL;
739}
740#endif
741struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags);
742
743int shmem_zero_setup(struct vm_area_struct *);
744
745#ifndef CONFIG_MMU
746extern unsigned long shmem_get_unmapped_area(struct file *file,
747 unsigned long addr,
748 unsigned long len,
749 unsigned long pgoff,
750 unsigned long flags);
751#endif
752
753extern int can_do_mlock(void);
754extern int user_shm_lock(size_t, struct user_struct *);
755extern void user_shm_unlock(size_t, struct user_struct *);
756
757
758
759
760struct zap_details {
761 struct vm_area_struct *nonlinear_vma;
762 struct address_space *check_mapping;
763 pgoff_t first_index;
764 pgoff_t last_index;
765 spinlock_t *i_mmap_lock;
766 unsigned long truncate_count;
767};
768
769struct page *vm_normal_page(struct vm_area_struct *, unsigned long, pte_t);
770unsigned long zap_page_range(struct vm_area_struct *vma, unsigned long address,
771 unsigned long size, struct zap_details *);
772unsigned long unmap_vmas(struct mmu_gather **tlb,
773 struct vm_area_struct *start_vma, unsigned long start_addr,
774 unsigned long end_addr, unsigned long *nr_accounted,
775 struct zap_details *);
776void free_pgd_range(struct mmu_gather **tlb, unsigned long addr,
777 unsigned long end, unsigned long floor, unsigned long ceiling);
778void free_pgtables(struct mmu_gather **tlb, struct vm_area_struct *start_vma,
779 unsigned long floor, unsigned long ceiling);
780int copy_page_range(struct mm_struct *dst, struct mm_struct *src,
781 struct vm_area_struct *vma);
782int zeromap_page_range(struct vm_area_struct *vma, unsigned long from,
783 unsigned long size, pgprot_t prot);
784void unmap_mapping_range(struct address_space *mapping,
785 loff_t const holebegin, loff_t const holelen, int even_cows);
786
787static inline void unmap_shared_mapping_range(struct address_space *mapping,
788 loff_t const holebegin, loff_t const holelen)
789{
790 unmap_mapping_range(mapping, holebegin, holelen, 0);
791}
792
793extern int vmtruncate(struct inode * inode, loff_t offset);
794extern int vmtruncate_range(struct inode * inode, loff_t offset, loff_t end);
795
796#ifdef CONFIG_MMU
797extern int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
798 unsigned long address, int write_access);
799#else
800static inline int handle_mm_fault(struct mm_struct *mm,
801 struct vm_area_struct *vma, unsigned long address,
802 int write_access)
803{
804
805 BUG();
806 return VM_FAULT_SIGBUS;
807}
808#endif
809
810extern int make_pages_present(unsigned long addr, unsigned long end);
811extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write);
812
813int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, unsigned long start,
814 int len, int write, int force, struct page **pages, struct vm_area_struct **vmas);
815void print_bad_pte(struct vm_area_struct *, pte_t, unsigned long);
816
817extern int try_to_release_page(struct page * page, gfp_t gfp_mask);
818extern void do_invalidatepage(struct page *page, unsigned long offset);
819
820int __set_page_dirty_nobuffers(struct page *page);
821int __set_page_dirty_no_writeback(struct page *page);
822int redirty_page_for_writepage(struct writeback_control *wbc,
823 struct page *page);
824int FASTCALL(set_page_dirty(struct page *page));
825int set_page_dirty_lock(struct page *page);
826int clear_page_dirty_for_io(struct page *page);
827
828extern unsigned long move_page_tables(struct vm_area_struct *vma,
829 unsigned long old_addr, struct vm_area_struct *new_vma,
830 unsigned long new_addr, unsigned long len);
831extern unsigned long do_mremap(unsigned long addr,
832 unsigned long old_len, unsigned long new_len,
833 unsigned long flags, unsigned long new_addr);
834extern int mprotect_fixup(struct vm_area_struct *vma,
835 struct vm_area_struct **pprev, unsigned long start,
836 unsigned long end, unsigned long newflags);
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853struct shrinker {
854 int (*shrink)(int nr_to_scan, gfp_t gfp_mask);
855 int seeks;
856
857
858 struct list_head list;
859 long nr;
860};
861#define DEFAULT_SEEKS 2
862extern void register_shrinker(struct shrinker *);
863extern void unregister_shrinker(struct shrinker *);
864
865int vma_wants_writenotify(struct vm_area_struct *vma);
866
867extern pte_t *FASTCALL(get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl));
868
869#ifdef __PAGETABLE_PUD_FOLDED
870static inline int __pud_alloc(struct mm_struct *mm, pgd_t *pgd,
871 unsigned long address)
872{
873 return 0;
874}
875#else
876int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address);
877#endif
878
879#ifdef __PAGETABLE_PMD_FOLDED
880static inline int __pmd_alloc(struct mm_struct *mm, pud_t *pud,
881 unsigned long address)
882{
883 return 0;
884}
885#else
886int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address);
887#endif
888
889int __pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address);
890int __pte_alloc_kernel(pmd_t *pmd, unsigned long address);
891
892
893
894
895
896#if defined(CONFIG_MMU) && !defined(__ARCH_HAS_4LEVEL_HACK)
897static inline pud_t *pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
898{
899 return (unlikely(pgd_none(*pgd)) && __pud_alloc(mm, pgd, address))?
900 NULL: pud_offset(pgd, address);
901}
902
903static inline pmd_t *pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)
904{
905 return (unlikely(pud_none(*pud)) && __pmd_alloc(mm, pud, address))?
906 NULL: pmd_offset(pud, address);
907}
908#endif
909
910#if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS
911
912
913
914
915
916
917#define __pte_lockptr(page) &((page)->ptl)
918#define pte_lock_init(_page) do { \
919 spin_lock_init(__pte_lockptr(_page)); \
920} while (0)
921#define pte_lock_deinit(page) ((page)->mapping = NULL)
922#define pte_lockptr(mm, pmd) ({(void)(mm); __pte_lockptr(pmd_page(*(pmd)));})
923#else
924
925
926
927#define pte_lock_init(page) do {} while (0)
928#define pte_lock_deinit(page) do {} while (0)
929#define pte_lockptr(mm, pmd) ({(void)(pmd); &(mm)->page_table_lock;})
930#endif
931
932#define pte_offset_map_lock(mm, pmd, address, ptlp) \
933({ \
934 spinlock_t *__ptl = pte_lockptr(mm, pmd); \
935 pte_t *__pte = pte_offset_map(pmd, address); \
936 *(ptlp) = __ptl; \
937 spin_lock(__ptl); \
938 __pte; \
939})
940
941#define pte_unmap_unlock(pte, ptl) do { \
942 spin_unlock(ptl); \
943 pte_unmap(pte); \
944} while (0)
945
946#define pte_alloc_map(mm, pmd, address) \
947 ((unlikely(!pmd_present(*(pmd))) && __pte_alloc(mm, pmd, address))? \
948 NULL: pte_offset_map(pmd, address))
949
950#define pte_alloc_map_lock(mm, pmd, address, ptlp) \
951 ((unlikely(!pmd_present(*(pmd))) && __pte_alloc(mm, pmd, address))? \
952 NULL: pte_offset_map_lock(mm, pmd, address, ptlp))
953
954#define pte_alloc_kernel(pmd, address) \
955 ((unlikely(!pmd_present(*(pmd))) && __pte_alloc_kernel(pmd, address))? \
956 NULL: pte_offset_kernel(pmd, address))
957
958extern void free_area_init(unsigned long * zones_size);
959extern void free_area_init_node(int nid, pg_data_t *pgdat,
960 unsigned long * zones_size, unsigned long zone_start_pfn,
961 unsigned long *zholes_size);
962#ifdef CONFIG_ARCH_POPULATES_NODE_MAP
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990extern void free_area_init_nodes(unsigned long *max_zone_pfn);
991extern void add_active_range(unsigned int nid, unsigned long start_pfn,
992 unsigned long end_pfn);
993extern void shrink_active_range(unsigned int nid, unsigned long old_end_pfn,
994 unsigned long new_end_pfn);
995extern void push_node_boundaries(unsigned int nid, unsigned long start_pfn,
996 unsigned long end_pfn);
997extern void remove_all_active_ranges(void);
998extern unsigned long absent_pages_in_range(unsigned long start_pfn,
999 unsigned long end_pfn);
1000extern void get_pfn_range_for_nid(unsigned int nid,
1001 unsigned long *start_pfn, unsigned long *end_pfn);
1002extern unsigned long find_min_pfn_with_active_regions(void);
1003extern unsigned long find_max_pfn_with_active_regions(void);
1004extern void free_bootmem_with_active_regions(int nid,
1005 unsigned long max_low_pfn);
1006extern void sparse_memory_present_with_active_regions(int nid);
1007#ifndef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
1008extern int early_pfn_to_nid(unsigned long pfn);
1009#endif
1010#endif
1011extern void set_dma_reserve(unsigned long new_dma_reserve);
1012extern void memmap_init_zone(unsigned long, int, unsigned long,
1013 unsigned long, enum memmap_context);
1014extern void setup_per_zone_pages_min(void);
1015extern void mem_init(void);
1016extern void show_mem(void);
1017extern void si_meminfo(struct sysinfo * val);
1018extern void si_meminfo_node(struct sysinfo *val, int nid);
1019
1020#ifdef CONFIG_NUMA
1021extern void setup_per_cpu_pageset(void);
1022#else
1023static inline void setup_per_cpu_pageset(void) {}
1024#endif
1025
1026
1027void vma_prio_tree_add(struct vm_area_struct *, struct vm_area_struct *old);
1028void vma_prio_tree_insert(struct vm_area_struct *, struct prio_tree_root *);
1029void vma_prio_tree_remove(struct vm_area_struct *, struct prio_tree_root *);
1030struct vm_area_struct *vma_prio_tree_next(struct vm_area_struct *vma,
1031 struct prio_tree_iter *iter);
1032
1033#define vma_prio_tree_foreach(vma, iter, root, begin, end) \
1034 for (prio_tree_iter_init(iter, root, begin, end), vma = NULL; \
1035 (vma = vma_prio_tree_next(vma, iter)); )
1036
1037static inline void vma_nonlinear_insert(struct vm_area_struct *vma,
1038 struct list_head *list)
1039{
1040 vma->shared.vm_set.parent = NULL;
1041 list_add_tail(&vma->shared.vm_set.list, list);
1042}
1043
1044
1045extern int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin);
1046extern void vma_adjust(struct vm_area_struct *vma, unsigned long start,
1047 unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert);
1048extern struct vm_area_struct *vma_merge(struct mm_struct *,
1049 struct vm_area_struct *prev, unsigned long addr, unsigned long end,
1050 unsigned long vm_flags, struct anon_vma *, struct file *, pgoff_t,
1051 struct mempolicy *);
1052extern struct anon_vma *find_mergeable_anon_vma(struct vm_area_struct *);
1053extern int split_vma(struct mm_struct *,
1054 struct vm_area_struct *, unsigned long addr, int new_below);
1055extern int insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
1056extern void __vma_link_rb(struct mm_struct *, struct vm_area_struct *,
1057 struct rb_node **, struct rb_node *);
1058extern void unlink_file_vma(struct vm_area_struct *);
1059extern struct vm_area_struct *copy_vma(struct vm_area_struct **,
1060 unsigned long addr, unsigned long len, pgoff_t pgoff);
1061extern void exit_mmap(struct mm_struct *);
1062extern int may_expand_vm(struct mm_struct *mm, unsigned long npages);
1063extern int install_special_mapping(struct mm_struct *mm,
1064 unsigned long addr, unsigned long len,
1065 unsigned long flags, struct page **pages);
1066
1067extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
1068
1069extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
1070 unsigned long len, unsigned long prot,
1071 unsigned long flag, unsigned long pgoff);
1072extern unsigned long mmap_region(struct file *file, unsigned long addr,
1073 unsigned long len, unsigned long flags,
1074 unsigned int vm_flags, unsigned long pgoff,
1075 int accountable);
1076
1077static inline unsigned long do_mmap(struct file *file, unsigned long addr,
1078 unsigned long len, unsigned long prot,
1079 unsigned long flag, unsigned long offset)
1080{
1081 unsigned long ret = -EINVAL;
1082 if ((offset + PAGE_ALIGN(len)) < offset)
1083 goto out;
1084 if (!(offset & ~PAGE_MASK))
1085 ret = do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT);
1086out:
1087 return ret;
1088}
1089
1090extern int do_munmap(struct mm_struct *, unsigned long, size_t);
1091
1092extern unsigned long do_brk(unsigned long, unsigned long);
1093
1094
1095extern unsigned long page_unuse(struct page *);
1096extern void truncate_inode_pages(struct address_space *, loff_t);
1097extern void truncate_inode_pages_range(struct address_space *,
1098 loff_t lstart, loff_t lend);
1099
1100
1101extern int filemap_fault(struct vm_area_struct *, struct vm_fault *);
1102
1103
1104int write_one_page(struct page *page, int wait);
1105
1106
1107#define VM_MAX_READAHEAD 128
1108#define VM_MIN_READAHEAD 16
1109#define VM_MAX_CACHE_HIT 256
1110
1111
1112int do_page_cache_readahead(struct address_space *mapping, struct file *filp,
1113 pgoff_t offset, unsigned long nr_to_read);
1114int force_page_cache_readahead(struct address_space *mapping, struct file *filp,
1115 pgoff_t offset, unsigned long nr_to_read);
1116
1117void page_cache_sync_readahead(struct address_space *mapping,
1118 struct file_ra_state *ra,
1119 struct file *filp,
1120 pgoff_t offset,
1121 unsigned long size);
1122
1123void page_cache_async_readahead(struct address_space *mapping,
1124 struct file_ra_state *ra,
1125 struct file *filp,
1126 struct page *pg,
1127 pgoff_t offset,
1128 unsigned long size);
1129
1130unsigned long max_sane_readahead(unsigned long nr);
1131
1132
1133extern int expand_stack(struct vm_area_struct *vma, unsigned long address);
1134#ifdef CONFIG_IA64
1135extern int expand_upwards(struct vm_area_struct *vma, unsigned long address);
1136#endif
1137extern int expand_stack_downwards(struct vm_area_struct *vma,
1138 unsigned long address);
1139
1140
1141extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr);
1142extern struct vm_area_struct * find_vma_prev(struct mm_struct * mm, unsigned long addr,
1143 struct vm_area_struct **pprev);
1144
1145
1146
1147static inline struct vm_area_struct * find_vma_intersection(struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr)
1148{
1149 struct vm_area_struct * vma = find_vma(mm,start_addr);
1150
1151 if (vma && end_addr <= vma->vm_start)
1152 vma = NULL;
1153 return vma;
1154}
1155
1156static inline unsigned long vma_pages(struct vm_area_struct *vma)
1157{
1158 return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
1159}
1160
1161pgprot_t vm_get_page_prot(unsigned long vm_flags);
1162struct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr);
1163struct page *vmalloc_to_page(void *addr);
1164unsigned long vmalloc_to_pfn(void *addr);
1165int remap_pfn_range(struct vm_area_struct *, unsigned long addr,
1166 unsigned long pfn, unsigned long size, pgprot_t);
1167int vm_insert_page(struct vm_area_struct *, unsigned long addr, struct page *);
1168int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr,
1169 unsigned long pfn);
1170
1171struct page *follow_page(struct vm_area_struct *, unsigned long address,
1172 unsigned int foll_flags);
1173#define FOLL_WRITE 0x01
1174#define FOLL_TOUCH 0x02
1175#define FOLL_GET 0x04
1176#define FOLL_ANON 0x08
1177
1178typedef int (*pte_fn_t)(pte_t *pte, struct page *pmd_page, unsigned long addr,
1179 void *data);
1180extern int apply_to_page_range(struct mm_struct *mm, unsigned long address,
1181 unsigned long size, pte_fn_t fn, void *data);
1182
1183#ifdef CONFIG_PROC_FS
1184void vm_stat_account(struct mm_struct *, unsigned long, struct file *, long);
1185#else
1186static inline void vm_stat_account(struct mm_struct *mm,
1187 unsigned long flags, struct file *file, long pages)
1188{
1189}
1190#endif
1191
1192#ifndef CONFIG_DEBUG_PAGEALLOC
1193static inline void
1194kernel_map_pages(struct page *page, int numpages, int enable) {}
1195#endif
1196
1197extern struct vm_area_struct *get_gate_vma(struct task_struct *tsk);
1198#ifdef __HAVE_ARCH_GATE_AREA
1199int in_gate_area_no_task(unsigned long addr);
1200int in_gate_area(struct task_struct *task, unsigned long addr);
1201#else
1202int in_gate_area_no_task(unsigned long addr);
1203#define in_gate_area(task, addr) ({(void)task; in_gate_area_no_task(addr);})
1204#endif
1205
1206int drop_caches_sysctl_handler(struct ctl_table *, int, struct file *,
1207 void __user *, size_t *, loff_t *);
1208unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask,
1209 unsigned long lru_pages);
1210void drop_pagecache(void);
1211void drop_slab(void);
1212
1213#ifndef CONFIG_MMU
1214#define randomize_va_space 0
1215#else
1216extern int randomize_va_space;
1217#endif
1218
1219const char * arch_vma_name(struct vm_area_struct *vma);
1220
1221#endif
1222#endif
1223