diff options
Diffstat (limited to 'include/linux/mmzone.h')
| -rw-r--r-- | include/linux/mmzone.h | 64 | 
1 files changed, 38 insertions, 26 deletions
| diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 9f22090df7dd..93a849f742db 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
| @@ -38,7 +38,7 @@ struct pglist_data; | |||
| 38 | #if defined(CONFIG_SMP) | 38 | #if defined(CONFIG_SMP) | 
| 39 | struct zone_padding { | 39 | struct zone_padding { | 
| 40 | char x[0]; | 40 | char x[0]; | 
| 41 | } ____cacheline_maxaligned_in_smp; | 41 | } ____cacheline_internodealigned_in_smp; | 
| 42 | #define ZONE_PADDING(name) struct zone_padding name; | 42 | #define ZONE_PADDING(name) struct zone_padding name; | 
| 43 | #else | 43 | #else | 
| 44 | #define ZONE_PADDING(name) | 44 | #define ZONE_PADDING(name) | 
| @@ -46,7 +46,6 @@ struct zone_padding { | |||
| 46 | 46 | ||
| 47 | struct per_cpu_pages { | 47 | struct per_cpu_pages { | 
| 48 | int count; /* number of pages in the list */ | 48 | int count; /* number of pages in the list */ | 
| 49 | int low; /* low watermark, refill needed */ | ||
| 50 | int high; /* high watermark, emptying needed */ | 49 | int high; /* high watermark, emptying needed */ | 
| 51 | int batch; /* chunk size for buddy add/remove */ | 50 | int batch; /* chunk size for buddy add/remove */ | 
| 52 | struct list_head list; /* the list of pages */ | 51 | struct list_head list; /* the list of pages */ | 
| @@ -99,7 +98,7 @@ struct per_cpu_pageset { | |||
| 99 | 98 | ||
| 100 | /* | 99 | /* | 
| 101 | * On machines where it is needed (eg PCs) we divide physical memory | 100 | * On machines where it is needed (eg PCs) we divide physical memory | 
| 102 | * into multiple physical zones. On a PC we have 4 zones: | 101 | * into multiple physical zones. On a 32bit PC we have 4 zones: | 
| 103 | * | 102 | * | 
| 104 | * ZONE_DMA < 16 MB ISA DMA capable memory | 103 | * ZONE_DMA < 16 MB ISA DMA capable memory | 
| 105 | * ZONE_DMA32 0 MB Empty | 104 | * ZONE_DMA32 0 MB Empty | 
| @@ -150,15 +149,17 @@ struct zone { | |||
| 150 | unsigned long pages_scanned; /* since last reclaim */ | 149 | unsigned long pages_scanned; /* since last reclaim */ | 
| 151 | int all_unreclaimable; /* All pages pinned */ | 150 | int all_unreclaimable; /* All pages pinned */ | 
| 152 | 151 | ||
| 153 | /* | ||
| 154 | * Does the allocator try to reclaim pages from the zone as soon | ||
| 155 | * as it fails a watermark_ok() in __alloc_pages? | ||
| 156 | */ | ||
| 157 | int reclaim_pages; | ||
| 158 | /* A count of how many reclaimers are scanning this zone */ | 152 | /* A count of how many reclaimers are scanning this zone */ | 
| 159 | atomic_t reclaim_in_progress; | 153 | atomic_t reclaim_in_progress; | 
| 160 | 154 | ||
| 161 | /* | 155 | /* | 
| 156 | * timestamp (in jiffies) of the last zone reclaim that did not | ||
| 157 | * result in freeing of pages. This is used to avoid repeated scans | ||
| 158 | * if all memory in the zone is in use. | ||
| 159 | */ | ||
| 160 | unsigned long last_unsuccessful_zone_reclaim; | ||
| 161 | |||
| 162 | /* | ||
| 162 | * prev_priority holds the scanning priority for this zone. It is | 163 | * prev_priority holds the scanning priority for this zone. It is | 
| 163 | * defined as the scanning priority at which we achieved our reclaim | 164 | * defined as the scanning priority at which we achieved our reclaim | 
| 164 | * target at the previous try_to_free_pages() or balance_pgdat() | 165 | * target at the previous try_to_free_pages() or balance_pgdat() | 
| @@ -234,7 +235,7 @@ struct zone { | |||
| 234 | * rarely used fields: | 235 | * rarely used fields: | 
| 235 | */ | 236 | */ | 
| 236 | char *name; | 237 | char *name; | 
| 237 | } ____cacheline_maxaligned_in_smp; | 238 | } ____cacheline_internodealigned_in_smp; | 
| 238 | 239 | ||
| 239 | 240 | ||
| 240 | /* | 241 | /* | 
| @@ -389,6 +390,11 @@ static inline struct zone *next_zone(struct zone *zone) | |||
| 389 | #define for_each_zone(zone) \ | 390 | #define for_each_zone(zone) \ | 
| 390 | for (zone = pgdat_list->node_zones; zone; zone = next_zone(zone)) | 391 | for (zone = pgdat_list->node_zones; zone; zone = next_zone(zone)) | 
| 391 | 392 | ||
| 393 | static inline int populated_zone(struct zone *zone) | ||
| 394 | { | ||
| 395 | return (!!zone->present_pages); | ||
| 396 | } | ||
| 397 | |||
| 392 | static inline int is_highmem_idx(int idx) | 398 | static inline int is_highmem_idx(int idx) | 
| 393 | { | 399 | { | 
| 394 | return (idx == ZONE_HIGHMEM); | 400 | return (idx == ZONE_HIGHMEM); | 
| @@ -398,6 +404,7 @@ static inline int is_normal_idx(int idx) | |||
| 398 | { | 404 | { | 
| 399 | return (idx == ZONE_NORMAL); | 405 | return (idx == ZONE_NORMAL); | 
| 400 | } | 406 | } | 
| 407 | |||
| 401 | /** | 408 | /** | 
| 402 | * is_highmem - helper function to quickly check if a struct zone is a | 409 | * is_highmem - helper function to quickly check if a struct zone is a | 
| 403 | * highmem zone or not. This is an attempt to keep references | 410 | * highmem zone or not. This is an attempt to keep references | 
| @@ -414,6 +421,16 @@ static inline int is_normal(struct zone *zone) | |||
| 414 | return zone == zone->zone_pgdat->node_zones + ZONE_NORMAL; | 421 | return zone == zone->zone_pgdat->node_zones + ZONE_NORMAL; | 
| 415 | } | 422 | } | 
| 416 | 423 | ||
| 424 | static inline int is_dma32(struct zone *zone) | ||
| 425 | { | ||
| 426 | return zone == zone->zone_pgdat->node_zones + ZONE_DMA32; | ||
| 427 | } | ||
| 428 | |||
| 429 | static inline int is_dma(struct zone *zone) | ||
| 430 | { | ||
| 431 | return zone == zone->zone_pgdat->node_zones + ZONE_DMA; | ||
| 432 | } | ||
| 433 | |||
| 417 | /* These two functions are used to setup the per zone pages min values */ | 434 | /* These two functions are used to setup the per zone pages min values */ | 
| 418 | struct ctl_table; | 435 | struct ctl_table; | 
| 419 | struct file; | 436 | struct file; | 
| @@ -422,6 +439,8 @@ int min_free_kbytes_sysctl_handler(struct ctl_table *, int, struct file *, | |||
| 422 | extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1]; | 439 | extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1]; | 
| 423 | int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int, struct file *, | 440 | int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int, struct file *, | 
| 424 | void __user *, size_t *, loff_t *); | 441 | void __user *, size_t *, loff_t *); | 
| 442 | int percpu_pagelist_fraction_sysctl_handler(struct ctl_table *, int, struct file *, | ||
| 443 | void __user *, size_t *, loff_t *); | ||
| 425 | 444 | ||
| 426 | #include <linux/topology.h> | 445 | #include <linux/topology.h> | 
| 427 | /* Returns the number of the current Node. */ | 446 | /* Returns the number of the current Node. */ | 
| @@ -435,7 +454,6 @@ extern struct pglist_data contig_page_data; | |||
| 435 | #define NODE_DATA(nid) (&contig_page_data) | 454 | #define NODE_DATA(nid) (&contig_page_data) | 
| 436 | #define NODE_MEM_MAP(nid) mem_map | 455 | #define NODE_MEM_MAP(nid) mem_map | 
| 437 | #define MAX_NODES_SHIFT 1 | 456 | #define MAX_NODES_SHIFT 1 | 
| 438 | #define pfn_to_nid(pfn) (0) | ||
| 439 | 457 | ||
| 440 | #else /* CONFIG_NEED_MULTIPLE_NODES */ | 458 | #else /* CONFIG_NEED_MULTIPLE_NODES */ | 
| 441 | 459 | ||
| @@ -470,6 +488,10 @@ extern struct pglist_data contig_page_data; | |||
| 470 | #define early_pfn_to_nid(nid) (0UL) | 488 | #define early_pfn_to_nid(nid) (0UL) | 
| 471 | #endif | 489 | #endif | 
| 472 | 490 | ||
| 491 | #ifdef CONFIG_FLATMEM | ||
| 492 | #define pfn_to_nid(pfn) (0) | ||
| 493 | #endif | ||
| 494 | |||
| 473 | #define pfn_to_section_nr(pfn) ((pfn) >> PFN_SECTION_SHIFT) | 495 | #define pfn_to_section_nr(pfn) ((pfn) >> PFN_SECTION_SHIFT) | 
| 474 | #define section_nr_to_pfn(sec) ((sec) << PFN_SECTION_SHIFT) | 496 | #define section_nr_to_pfn(sec) ((sec) << PFN_SECTION_SHIFT) | 
| 475 | 497 | ||
| @@ -564,11 +586,6 @@ static inline int valid_section_nr(unsigned long nr) | |||
| 564 | return valid_section(__nr_to_section(nr)); | 586 | return valid_section(__nr_to_section(nr)); | 
| 565 | } | 587 | } | 
| 566 | 588 | ||
| 567 | /* | ||
| 568 | * Given a kernel address, find the home node of the underlying memory. | ||
| 569 | */ | ||
| 570 | #define kvaddr_to_nid(kaddr) pfn_to_nid(__pa(kaddr) >> PAGE_SHIFT) | ||
| 571 | |||
| 572 | static inline struct mem_section *__pfn_to_section(unsigned long pfn) | 589 | static inline struct mem_section *__pfn_to_section(unsigned long pfn) | 
| 573 | { | 590 | { | 
| 574 | return __nr_to_section(pfn_to_section_nr(pfn)); | 591 | return __nr_to_section(pfn_to_section_nr(pfn)); | 
| @@ -598,13 +615,14 @@ static inline int pfn_valid(unsigned long pfn) | |||
| 598 | * this restriction. | 615 | * this restriction. | 
| 599 | */ | 616 | */ | 
| 600 | #ifdef CONFIG_NUMA | 617 | #ifdef CONFIG_NUMA | 
| 601 | #define pfn_to_nid early_pfn_to_nid | 618 | #define pfn_to_nid(pfn) \ | 
| 602 | #endif | ||
| 603 | |||
| 604 | #define pfn_to_pgdat(pfn) \ | ||
| 605 | ({ \ | 619 | ({ \ | 
| 606 | NODE_DATA(pfn_to_nid(pfn)); \ | 620 | unsigned long __pfn_to_nid_pfn = (pfn); \ | 
| 621 | page_to_nid(pfn_to_page(__pfn_to_nid_pfn)); \ | ||
| 607 | }) | 622 | }) | 
| 623 | #else | ||
| 624 | #define pfn_to_nid(pfn) (0) | ||
| 625 | #endif | ||
| 608 | 626 | ||
| 609 | #define early_pfn_valid(pfn) pfn_valid(pfn) | 627 | #define early_pfn_valid(pfn) pfn_valid(pfn) | 
| 610 | void sparse_init(void); | 628 | void sparse_init(void); | 
| @@ -613,12 +631,6 @@ void sparse_init(void); | |||
| 613 | #define sparse_index_init(_sec, _nid) do {} while (0) | 631 | #define sparse_index_init(_sec, _nid) do {} while (0) | 
| 614 | #endif /* CONFIG_SPARSEMEM */ | 632 | #endif /* CONFIG_SPARSEMEM */ | 
| 615 | 633 | ||
| 616 | #ifdef CONFIG_NODES_SPAN_OTHER_NODES | ||
| 617 | #define early_pfn_in_nid(pfn, nid) (early_pfn_to_nid(pfn) == (nid)) | ||
| 618 | #else | ||
| 619 | #define early_pfn_in_nid(pfn, nid) (1) | ||
| 620 | #endif | ||
| 621 | |||
| 622 | #ifndef early_pfn_valid | 634 | #ifndef early_pfn_valid | 
| 623 | #define early_pfn_valid(pfn) (1) | 635 | #define early_pfn_valid(pfn) (1) | 
| 624 | #endif | 636 | #endif | 
