mm.h revision c559cd81139f97cecad1ad91a0b2e25a5936d53
1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_MM_H 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_MM_H 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/sched.h> 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/errno.h> 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/capability.h> 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__ 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/gfp.h> 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/list.h> 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/mmzone.h> 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/rbtree.h> 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/prio_tree.h> 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/fs.h> 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/mutex.h> 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/debug_locks.h> 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mempolicy; 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct anon_vma; 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef CONFIG_DISCONTIGMEM /* Don't use mapnrs, do it properly */ 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long max_mapnr; 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long num_physpages; 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void * high_memory; 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long vmalloc_earlyreserve; 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int page_cluster; 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SYSCTL 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int sysctl_legacy_va_layout; 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define sysctl_legacy_va_layout 0 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/page.h> 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/pgtable.h> 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/processor.h> 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n)) 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Linux kernel virtual memory manager primitives. 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The idea being to have a "virtual" mm in the same way 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * we have a virtual fs - giving a cleaner interface to the 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * mm details, and allowing different kinds of memory mappings 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (from shared memory to executable loading to arbitrary 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * mmap() functions). 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This struct defines a memory VMM memory area. There is one of these 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * per VM-area/task. A VM area is any part of the process virtual memory 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * space that has a special rule for the page-fault handlers (ie a shared 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * library, the executable area etc). 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct vm_area_struct { 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct mm_struct * vm_mm; /* The address space we belong to. */ 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long vm_start; /* Our start address within vm_mm. */ 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long vm_end; /* The first byte after our end address 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru within vm_mm. */ 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* linked list of VM areas per task, sorted by address */ 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_area_struct *vm_next; 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pgprot_t vm_page_prot; /* Access permissions of this VMA. */ 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long vm_flags; /* Flags, listed below. */ 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct rb_node vm_rb; 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * For areas with an address space and backing store, 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * linkage into the address_space->i_mmap prio tree, or 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * linkage to the list of like vmas hanging off its node, or 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * linkage of vma in the address_space->i_mmap_nonlinear list. 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru union { 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct { 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head list; 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *parent; /* aligns with prio_tree_node parent */ 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_area_struct *head; 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } vm_set; 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct raw_prio_tree_node prio_tree_node; 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } shared; 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * list, after a COW of one of the file pages. A MAP_SHARED vma 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * or brk vma (with NULL file) can only be in an anon_vma list. 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head anon_vma_node; /* Serialized by anon_vma->lock */ 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct anon_vma *anon_vma; /* Serialized by page_table_lock */ 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Function pointers to deal with this struct. */ 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_operations_struct * vm_ops; 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Information about our backing store: */ 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru units, *not* PAGE_CACHE_SIZE */ 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct file * vm_file; /* File we map to (can be NULL). */ 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void * vm_private_data; /* was vm_pte (shared mem) */ 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long vm_truncate_count;/* truncate_count or restart_addr */ 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef CONFIG_MMU 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru atomic_t vm_usage; /* refcount (VMAs shared if !MMU) */ 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_NUMA 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct mempolicy *vm_policy; /* NUMA policy for the VMA */ 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This struct defines the per-mm list of VMAs for uClinux. If CONFIG_MMU is 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * disabled, then there's a single shared list of VMAs maintained by the 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * system, and mm's subscribe to these individually 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct vm_list_struct { 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_list_struct *next; 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_area_struct *vma; 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef CONFIG_MMU 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct rb_root nommu_vma_tree; 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct rw_semaphore nommu_vma_sem; 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned int kobjsize(const void *objp); 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * vm_flags.. 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_READ 0x00000001 /* currently active flags */ 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_WRITE 0x00000002 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_EXEC 0x00000004 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_SHARED 0x00000008 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* mprotect() hardcodes VM_MAYREAD >> 4 == VM_READ, and so for r/w/x bits. */ 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_MAYREAD 0x00000010 /* limits for mprotect() etc */ 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_MAYWRITE 0x00000020 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_MAYEXEC 0x00000040 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_MAYSHARE 0x00000080 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_GROWSDOWN 0x00000100 /* general info on the segment */ 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_GROWSUP 0x00000200 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_PFNMAP 0x00000400 /* Page-ranges managed without "struct page", just pure PFN */ 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_DENYWRITE 0x00000800 /* ETXTBSY on write attempts.. */ 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_EXECUTABLE 0x00001000 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_LOCKED 0x00002000 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_IO 0x00004000 /* Memory mapped I/O or similar */ 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Used by sys_madvise() */ 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_SEQ_READ 0x00008000 /* App will access data sequentially */ 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_RAND_READ 0x00010000 /* App will not benefit from clustered reads */ 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_DONTCOPY 0x00020000 /* Do not copy this vma on fork */ 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_DONTEXPAND 0x00040000 /* Cannot expand with mremap() */ 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_RESERVED 0x00080000 /* Count as reserved_vm like IO */ 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_ACCOUNT 0x00100000 /* Is a VM accounted object */ 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_HUGETLB 0x00400000 /* Huge TLB Page VM */ 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_NONLINEAR 0x00800000 /* Is non-linear (remap_file_pages) */ 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_MAPPED_COPY 0x01000000 /* T if mapped copy of data (nommu mmap) */ 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_INSERTPAGE 0x02000000 /* The vma has had "vm_insert_page()" done on it */ 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef VM_STACK_DEFAULT_FLAGS /* arch can override this */ 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_STACK_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_STACK_GROWSUP 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_STACK_FLAGS (VM_GROWSUP | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT) 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_STACK_FLAGS (VM_GROWSDOWN | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT) 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_READHINTMASK (VM_SEQ_READ | VM_RAND_READ) 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_ClearReadHint(v) (v)->vm_flags &= ~VM_READHINTMASK 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_NormalReadHint(v) (!((v)->vm_flags & VM_READHINTMASK)) 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_SequentialReadHint(v) ((v)->vm_flags & VM_SEQ_READ) 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_RandomReadHint(v) ((v)->vm_flags & VM_RAND_READ) 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * mapping from the currently active vm_flags protection bits (the 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * low four bits) to a page protection mask.. 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern pgprot_t protection_map[16]; 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * These are the virtual MM functions - opening of an area, closing and 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * unmapping it (needed to keep files on disk up-to-date etc), pointer 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to the functions called when a no-page or a wp-page exception occurs. 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct vm_operations_struct { 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*open)(struct vm_area_struct * area); 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*close)(struct vm_area_struct * area); 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int *type); 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*populate)(struct vm_area_struct * area, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock); 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* notification that a previously read-only page is about to become 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * writable, if an error is returned it will cause a SIGBUS */ 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*page_mkwrite)(struct vm_area_struct *vma, struct page *page); 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_NUMA 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*set_policy)(struct vm_area_struct *vma, struct mempolicy *new); 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct mempolicy *(*get_policy)(struct vm_area_struct *vma, 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long addr); 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*migrate)(struct vm_area_struct *vma, const nodemask_t *from, 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const nodemask_t *to, unsigned long flags); 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mmu_gather; 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct inode; 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Each physical page in the system has a struct page associated with 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * it to keep track of whatever it is we are using the page for at the 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * moment. Note that we have no way to track which tasks are using 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * a page. 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct page { 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flags; /* Atomic flags, some possibly 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * updated asynchronously */ 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru atomic_t _count; /* Usage count, see below. */ 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru atomic_t _mapcount; /* Count of ptes mapped in mms, 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to show when page is mapped 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * & limit reverse map searches. 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru union { 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct { 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long private; /* Mapping-private opaque data: 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * usually used for buffer_heads 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * if PagePrivate set; used for 236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * swp_entry_t if PageSwapCache; 237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * indicates order in the buddy 238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * system if PG_buddy is set. 239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct address_space *mapping; /* If low bit clear, points to 241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * inode address_space, or NULL. 242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * If page mapped as anonymous 243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * memory, low bit is set, and 244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * it points to anon_vma object: 245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * see PAGE_MAPPING_ANON below. 246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }; 248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS 249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spinlock_t ptl; 250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru }; 252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pgoff_t index; /* Our offset within mapping. */ 253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head lru; /* Pageout list, eg. active_list 254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * protected by zone->lru_lock ! 255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * On machines where all RAM is mapped into kernel address space, 258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * we can simply calculate the virtual address. On machines with 259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * highmem some memory is mapped into kernel virtual memory 260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * dynamically, so we need a place to store that address. 261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Note that this field could be 16 bits on x86 ... ;) 262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Architectures with slow multiplication can define 264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * WANT_PAGE_VIRTUAL in asm/page.h 265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(WANT_PAGE_VIRTUAL) 267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *virtual; /* Kernel virtual address (NULL if 268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru not kmapped, ie. highmem) */ 269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* WANT_PAGE_VIRTUAL */ 270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define page_private(page) ((page)->private) 273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define set_page_private(page, v) ((page)->private = (v)) 274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 276c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * FIXME: take this include out, include page-flags.h in 277c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * files which need it (119 of them) 278c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 279c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/page-flags.h> 280c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 281c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 282c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Methods to modify the page usage count. 283c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 284c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * What counts for a page usage: 285c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * - cache mapping (page->mapping) 286c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * - private data (page->private) 287c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * - page mapped in a task's page tables, each mapping 288c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * is counted separately 289c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 290c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Also, many kernel routines increase the page count before a critical 291c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * routine so they can be sure the page doesn't go away from under them. 292c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 293c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 294c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 295c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Drop a ref, return true if the logical refcount fell to zero (the page has 296c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * no users) 297c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 298c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int put_page_testzero(struct page *page) 299c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 300c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BUG_ON(atomic_read(&page->_count) == 0); 301c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return atomic_dec_and_test(&page->_count); 302c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 303c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 304c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 305c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Try to grab a ref unless the page has a refcount of zero, return false if 306c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * that is the case. 307c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 308c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int get_page_unless_zero(struct page *page) 309c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 310c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return atomic_inc_not_zero(&page->_count); 311c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 312c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 313c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(__page_cache_release(struct page *)); 314c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 315c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int page_count(struct page *page) 316c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 317c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (unlikely(PageCompound(page))) 318c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru page = (struct page *)page_private(page); 319c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return atomic_read(&page->_count); 320c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 321c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 322c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void get_page(struct page *page) 323c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 324c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (unlikely(PageCompound(page))) 325c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru page = (struct page *)page_private(page); 326c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru atomic_inc(&page->_count); 327c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 328c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 329c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 330c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Setup the page count before being freed into the page allocator for 331c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the first time (boot or memory hotplug) 332c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 333c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void init_page_count(struct page *page) 334c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 335c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru atomic_set(&page->_count, 1); 336c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 337c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 338c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid put_page(struct page *page); 339c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid put_pages_list(struct list_head *pages); 340c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 341c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid split_page(struct page *page, unsigned int order); 342c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 343c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 344c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Multiple processes may "see" the same page. E.g. for untouched 345c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * mappings of /dev/null, all processes see the same page full of 346c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * zeroes, and text pages of executables and shared libraries have 347c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * only one copy in memory, at most, normally. 348c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 349c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * For the non-reserved pages, page_count(page) denotes a reference count. 350c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * page_count() == 0 means the page is free. page->lru is then used for 351c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * freelist management in the buddy allocator. 352c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * page_count() == 1 means the page is used for exactly one purpose 353c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (e.g. a private data page of one process). 354c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 355c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * A page may be used for kmalloc() or anyone else who does a 356c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * __get_free_page(). In this case the page_count() is at least 1, and 357c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * all other fields are unused but should be 0 or NULL. The 358c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * management of this page is the responsibility of the one who uses 359c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * it. 360c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 361c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The other pages (we may call them "process pages") are completely 362c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * managed by the Linux memory manager: I/O, buffers, swapping etc. 363c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The following discussion applies only to them. 364c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 365c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * A page may belong to an inode's memory mapping. In this case, 366c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * page->mapping is the pointer to the inode, and page->index is the 367c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * file offset of the page, in units of PAGE_CACHE_SIZE. 368c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 369c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * A page contains an opaque `private' member, which belongs to the 370c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * page's address_space. Usually, this is the address of a circular 371c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * list of the page's disk buffers. 372c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 373c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * For pages belonging to inodes, the page_count() is the number of 374c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * attaches, plus 1 if `private' contains something, plus one for 375c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the page cache itself. 376c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 377c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Instead of keeping dirty/clean pages in per address-space lists, we instead 378c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * now tag pages as dirty/under writeback in the radix tree. 379c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 380c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * There is also a per-mapping radix tree mapping index to the page 381c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * in memory if present. The tree is rooted at mapping->root. 382c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 383c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * All process pages can do I/O: 384c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * - inode pages may need to be read from disk, 385c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * - inode pages which have been modified and are MAP_SHARED may need 386c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to be written to disk, 387c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * - private pages which have been modified may need to be swapped out 388c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to swap space and (later) to be read back into memory. 389c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 390c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 391c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 392c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The zone field is never updated after free_area_init_core() 393c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * sets it, so none of the operations on it need to be atomic. 394c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 395c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 396c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 397c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 398c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * page->flags layout: 399c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 400c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * There are three possibilities for how page->flags get 401c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * laid out. The first is for the normal case, without 402c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * sparsemem. The second is for sparsemem when there is 403c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * plenty of space for node and section. The last is when 404c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * we have run out of space and have to fall back to an 405c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * alternate (slower) way of determining the node. 406c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 407c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * No sparsemem: | NODE | ZONE | ... | FLAGS | 408c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * with space for node: | SECTION | NODE | ZONE | ... | FLAGS | 409c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * no space for node: | SECTION | ZONE | ... | FLAGS | 410c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 411c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SPARSEMEM 412c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SECTIONS_WIDTH SECTIONS_SHIFT 413c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 414c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SECTIONS_WIDTH 0 415c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 416c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 417c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ZONES_WIDTH ZONES_SHIFT 418c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 419c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if SECTIONS_WIDTH+ZONES_WIDTH+NODES_SHIFT <= FLAGS_RESERVED 420c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NODES_WIDTH NODES_SHIFT 421c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 422c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NODES_WIDTH 0 423c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 424c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 425c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Page flags: | [SECTION] | [NODE] | ZONE | ... | FLAGS | */ 426c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SECTIONS_PGOFF ((sizeof(unsigned long)*8) - SECTIONS_WIDTH) 427c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NODES_PGOFF (SECTIONS_PGOFF - NODES_WIDTH) 428c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ZONES_PGOFF (NODES_PGOFF - ZONES_WIDTH) 429c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 430c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 431c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * We are going to use the flags for the page to node mapping if its in 432c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * there. This includes the case where there is no node, so it is implicit. 433c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 434c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define FLAGS_HAS_NODE (NODES_WIDTH > 0 || NODES_SHIFT == 0) 435c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 436c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef PFN_SECTION_SHIFT 437c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PFN_SECTION_SHIFT 0 438c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 439c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 440c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 441c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Define the bit shifts to access each section. For non-existant 442c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * sections we define the shift as 0; that plus a 0 mask ensures 443c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the compiler will optimise away reference to them. 444c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 445c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SECTIONS_PGSHIFT (SECTIONS_PGOFF * (SECTIONS_WIDTH != 0)) 446c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NODES_PGSHIFT (NODES_PGOFF * (NODES_WIDTH != 0)) 447c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ZONES_PGSHIFT (ZONES_PGOFF * (ZONES_WIDTH != 0)) 448c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 449c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* NODE:ZONE or SECTION:ZONE is used to lookup the zone from a page. */ 450c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if FLAGS_HAS_NODE 451c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ZONETABLE_SHIFT (NODES_SHIFT + ZONES_SHIFT) 452c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 453c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ZONETABLE_SHIFT (SECTIONS_SHIFT + ZONES_SHIFT) 454c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 455c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ZONETABLE_PGSHIFT ZONES_PGSHIFT 456c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 457c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH > FLAGS_RESERVED 458c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#error SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH > FLAGS_RESERVED 459c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 460c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 461c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ZONES_MASK ((1UL << ZONES_WIDTH) - 1) 462c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NODES_MASK ((1UL << NODES_WIDTH) - 1) 463c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SECTIONS_MASK ((1UL << SECTIONS_WIDTH) - 1) 464c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define ZONETABLE_MASK ((1UL << ZONETABLE_SHIFT) - 1) 465c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 466c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned long page_zonenum(struct page *page) 467c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 468c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (page->flags >> ZONES_PGSHIFT) & ZONES_MASK; 469c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 470c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 471c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct zone; 472c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct zone *zone_table[]; 473c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 474c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int page_zone_id(struct page *page) 475c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 476c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (page->flags >> ZONETABLE_PGSHIFT) & ZONETABLE_MASK; 477c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 478c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct zone *page_zone(struct page *page) 479c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 480c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return zone_table[page_zone_id(page)]; 481c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 482c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 483c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned long page_to_nid(struct page *page) 484c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 485c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (FLAGS_HAS_NODE) 486c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (page->flags >> NODES_PGSHIFT) & NODES_MASK; 487c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else 488c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return page_zone(page)->zone_pgdat->node_id; 489c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 490c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned long page_to_section(struct page *page) 491c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 492c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (page->flags >> SECTIONS_PGSHIFT) & SECTIONS_MASK; 493c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 494c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 495c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void set_page_zone(struct page *page, unsigned long zone) 496c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 497c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru page->flags &= ~(ZONES_MASK << ZONES_PGSHIFT); 498c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru page->flags |= (zone & ZONES_MASK) << ZONES_PGSHIFT; 499c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 500c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void set_page_node(struct page *page, unsigned long node) 501c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 502c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru page->flags &= ~(NODES_MASK << NODES_PGSHIFT); 503c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru page->flags |= (node & NODES_MASK) << NODES_PGSHIFT; 504c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 505c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void set_page_section(struct page *page, unsigned long section) 506c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 507c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru page->flags &= ~(SECTIONS_MASK << SECTIONS_PGSHIFT); 508c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru page->flags |= (section & SECTIONS_MASK) << SECTIONS_PGSHIFT; 509c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 510c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 511c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void set_page_links(struct page *page, unsigned long zone, 512c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long node, unsigned long pfn) 513c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 514c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru set_page_zone(page, zone); 515c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru set_page_node(page, node); 516c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru set_page_section(page, pfn_to_section_nr(pfn)); 517c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 518c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 519c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 520c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Some inline functions in vmstat.h depend on page_zone() 521c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 522c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/vmstat.h> 523c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 524c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef CONFIG_DISCONTIGMEM 525c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* The array of struct pages - for discontigmem use pgdat->lmem_map */ 526c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct page *mem_map; 527c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 528c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 529c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic __always_inline void *lowmem_page_address(struct page *page) 530c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 531c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __va(page_to_pfn(page) << PAGE_SHIFT); 532c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 533c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 534c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(CONFIG_HIGHMEM) && !defined(WANT_PAGE_VIRTUAL) 535c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define HASHED_PAGE_VIRTUAL 536c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 537c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 538c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(WANT_PAGE_VIRTUAL) 539c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define page_address(page) ((page)->virtual) 540c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define set_page_address(page, address) \ 541c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru do { \ 542c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (page)->virtual = (address); \ 543c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } while(0) 544c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define page_address_init() do { } while(0) 545c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 546c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 547c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(HASHED_PAGE_VIRTUAL) 548c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid *page_address(struct page *page); 549c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid set_page_address(struct page *page, void *virtual); 550c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid page_address_init(void); 551c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 552c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 553c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if !defined(HASHED_PAGE_VIRTUAL) && !defined(WANT_PAGE_VIRTUAL) 554c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define page_address(page) lowmem_page_address(page) 555c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define set_page_address(page, address) do { } while(0) 556c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define page_address_init() do { } while(0) 557c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 558c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 559c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 560c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * On an anonymous page mapped into a user virtual memory area, 561c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * page->mapping points to its anon_vma, not to a struct address_space; 562c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * with the PAGE_MAPPING_ANON bit set to distinguish it. 563c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 564c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Please note that, confusingly, "page_mapping" refers to the inode 565c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * address_space which maps the page from disk; whereas "page_mapped" 566c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * refers to user virtual address space into which the page is mapped. 567c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 568c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PAGE_MAPPING_ANON 1 569c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 570c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct address_space swapper_space; 571c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct address_space *page_mapping(struct page *page) 572c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 573c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct address_space *mapping = page->mapping; 574c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 575c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (unlikely(PageSwapCache(page))) 576c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru mapping = &swapper_space; 577c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru else if (unlikely((unsigned long)mapping & PAGE_MAPPING_ANON)) 578c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru mapping = NULL; 579c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return mapping; 580c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 581c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 582c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int PageAnon(struct page *page) 583c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 584c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ((unsigned long)page->mapping & PAGE_MAPPING_ANON) != 0; 585c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 586c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 587c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 588c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Return the pagecache index of the passed page. Regular pagecache pages 589c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * use ->index whereas swapcache pages use ->private 590c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 591c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline pgoff_t page_index(struct page *page) 592c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 593c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (unlikely(PageSwapCache(page))) 594c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return page_private(page); 595c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return page->index; 596c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 597c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 598c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 599c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The atomic page->_mapcount, like _count, starts from -1: 600c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * so that transitions both from it and to it can be tracked, 601c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * using atomic_inc_and_test and atomic_add_negative(-1). 602c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 603c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void reset_page_mapcount(struct page *page) 604c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 605c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru atomic_set(&(page)->_mapcount, -1); 606c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 607c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 608c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int page_mapcount(struct page *page) 609c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 610c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return atomic_read(&(page)->_mapcount) + 1; 611c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 612c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 613c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 614c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Return true if this page is mapped into pagetables. 615c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 616c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int page_mapped(struct page *page) 617c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 618c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return atomic_read(&(page)->_mapcount) >= 0; 619c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 620c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 621c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 622c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Error return values for the *_nopage functions 623c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 624c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NOPAGE_SIGBUS (NULL) 625c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NOPAGE_OOM ((struct page *) (-1)) 626c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 627c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 628c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Different kinds of faults, as returned by handle_mm_fault(). 629c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Used to decide whether a process gets delivered SIGBUS or 630c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * just gets major/minor fault counters bumped up. 631c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 632c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_FAULT_OOM 0x00 633c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_FAULT_SIGBUS 0x01 634c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_FAULT_MINOR 0x02 635c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_FAULT_MAJOR 0x03 636c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 637c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 638c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Special case for get_user_pages. 639c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Must be in a distinct bit from the above VM_FAULT_ flags. 640c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 641c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_FAULT_WRITE 0x10 642c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 643c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK) 644c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 645c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void show_free_areas(void); 646c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 647c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SHMEM 648c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct page *shmem_nopage(struct vm_area_struct *vma, 649c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long address, int *type); 650c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint shmem_set_policy(struct vm_area_struct *vma, struct mempolicy *new); 651c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mempolicy *shmem_get_policy(struct vm_area_struct *vma, 652c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long addr); 653c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint shmem_lock(struct file *file, int lock, struct user_struct *user); 654c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 655c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define shmem_nopage filemap_nopage 656c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 657c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int shmem_lock(struct file *file, int lock, 658c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct user_struct *user) 659c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 660c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 661c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 662c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 663c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int shmem_set_policy(struct vm_area_struct *vma, 664c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct mempolicy *new) 665c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 666c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 667c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 668c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 669c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct mempolicy *shmem_get_policy(struct vm_area_struct *vma, 670c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long addr) 671c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 672c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return NULL; 673c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 674c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 675c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct file *shmem_file_setup(char *name, loff_t size, unsigned long flags); 676c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int shmem_mmap(struct file *file, struct vm_area_struct *vma); 677c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 678c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint shmem_zero_setup(struct vm_area_struct *); 679c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 680c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef CONFIG_MMU 681c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long shmem_get_unmapped_area(struct file *file, 682c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long addr, 683c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long len, 684c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long pgoff, 685c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flags); 686c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 687c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 688c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int can_do_mlock(void) 689c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 690c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (capable(CAP_IPC_LOCK)) 691c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 1; 692c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur != 0) 693c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 1; 694c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return 0; 695c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 696c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int user_shm_lock(size_t, struct user_struct *); 697c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void user_shm_unlock(size_t, struct user_struct *); 698c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 699c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 700c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Parameter block passed down to zap_pte_range in exceptional cases. 701c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 702c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct zap_details { 703c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_area_struct *nonlinear_vma; /* Check page->index if set */ 704c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct address_space *check_mapping; /* Check page->mapping if set */ 705c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pgoff_t first_index; /* Lowest page->index to unmap */ 706c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pgoff_t last_index; /* Highest page->index to unmap */ 707c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spinlock_t *i_mmap_lock; /* For unmap_mapping_range: */ 708c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long truncate_count; /* Compare vm_truncate_count */ 709c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 710c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 711c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct page *vm_normal_page(struct vm_area_struct *, unsigned long, pte_t); 712c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long zap_page_range(struct vm_area_struct *vma, unsigned long address, 713c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long size, struct zap_details *); 714c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long unmap_vmas(struct mmu_gather **tlb, 715c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_area_struct *start_vma, unsigned long start_addr, 716c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long end_addr, unsigned long *nr_accounted, 717c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct zap_details *); 718c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid free_pgd_range(struct mmu_gather **tlb, unsigned long addr, 719c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long end, unsigned long floor, unsigned long ceiling); 720c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid free_pgtables(struct mmu_gather **tlb, struct vm_area_struct *start_vma, 721c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long floor, unsigned long ceiling); 722c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint copy_page_range(struct mm_struct *dst, struct mm_struct *src, 723c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_area_struct *vma); 724c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint zeromap_page_range(struct vm_area_struct *vma, unsigned long from, 725c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long size, pgprot_t prot); 726c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid unmap_mapping_range(struct address_space *mapping, 727c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru loff_t const holebegin, loff_t const holelen, int even_cows); 728c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 729c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void unmap_shared_mapping_range(struct address_space *mapping, 730c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru loff_t const holebegin, loff_t const holelen) 731c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 732c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unmap_mapping_range(mapping, holebegin, holelen, 0); 733c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 734c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 735c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int vmtruncate(struct inode * inode, loff_t offset); 736c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int vmtruncate_range(struct inode * inode, loff_t offset, loff_t end); 737c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int install_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, struct page *page, pgprot_t prot); 738c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int install_file_pte(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, unsigned long pgoff, pgprot_t prot); 739c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 740c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_MMU 741c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int __handle_mm_fault(struct mm_struct *mm,struct vm_area_struct *vma, 742c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long address, int write_access); 743c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 744c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int handle_mm_fault(struct mm_struct *mm, 745c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_area_struct *vma, unsigned long address, 746c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int write_access) 747c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 748c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return __handle_mm_fault(mm, vma, address, write_access) & 749c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (~VM_FAULT_WRITE); 750c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 751c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 752c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int handle_mm_fault(struct mm_struct *mm, 753c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_area_struct *vma, unsigned long address, 754c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int write_access) 755c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 756c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* should never happen if there's no MMU */ 757c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BUG(); 758c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return VM_FAULT_SIGBUS; 759c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 760c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 761c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 762c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int make_pages_present(unsigned long addr, unsigned long end); 763c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write); 764c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid install_arg_page(struct vm_area_struct *, struct page *, unsigned long); 765c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 766c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint get_user_pages(struct task_struct *tsk, struct mm_struct *mm, unsigned long start, 767c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int len, int write, int force, struct page **pages, struct vm_area_struct **vmas); 768c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid print_bad_pte(struct vm_area_struct *, pte_t, unsigned long); 769c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 770c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint __set_page_dirty_buffers(struct page *page); 771c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint __set_page_dirty_nobuffers(struct page *page); 772c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint redirty_page_for_writepage(struct writeback_control *wbc, 773c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct page *page); 774c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint FASTCALL(set_page_dirty(struct page *page)); 775c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint set_page_dirty_lock(struct page *page); 776c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint clear_page_dirty_for_io(struct page *page); 777c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 778c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long do_mremap(unsigned long addr, 779c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long old_len, unsigned long new_len, 780c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flags, unsigned long new_addr); 781c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 782c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 783c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Prototype to add a shrinker callback for ageable caches. 784c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 785c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * These functions are passed a count `nr_to_scan' and a gfpmask. They should 786c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * scan `nr_to_scan' objects, attempting to free them. 787c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 788c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The callback must return the number of objects which remain in the cache. 789c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 790c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The callback will be passed nr_to_scan == 0 when the VM is querying the 791c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * cache size, so a fastpath for that case is appropriate. 792c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 793c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int (*shrinker_t)(int nr_to_scan, gfp_t gfp_mask); 794c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 795c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 796c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Add an aging callback. The int is the number of 'seeks' it takes 797c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to recreate one of the objects that these functions age. 798c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 799c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 800c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DEFAULT_SEEKS 2 801c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct shrinker; 802c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct shrinker *set_shrinker(int, shrinker_t); 803c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void remove_shrinker(struct shrinker *shrinker); 804c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 805c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern pte_t *FASTCALL(get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl)); 806c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 807c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address); 808c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address); 809c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint __pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address); 810c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint __pte_alloc_kernel(pmd_t *pmd, unsigned long address); 811c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 812c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 813c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The following ifdef needed to get the 4level-fixup.h header to work. 814c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Remove it when 4level-fixup.h has been removed. 815c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 816c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if defined(CONFIG_MMU) && !defined(__ARCH_HAS_4LEVEL_HACK) 817c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline pud_t *pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address) 818c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 819c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (unlikely(pgd_none(*pgd)) && __pud_alloc(mm, pgd, address))? 820c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NULL: pud_offset(pgd, address); 821c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 822c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 823c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline pmd_t *pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address) 824c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 825c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (unlikely(pud_none(*pud)) && __pmd_alloc(mm, pud, address))? 826c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NULL: pmd_offset(pud, address); 827c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 828c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* CONFIG_MMU && !__ARCH_HAS_4LEVEL_HACK */ 829c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 830c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS 831c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 832c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * We tuck a spinlock to guard each pagetable page into its struct page, 833c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * at page->private, with BUILD_BUG_ON to make sure that this will not 834c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * overflow into the next struct page (as it might with DEBUG_SPINLOCK). 835c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * When freeing, reset page->mapping so free_pages_check won't complain. 836c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 837c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __pte_lockptr(page) &((page)->ptl) 838c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_lock_init(_page) do { \ 839c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spin_lock_init(__pte_lockptr(_page)); \ 840c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 841c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_lock_deinit(page) ((page)->mapping = NULL) 842c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_lockptr(mm, pmd) ({(void)(mm); __pte_lockptr(pmd_page(*(pmd)));}) 843c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 844c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 845c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * We use mm->page_table_lock to guard all pagetable pages of the mm. 846c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 847c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_lock_init(page) do {} while (0) 848c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_lock_deinit(page) do {} while (0) 849c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_lockptr(mm, pmd) ({(void)(pmd); &(mm)->page_table_lock;}) 850c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* NR_CPUS < CONFIG_SPLIT_PTLOCK_CPUS */ 851c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 852c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_offset_map_lock(mm, pmd, address, ptlp) \ 853c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \ 854c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spinlock_t *__ptl = pte_lockptr(mm, pmd); \ 855c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pte_t *__pte = pte_offset_map(pmd, address); \ 856c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *(ptlp) = __ptl; \ 857c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spin_lock(__ptl); \ 858c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __pte; \ 859c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}) 860c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 861c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_unmap_unlock(pte, ptl) do { \ 862c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spin_unlock(ptl); \ 863c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pte_unmap(pte); \ 864c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} while (0) 865c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 866c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_alloc_map(mm, pmd, address) \ 867c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ((unlikely(!pmd_present(*(pmd))) && __pte_alloc(mm, pmd, address))? \ 868c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NULL: pte_offset_map(pmd, address)) 869c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 870c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_alloc_map_lock(mm, pmd, address, ptlp) \ 871c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ((unlikely(!pmd_present(*(pmd))) && __pte_alloc(mm, pmd, address))? \ 872c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NULL: pte_offset_map_lock(mm, pmd, address, ptlp)) 873c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 874c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define pte_alloc_kernel(pmd, address) \ 875c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ((unlikely(!pmd_present(*(pmd))) && __pte_alloc_kernel(pmd, address))? \ 876c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NULL: pte_offset_kernel(pmd, address)) 877c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 878c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void free_area_init(unsigned long * zones_size); 879c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void free_area_init_node(int nid, pg_data_t *pgdat, 880c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long * zones_size, unsigned long zone_start_pfn, 881c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long *zholes_size); 882c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void memmap_init_zone(unsigned long, int, unsigned long, unsigned long); 883c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void setup_per_zone_pages_min(void); 884c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void mem_init(void); 885c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void show_mem(void); 886c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void si_meminfo(struct sysinfo * val); 887c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void si_meminfo_node(struct sysinfo *val, int nid); 888c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 889c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_NUMA 890c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void setup_per_cpu_pageset(void); 891c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 892c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void setup_per_cpu_pageset(void) {} 893c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 894c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 895c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* prio_tree.c */ 896c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid vma_prio_tree_add(struct vm_area_struct *, struct vm_area_struct *old); 897c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid vma_prio_tree_insert(struct vm_area_struct *, struct prio_tree_root *); 898c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid vma_prio_tree_remove(struct vm_area_struct *, struct prio_tree_root *); 899c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct vm_area_struct *vma_prio_tree_next(struct vm_area_struct *vma, 900c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct prio_tree_iter *iter); 901c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 902c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define vma_prio_tree_foreach(vma, iter, root, begin, end) \ 903c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru for (prio_tree_iter_init(iter, root, begin, end), vma = NULL; \ 904c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (vma = vma_prio_tree_next(vma, iter)); ) 905c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 906c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void vma_nonlinear_insert(struct vm_area_struct *vma, 907c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head *list) 908c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 909c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru vma->shared.vm_set.parent = NULL; 910c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru list_add_tail(&vma->shared.vm_set.list, list); 911c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 912c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 913c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* mmap.c */ 914c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int __vm_enough_memory(long pages, int cap_sys_admin); 915c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void vma_adjust(struct vm_area_struct *vma, unsigned long start, 916c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert); 917c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct vm_area_struct *vma_merge(struct mm_struct *, 918c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_area_struct *prev, unsigned long addr, unsigned long end, 919c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long vm_flags, struct anon_vma *, struct file *, pgoff_t, 920c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct mempolicy *); 921c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct anon_vma *find_mergeable_anon_vma(struct vm_area_struct *); 922c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int split_vma(struct mm_struct *, 923c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_area_struct *, unsigned long addr, int new_below); 924c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int insert_vm_struct(struct mm_struct *, struct vm_area_struct *); 925c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __vma_link_rb(struct mm_struct *, struct vm_area_struct *, 926c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct rb_node **, struct rb_node *); 927c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void unlink_file_vma(struct vm_area_struct *); 928c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct vm_area_struct *copy_vma(struct vm_area_struct **, 929c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long addr, unsigned long len, pgoff_t pgoff); 930c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void exit_mmap(struct mm_struct *); 931c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int may_expand_vm(struct mm_struct *mm, unsigned long npages); 932c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 933c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); 934c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 935c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, 936c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long len, unsigned long prot, 937c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flag, unsigned long pgoff); 938c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 939c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned long do_mmap(struct file *file, unsigned long addr, 940c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long len, unsigned long prot, 941c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flag, unsigned long offset) 942c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 943c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long ret = -EINVAL; 944c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if ((offset + PAGE_ALIGN(len)) < offset) 945c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru goto out; 946c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!(offset & ~PAGE_MASK)) 947c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ret = do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT); 948c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruout: 949c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; 950c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 951c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 952c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int do_munmap(struct mm_struct *, unsigned long, size_t); 953c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 954c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long do_brk(unsigned long, unsigned long); 955c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 956c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* filemap.c */ 957c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long page_unuse(struct page *); 958c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void truncate_inode_pages(struct address_space *, loff_t); 959c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void truncate_inode_pages_range(struct address_space *, 960c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru loff_t lstart, loff_t lend); 961c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 962c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* generic vm_area_ops exported for stackable file systems */ 963c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct page *filemap_nopage(struct vm_area_struct *, unsigned long, int *); 964c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int filemap_populate(struct vm_area_struct *, unsigned long, 965c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long, pgprot_t, unsigned long, int); 966c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 967c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* mm/page-writeback.c */ 968c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint write_one_page(struct page *page, int wait); 969c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 970c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* readahead.c */ 971c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_MAX_READAHEAD 128 /* kbytes */ 972c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_MIN_READAHEAD 16 /* kbytes (includes current page) */ 973c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define VM_MAX_CACHE_HIT 256 /* max pages in a row in cache before 974c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * turning readahead off */ 975c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 976c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint do_page_cache_readahead(struct address_space *mapping, struct file *filp, 977c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pgoff_t offset, unsigned long nr_to_read); 978c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint force_page_cache_readahead(struct address_space *mapping, struct file *filp, 979c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pgoff_t offset, unsigned long nr_to_read); 980c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long page_cache_readahead(struct address_space *mapping, 981c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct file_ra_state *ra, 982c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct file *filp, 983c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru pgoff_t offset, 984c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long size); 985c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid handle_ra_miss(struct address_space *mapping, 986c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct file_ra_state *ra, pgoff_t offset); 987c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long max_sane_readahead(unsigned long nr); 988c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 989c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Do stack extension */ 990c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int expand_stack(struct vm_area_struct *vma, unsigned long address); 991c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_IA64 992c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int expand_upwards(struct vm_area_struct *vma, unsigned long address); 993c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 994c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 995c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Look up the first VMA which satisfies addr < vm_end, NULL if none. */ 996c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr); 997c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct vm_area_struct * find_vma_prev(struct mm_struct * mm, unsigned long addr, 998c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_area_struct **pprev); 999c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1000c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Look up the first VMA which intersects the interval start_addr..end_addr-1, 1001c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NULL if none. Assume start_addr < end_addr. */ 1002c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct vm_area_struct * find_vma_intersection(struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr) 1003c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 1004c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_area_struct * vma = find_vma(mm,start_addr); 1005c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1006c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (vma && end_addr <= vma->vm_start) 1007c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru vma = NULL; 1008c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return vma; 1009c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 1010c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1011c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline unsigned long vma_pages(struct vm_area_struct *vma) 1012c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 1013c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; 1014c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 1015c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1016c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr); 1017c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct page *vmalloc_to_page(void *addr); 1018c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long vmalloc_to_pfn(void *addr); 1019c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint remap_pfn_range(struct vm_area_struct *, unsigned long addr, 1020c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long pfn, unsigned long size, pgprot_t); 1021c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint vm_insert_page(struct vm_area_struct *, unsigned long addr, struct page *); 1022c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1023c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct page *follow_page(struct vm_area_struct *, unsigned long address, 1024c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int foll_flags); 1025c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define FOLL_WRITE 0x01 /* check pte is writable */ 1026c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define FOLL_TOUCH 0x02 /* mark page accessed */ 1027c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define FOLL_GET 0x04 /* do get_page on page */ 1028c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define FOLL_ANON 0x08 /* give ZERO_PAGE if no pgtable */ 1029c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1030c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_PROC_FS 1031c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid vm_stat_account(struct mm_struct *, unsigned long, struct file *, long); 1032c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 1033c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void vm_stat_account(struct mm_struct *mm, 1034c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flags, struct file *file, long pages) 1035c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 1036c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 1037c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* CONFIG_PROC_FS */ 1038c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1039c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef CONFIG_DEBUG_PAGEALLOC 1040c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void 1041c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querukernel_map_pages(struct page *page, int numpages, int enable) 1042c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 1043c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (!PageHighMem(page) && !enable) 1044c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru debug_check_no_locks_freed(page_address(page), 1045c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru numpages * PAGE_SIZE); 1046c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 1047c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 1048c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1049c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct vm_area_struct *get_gate_vma(struct task_struct *tsk); 1050c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __HAVE_ARCH_GATE_AREA 1051c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint in_gate_area_no_task(unsigned long addr); 1052c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint in_gate_area(struct task_struct *task, unsigned long addr); 1053c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 1054c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint in_gate_area_no_task(unsigned long addr); 1055c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define in_gate_area(task, addr) ({(void)task; in_gate_area_no_task(addr);}) 1056c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __HAVE_ARCH_GATE_AREA */ 1057c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1058c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* /proc/<pid>/oom_adj set to -17 protects from the oom-killer */ 1059c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define OOM_DISABLE -17 1060c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1061c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint drop_caches_sysctl_handler(struct ctl_table *, int, struct file *, 1062c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void __user *, size_t *, loff_t *); 1063c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruunsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, 1064c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long lru_pages); 1065c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid drop_pagecache(void); 1066c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid drop_slab(void); 1067c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1068c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef CONFIG_MMU 1069c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define randomize_va_space 0 1070c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 1071c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int randomize_va_space; 1072c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 1073c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1074c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruconst char *arch_vma_name(struct vm_area_struct *vma); 1075c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 1076c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __KERNEL__ */ 1077c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* _LINUX_MM_H */ 1078