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