diff options
Diffstat (limited to 'include/linux/mm.h')
| -rw-r--r-- | include/linux/mm.h | 249 |
1 files changed, 154 insertions, 95 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index 224178a000d2..7b703b6d4358 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -15,6 +15,8 @@ | |||
| 15 | #include <linux/fs.h> | 15 | #include <linux/fs.h> |
| 16 | #include <linux/mutex.h> | 16 | #include <linux/mutex.h> |
| 17 | #include <linux/debug_locks.h> | 17 | #include <linux/debug_locks.h> |
| 18 | #include <linux/backing-dev.h> | ||
| 19 | #include <linux/mm_types.h> | ||
| 18 | 20 | ||
| 19 | struct mempolicy; | 21 | struct mempolicy; |
| 20 | struct anon_vma; | 22 | struct anon_vma; |
| @@ -197,6 +199,7 @@ struct vm_operations_struct { | |||
| 197 | void (*open)(struct vm_area_struct * area); | 199 | void (*open)(struct vm_area_struct * area); |
| 198 | void (*close)(struct vm_area_struct * area); | 200 | void (*close)(struct vm_area_struct * area); |
| 199 | struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int *type); | 201 | struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int *type); |
| 202 | unsigned long (*nopfn)(struct vm_area_struct * area, unsigned long address); | ||
| 200 | int (*populate)(struct vm_area_struct * area, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock); | 203 | int (*populate)(struct vm_area_struct * area, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock); |
| 201 | 204 | ||
| 202 | /* notification that a previously read-only page is about to become | 205 | /* notification that a previously read-only page is about to become |
| @@ -214,61 +217,6 @@ struct vm_operations_struct { | |||
| 214 | struct mmu_gather; | 217 | struct mmu_gather; |
| 215 | struct inode; | 218 | struct inode; |
| 216 | 219 | ||
| 217 | /* | ||
| 218 | * Each physical page in the system has a struct page associated with | ||
| 219 | * it to keep track of whatever it is we are using the page for at the | ||
| 220 | * moment. Note that we have no way to track which tasks are using | ||
| 221 | * a page. | ||
| 222 | */ | ||
| 223 | struct page { | ||
| 224 | unsigned long flags; /* Atomic flags, some possibly | ||
| 225 | * updated asynchronously */ | ||
| 226 | atomic_t _count; /* Usage count, see below. */ | ||
| 227 | atomic_t _mapcount; /* Count of ptes mapped in mms, | ||
| 228 | * to show when page is mapped | ||
| 229 | * & limit reverse map searches. | ||
| 230 | */ | ||
| 231 | union { | ||
| 232 | struct { | ||
| 233 | unsigned long private; /* Mapping-private opaque data: | ||
| 234 | * usually used for buffer_heads | ||
| 235 | * if PagePrivate set; used for | ||
| 236 | * swp_entry_t if PageSwapCache; | ||
| 237 | * indicates order in the buddy | ||
| 238 | * system if PG_buddy is set. | ||
| 239 | */ | ||
| 240 | struct address_space *mapping; /* If low bit clear, points to | ||
| 241 | * inode address_space, or NULL. | ||
| 242 | * If page mapped as anonymous | ||
| 243 | * memory, low bit is set, and | ||
| 244 | * it points to anon_vma object: | ||
| 245 | * see PAGE_MAPPING_ANON below. | ||
| 246 | */ | ||
| 247 | }; | ||
| 248 | #if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS | ||
| 249 | spinlock_t ptl; | ||
| 250 | #endif | ||
| 251 | }; | ||
| 252 | pgoff_t index; /* Our offset within mapping. */ | ||
| 253 | struct list_head lru; /* Pageout list, eg. active_list | ||
| 254 | * protected by zone->lru_lock ! | ||
| 255 | */ | ||
| 256 | /* | ||
| 257 | * On machines where all RAM is mapped into kernel address space, | ||
| 258 | * we can simply calculate the virtual address. On machines with | ||
| 259 | * highmem some memory is mapped into kernel virtual memory | ||
| 260 | * dynamically, so we need a place to store that address. | ||
| 261 | * Note that this field could be 16 bits on x86 ... ;) | ||
| 262 | * | ||
| 263 | * Architectures with slow multiplication can define | ||
| 264 | * WANT_PAGE_VIRTUAL in asm/page.h | ||
| 265 | */ | ||
| 266 | #if defined(WANT_PAGE_VIRTUAL) | ||
| 267 | void *virtual; /* Kernel virtual address (NULL if | ||
| 268 | not kmapped, ie. highmem) */ | ||
| 269 | #endif /* WANT_PAGE_VIRTUAL */ | ||
| 270 | }; | ||
| 271 | |||
| 272 | #define page_private(page) ((page)->private) | 220 | #define page_private(page) ((page)->private) |
| 273 | #define set_page_private(page, v) ((page)->private = (v)) | 221 | #define set_page_private(page, v) ((page)->private = (v)) |
| 274 | 222 | ||
| @@ -278,6 +226,12 @@ struct page { | |||
| 278 | */ | 226 | */ |
| 279 | #include <linux/page-flags.h> | 227 | #include <linux/page-flags.h> |
| 280 | 228 | ||
| 229 | #ifdef CONFIG_DEBUG_VM | ||
| 230 | #define VM_BUG_ON(cond) BUG_ON(cond) | ||
| 231 | #else | ||
| 232 | #define VM_BUG_ON(condition) do { } while(0) | ||
| 233 | #endif | ||
| 234 | |||
| 281 | /* | 235 | /* |
| 282 | * Methods to modify the page usage count. | 236 | * Methods to modify the page usage count. |
| 283 | * | 237 | * |
| @@ -292,12 +246,11 @@ struct page { | |||
| 292 | */ | 246 | */ |
| 293 | 247 | ||
| 294 | /* | 248 | /* |
| 295 | * Drop a ref, return true if the logical refcount fell to zero (the page has | 249 | * Drop a ref, return true if the refcount fell to zero (the page has no users) |
| 296 | * no users) | ||
| 297 | */ | 250 | */ |
| 298 | static inline int put_page_testzero(struct page *page) | 251 | static inline int put_page_testzero(struct page *page) |
| 299 | { | 252 | { |
| 300 | BUG_ON(atomic_read(&page->_count) == 0); | 253 | VM_BUG_ON(atomic_read(&page->_count) == 0); |
| 301 | return atomic_dec_and_test(&page->_count); | 254 | return atomic_dec_and_test(&page->_count); |
| 302 | } | 255 | } |
| 303 | 256 | ||
| @@ -307,11 +260,10 @@ static inline int put_page_testzero(struct page *page) | |||
| 307 | */ | 260 | */ |
| 308 | static inline int get_page_unless_zero(struct page *page) | 261 | static inline int get_page_unless_zero(struct page *page) |
| 309 | { | 262 | { |
| 263 | VM_BUG_ON(PageCompound(page)); | ||
| 310 | return atomic_inc_not_zero(&page->_count); | 264 | return atomic_inc_not_zero(&page->_count); |
| 311 | } | 265 | } |
| 312 | 266 | ||
| 313 | extern void FASTCALL(__page_cache_release(struct page *)); | ||
| 314 | |||
| 315 | static inline int page_count(struct page *page) | 267 | static inline int page_count(struct page *page) |
| 316 | { | 268 | { |
| 317 | if (unlikely(PageCompound(page))) | 269 | if (unlikely(PageCompound(page))) |
| @@ -323,6 +275,7 @@ static inline void get_page(struct page *page) | |||
| 323 | { | 275 | { |
| 324 | if (unlikely(PageCompound(page))) | 276 | if (unlikely(PageCompound(page))) |
| 325 | page = (struct page *)page_private(page); | 277 | page = (struct page *)page_private(page); |
| 278 | VM_BUG_ON(atomic_read(&page->_count) == 0); | ||
| 326 | atomic_inc(&page->_count); | 279 | atomic_inc(&page->_count); |
| 327 | } | 280 | } |
| 328 | 281 | ||
| @@ -349,43 +302,55 @@ void split_page(struct page *page, unsigned int order); | |||
| 349 | * For the non-reserved pages, page_count(page) denotes a reference count. | 302 | * For the non-reserved pages, page_count(page) denotes a reference count. |
| 350 | * page_count() == 0 means the page is free. page->lru is then used for | 303 | * page_count() == 0 means the page is free. page->lru is then used for |
| 351 | * freelist management in the buddy allocator. | 304 | * freelist management in the buddy allocator. |
| 352 | * page_count() == 1 means the page is used for exactly one purpose | 305 | * page_count() > 0 means the page has been allocated. |
| 353 | * (e.g. a private data page of one process). | 306 | * |
| 307 | * Pages are allocated by the slab allocator in order to provide memory | ||
| 308 | * to kmalloc and kmem_cache_alloc. In this case, the management of the | ||
| 309 | * page, and the fields in 'struct page' are the responsibility of mm/slab.c | ||
| 310 | * unless a particular usage is carefully commented. (the responsibility of | ||
| 311 | * freeing the kmalloc memory is the caller's, of course). | ||
| 354 | * | 312 | * |
| 355 | * A page may be used for kmalloc() or anyone else who does a | 313 | * A page may be used by anyone else who does a __get_free_page(). |
| 356 | * __get_free_page(). In this case the page_count() is at least 1, and | 314 | * In this case, page_count still tracks the references, and should only |
| 357 | * all other fields are unused but should be 0 or NULL. The | 315 | * be used through the normal accessor functions. The top bits of page->flags |
| 358 | * management of this page is the responsibility of the one who uses | 316 | * and page->virtual store page management information, but all other fields |
| 359 | * it. | 317 | * are unused and could be used privately, carefully. The management of this |
| 318 | * page is the responsibility of the one who allocated it, and those who have | ||
| 319 | * subsequently been given references to it. | ||
| 360 | * | 320 | * |
| 361 | * The other pages (we may call them "process pages") are completely | 321 | * The other pages (we may call them "pagecache pages") are completely |
| 362 | * managed by the Linux memory manager: I/O, buffers, swapping etc. | 322 | * managed by the Linux memory manager: I/O, buffers, swapping etc. |
| 363 | * The following discussion applies only to them. | 323 | * The following discussion applies only to them. |
| 364 | * | 324 | * |
| 365 | * A page may belong to an inode's memory mapping. In this case, | 325 | * A pagecache page contains an opaque `private' member, which belongs to the |
| 366 | * page->mapping is the pointer to the inode, and page->index is the | 326 | * page's address_space. Usually, this is the address of a circular list of |
| 367 | * file offset of the page, in units of PAGE_CACHE_SIZE. | 327 | * the page's disk buffers. PG_private must be set to tell the VM to call |
| 328 | * into the filesystem to release these pages. | ||
| 368 | * | 329 | * |
| 369 | * A page contains an opaque `private' member, which belongs to the | 330 | * A page may belong to an inode's memory mapping. In this case, page->mapping |
| 370 | * page's address_space. Usually, this is the address of a circular | 331 | * is the pointer to the inode, and page->index is the file offset of the page, |
| 371 | * list of the page's disk buffers. | 332 | * in units of PAGE_CACHE_SIZE. |
| 372 | * | 333 | * |
| 373 | * For pages belonging to inodes, the page_count() is the number of | 334 | * If pagecache pages are not associated with an inode, they are said to be |
| 374 | * attaches, plus 1 if `private' contains something, plus one for | 335 | * anonymous pages. These may become associated with the swapcache, and in that |
| 375 | * the page cache itself. | 336 | * case PG_swapcache is set, and page->private is an offset into the swapcache. |
| 376 | * | 337 | * |
| 377 | * Instead of keeping dirty/clean pages in per address-space lists, we instead | 338 | * In either case (swapcache or inode backed), the pagecache itself holds one |
| 378 | * now tag pages as dirty/under writeback in the radix tree. | 339 | * reference to the page. Setting PG_private should also increment the |
| 340 | * refcount. The each user mapping also has a reference to the page. | ||
| 379 | * | 341 | * |
| 380 | * There is also a per-mapping radix tree mapping index to the page | 342 | * The pagecache pages are stored in a per-mapping radix tree, which is |
| 381 | * in memory if present. The tree is rooted at mapping->root. | 343 | * rooted at mapping->page_tree, and indexed by offset. |
| 344 | * Where 2.4 and early 2.6 kernels kept dirty/clean pages in per-address_space | ||
| 345 | * lists, we instead now tag pages as dirty/writeback in the radix tree. | ||
| 382 | * | 346 | * |
| 383 | * All process pages can do I/O: | 347 | * All pagecache pages may be subject to I/O: |
| 384 | * - inode pages may need to be read from disk, | 348 | * - inode pages may need to be read from disk, |
| 385 | * - inode pages which have been modified and are MAP_SHARED may need | 349 | * - inode pages which have been modified and are MAP_SHARED may need |
| 386 | * to be written to disk, | 350 | * to be written back to the inode on disk, |
| 387 | * - private pages which have been modified may need to be swapped out | 351 | * - anonymous pages (including MAP_PRIVATE file mappings) which have been |
| 388 | * to swap space and (later) to be read back into memory. | 352 | * modified may need to be swapped out to swap space and (later) to be read |
| 353 | * back into memory. | ||
| 389 | */ | 354 | */ |
| 390 | 355 | ||
| 391 | /* | 356 | /* |
| @@ -463,7 +428,7 @@ void split_page(struct page *page, unsigned int order); | |||
| 463 | #define SECTIONS_MASK ((1UL << SECTIONS_WIDTH) - 1) | 428 | #define SECTIONS_MASK ((1UL << SECTIONS_WIDTH) - 1) |
| 464 | #define ZONETABLE_MASK ((1UL << ZONETABLE_SHIFT) - 1) | 429 | #define ZONETABLE_MASK ((1UL << ZONETABLE_SHIFT) - 1) |
| 465 | 430 | ||
| 466 | static inline unsigned long page_zonenum(struct page *page) | 431 | static inline enum zone_type page_zonenum(struct page *page) |
| 467 | { | 432 | { |
| 468 | return (page->flags >> ZONES_PGSHIFT) & ZONES_MASK; | 433 | return (page->flags >> ZONES_PGSHIFT) & ZONES_MASK; |
| 469 | } | 434 | } |
| @@ -480,23 +445,33 @@ static inline struct zone *page_zone(struct page *page) | |||
| 480 | return zone_table[page_zone_id(page)]; | 445 | return zone_table[page_zone_id(page)]; |
| 481 | } | 446 | } |
| 482 | 447 | ||
| 448 | static inline unsigned long zone_to_nid(struct zone *zone) | ||
| 449 | { | ||
| 450 | #ifdef CONFIG_NUMA | ||
| 451 | return zone->node; | ||
| 452 | #else | ||
| 453 | return 0; | ||
| 454 | #endif | ||
| 455 | } | ||
| 456 | |||
| 483 | static inline unsigned long page_to_nid(struct page *page) | 457 | static inline unsigned long page_to_nid(struct page *page) |
| 484 | { | 458 | { |
| 485 | if (FLAGS_HAS_NODE) | 459 | if (FLAGS_HAS_NODE) |
| 486 | return (page->flags >> NODES_PGSHIFT) & NODES_MASK; | 460 | return (page->flags >> NODES_PGSHIFT) & NODES_MASK; |
| 487 | else | 461 | else |
| 488 | return page_zone(page)->zone_pgdat->node_id; | 462 | return zone_to_nid(page_zone(page)); |
| 489 | } | 463 | } |
| 490 | static inline unsigned long page_to_section(struct page *page) | 464 | static inline unsigned long page_to_section(struct page *page) |
| 491 | { | 465 | { |
| 492 | return (page->flags >> SECTIONS_PGSHIFT) & SECTIONS_MASK; | 466 | return (page->flags >> SECTIONS_PGSHIFT) & SECTIONS_MASK; |
| 493 | } | 467 | } |
| 494 | 468 | ||
| 495 | static inline void set_page_zone(struct page *page, unsigned long zone) | 469 | static inline void set_page_zone(struct page *page, enum zone_type zone) |
| 496 | { | 470 | { |
| 497 | page->flags &= ~(ZONES_MASK << ZONES_PGSHIFT); | 471 | page->flags &= ~(ZONES_MASK << ZONES_PGSHIFT); |
| 498 | page->flags |= (zone & ZONES_MASK) << ZONES_PGSHIFT; | 472 | page->flags |= (zone & ZONES_MASK) << ZONES_PGSHIFT; |
| 499 | } | 473 | } |
| 474 | |||
| 500 | static inline void set_page_node(struct page *page, unsigned long node) | 475 | static inline void set_page_node(struct page *page, unsigned long node) |
| 501 | { | 476 | { |
| 502 | page->flags &= ~(NODES_MASK << NODES_PGSHIFT); | 477 | page->flags &= ~(NODES_MASK << NODES_PGSHIFT); |
| @@ -508,7 +483,7 @@ static inline void set_page_section(struct page *page, unsigned long section) | |||
| 508 | page->flags |= (section & SECTIONS_MASK) << SECTIONS_PGSHIFT; | 483 | page->flags |= (section & SECTIONS_MASK) << SECTIONS_PGSHIFT; |
| 509 | } | 484 | } |
| 510 | 485 | ||
| 511 | static inline void set_page_links(struct page *page, unsigned long zone, | 486 | static inline void set_page_links(struct page *page, enum zone_type zone, |
| 512 | unsigned long node, unsigned long pfn) | 487 | unsigned long node, unsigned long pfn) |
| 513 | { | 488 | { |
| 514 | set_page_zone(page, zone); | 489 | set_page_zone(page, zone); |
| @@ -521,11 +496,6 @@ static inline void set_page_links(struct page *page, unsigned long zone, | |||
| 521 | */ | 496 | */ |
| 522 | #include <linux/vmstat.h> | 497 | #include <linux/vmstat.h> |
| 523 | 498 | ||
| 524 | #ifndef CONFIG_DISCONTIGMEM | ||
| 525 | /* The array of struct pages - for discontigmem use pgdat->lmem_map */ | ||
| 526 | extern struct page *mem_map; | ||
| 527 | #endif | ||
| 528 | |||
| 529 | static __always_inline void *lowmem_page_address(struct page *page) | 499 | static __always_inline void *lowmem_page_address(struct page *page) |
| 530 | { | 500 | { |
| 531 | return __va(page_to_pfn(page) << PAGE_SHIFT); | 501 | return __va(page_to_pfn(page) << PAGE_SHIFT); |
| @@ -625,6 +595,12 @@ static inline int page_mapped(struct page *page) | |||
| 625 | #define NOPAGE_OOM ((struct page *) (-1)) | 595 | #define NOPAGE_OOM ((struct page *) (-1)) |
| 626 | 596 | ||
| 627 | /* | 597 | /* |
| 598 | * Error return values for the *_nopfn functions | ||
| 599 | */ | ||
| 600 | #define NOPFN_SIGBUS ((unsigned long) -1) | ||
| 601 | #define NOPFN_OOM ((unsigned long) -2) | ||
| 602 | |||
| 603 | /* | ||
| 628 | * Different kinds of faults, as returned by handle_mm_fault(). | 604 | * Different kinds of faults, as returned by handle_mm_fault(). |
| 629 | * Used to decide whether a process gets delivered SIGBUS or | 605 | * Used to decide whether a process gets delivered SIGBUS or |
| 630 | * just gets major/minor fault counters bumped up. | 606 | * just gets major/minor fault counters bumped up. |
| @@ -802,6 +778,39 @@ struct shrinker; | |||
| 802 | extern struct shrinker *set_shrinker(int, shrinker_t); | 778 | extern struct shrinker *set_shrinker(int, shrinker_t); |
| 803 | extern void remove_shrinker(struct shrinker *shrinker); | 779 | extern void remove_shrinker(struct shrinker *shrinker); |
| 804 | 780 | ||
| 781 | /* | ||
| 782 | * Some shared mappigns will want the pages marked read-only | ||
| 783 | * to track write events. If so, we'll downgrade vm_page_prot | ||
| 784 | * to the private version (using protection_map[] without the | ||
| 785 | * VM_SHARED bit). | ||
| 786 | */ | ||
| 787 | static inline int vma_wants_writenotify(struct vm_area_struct *vma) | ||
| 788 | { | ||
| 789 | unsigned int vm_flags = vma->vm_flags; | ||
| 790 | |||
| 791 | /* If it was private or non-writable, the write bit is already clear */ | ||
| 792 | if ((vm_flags & (VM_WRITE|VM_SHARED)) != ((VM_WRITE|VM_SHARED))) | ||
| 793 | return 0; | ||
| 794 | |||
| 795 | /* The backer wishes to know when pages are first written to? */ | ||
| 796 | if (vma->vm_ops && vma->vm_ops->page_mkwrite) | ||
| 797 | return 1; | ||
| 798 | |||
| 799 | /* The open routine did something to the protections already? */ | ||
| 800 | if (pgprot_val(vma->vm_page_prot) != | ||
| 801 | pgprot_val(protection_map[vm_flags & | ||
| 802 | (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)])) | ||
| 803 | return 0; | ||
| 804 | |||
| 805 | /* Specialty mapping? */ | ||
| 806 | if (vm_flags & (VM_PFNMAP|VM_INSERTPAGE)) | ||
| 807 | return 0; | ||
| 808 | |||
| 809 | /* Can the mapping track the dirty pages? */ | ||
| 810 | return vma->vm_file && vma->vm_file->f_mapping && | ||
| 811 | mapping_cap_account_dirty(vma->vm_file->f_mapping); | ||
| 812 | } | ||
| 813 | |||
| 805 | extern pte_t *FASTCALL(get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl)); | 814 | extern pte_t *FASTCALL(get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl)); |
| 806 | 815 | ||
| 807 | int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address); | 816 | int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address); |
| @@ -879,6 +888,56 @@ extern void free_area_init(unsigned long * zones_size); | |||
| 879 | extern void free_area_init_node(int nid, pg_data_t *pgdat, | 888 | extern void free_area_init_node(int nid, pg_data_t *pgdat, |
| 880 | unsigned long * zones_size, unsigned long zone_start_pfn, | 889 | unsigned long * zones_size, unsigned long zone_start_pfn, |
| 881 | unsigned long *zholes_size); | 890 | unsigned long *zholes_size); |
| 891 | #ifdef CONFIG_ARCH_POPULATES_NODE_MAP | ||
| 892 | /* | ||
| 893 | * With CONFIG_ARCH_POPULATES_NODE_MAP set, an architecture may initialise its | ||
| 894 | * zones, allocate the backing mem_map and account for memory holes in a more | ||
| 895 | * architecture independent manner. This is a substitute for creating the | ||
| 896 | * zone_sizes[] and zholes_size[] arrays and passing them to | ||
| 897 | * free_area_init_node() | ||
| 898 | * | ||
| 899 | * An architecture is expected to register range of page frames backed by | ||
| 900 | * physical memory with add_active_range() before calling | ||
| 901 | * free_area_init_nodes() passing in the PFN each zone ends at. At a basic | ||
| 902 | * usage, an architecture is expected to do something like | ||
| 903 | * | ||
| 904 | * unsigned long max_zone_pfns[MAX_NR_ZONES] = {max_dma, max_normal_pfn, | ||
| 905 | * max_highmem_pfn}; | ||
| 906 | * for_each_valid_physical_page_range() | ||
| 907 | * add_active_range(node_id, start_pfn, end_pfn) | ||
| 908 | * free_area_init_nodes(max_zone_pfns); | ||
| 909 | * | ||
| 910 | * If the architecture guarantees that there are no holes in the ranges | ||
| 911 | * registered with add_active_range(), free_bootmem_active_regions() | ||
| 912 | * will call free_bootmem_node() for each registered physical page range. | ||
| 913 | * Similarly sparse_memory_present_with_active_regions() calls | ||
| 914 | * memory_present() for each range when SPARSEMEM is enabled. | ||
| 915 | * | ||
| 916 | * See mm/page_alloc.c for more information on each function exposed by | ||
| 917 | * CONFIG_ARCH_POPULATES_NODE_MAP | ||
| 918 | */ | ||
| 919 | extern void free_area_init_nodes(unsigned long *max_zone_pfn); | ||
| 920 | extern void add_active_range(unsigned int nid, unsigned long start_pfn, | ||
| 921 | unsigned long end_pfn); | ||
| 922 | extern void shrink_active_range(unsigned int nid, unsigned long old_end_pfn, | ||
| 923 | unsigned long new_end_pfn); | ||
| 924 | extern void push_node_boundaries(unsigned int nid, unsigned long start_pfn, | ||
| 925 | unsigned long end_pfn); | ||
| 926 | extern void remove_all_active_ranges(void); | ||
| 927 | extern unsigned long absent_pages_in_range(unsigned long start_pfn, | ||
| 928 | unsigned long end_pfn); | ||
| 929 | extern void get_pfn_range_for_nid(unsigned int nid, | ||
| 930 | unsigned long *start_pfn, unsigned long *end_pfn); | ||
| 931 | extern unsigned long find_min_pfn_with_active_regions(void); | ||
| 932 | extern unsigned long find_max_pfn_with_active_regions(void); | ||
| 933 | extern void free_bootmem_with_active_regions(int nid, | ||
| 934 | unsigned long max_low_pfn); | ||
| 935 | extern void sparse_memory_present_with_active_regions(int nid); | ||
| 936 | #ifndef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID | ||
| 937 | extern int early_pfn_to_nid(unsigned long pfn); | ||
| 938 | #endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */ | ||
| 939 | #endif /* CONFIG_ARCH_POPULATES_NODE_MAP */ | ||
| 940 | extern void set_dma_reserve(unsigned long new_dma_reserve); | ||
| 882 | extern void memmap_init_zone(unsigned long, int, unsigned long, unsigned long); | 941 | extern void memmap_init_zone(unsigned long, int, unsigned long, unsigned long); |
| 883 | extern void setup_per_zone_pages_min(void); | 942 | extern void setup_per_zone_pages_min(void); |
| 884 | extern void mem_init(void); | 943 | extern void mem_init(void); |
| @@ -1072,7 +1131,7 @@ void drop_slab(void); | |||
| 1072 | extern int randomize_va_space; | 1131 | extern int randomize_va_space; |
| 1073 | #endif | 1132 | #endif |
| 1074 | 1133 | ||
| 1075 | const char *arch_vma_name(struct vm_area_struct *vma); | 1134 | __attribute__((weak)) const char *arch_vma_name(struct vm_area_struct *vma); |
| 1076 | 1135 | ||
| 1077 | #endif /* __KERNEL__ */ | 1136 | #endif /* __KERNEL__ */ |
| 1078 | #endif /* _LINUX_MM_H */ | 1137 | #endif /* _LINUX_MM_H */ |
