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