diff options
Diffstat (limited to 'mm/mmzone.c')
| -rw-r--r-- | mm/mmzone.c | 42 | 
1 files changed, 24 insertions, 18 deletions
diff --git a/mm/mmzone.c b/mm/mmzone.c index e35bfb82c85..bf34fb8556d 100644 --- a/mm/mmzone.c +++ b/mm/mmzone.c @@ -1,14 +1,13 @@  /*   * linux/mm/mmzone.c   * - * management codes for pgdats and zones. + * management codes for pgdats, zones and page flags   */  #include <linux/stddef.h>  #include <linux/mm.h>  #include <linux/mmzone.h> -#include <linux/module.h>  struct pglist_data *first_online_pgdat(void)  { @@ -88,23 +87,30 @@ int memmap_valid_within(unsigned long pfn,  }  #endif /* CONFIG_ARCH_HAS_HOLES_MEMORYMODEL */ -#ifdef CONFIG_SMP -/* Called when a more accurate view of NR_FREE_PAGES is needed */ -unsigned long zone_nr_free_pages(struct zone *zone) +void lruvec_init(struct lruvec *lruvec)  { -	unsigned long nr_free_pages = zone_page_state(zone, NR_FREE_PAGES); +	enum lru_list lru; -	/* -	 * While kswapd is awake, it is considered the zone is under some -	 * memory pressure. Under pressure, there is a risk that -	 * per-cpu-counter-drift will allow the min watermark to be breached -	 * potentially causing a live-lock. While kswapd is awake and -	 * free pages are low, get a better estimate for free pages -	 */ -	if (nr_free_pages < zone->percpu_drift_mark && -			!waitqueue_active(&zone->zone_pgdat->kswapd_wait)) -		return zone_page_state_snapshot(zone, NR_FREE_PAGES); +	memset(lruvec, 0, sizeof(struct lruvec)); + +	for_each_lru(lru) +		INIT_LIST_HEAD(&lruvec->lists[lru]); +} + +#if defined(CONFIG_NUMA_BALANCING) && !defined(LAST_CPUPID_NOT_IN_PAGE_FLAGS) +int page_cpupid_xchg_last(struct page *page, int cpupid) +{ +	unsigned long old_flags, flags; +	int last_cpupid; + +	do { +		old_flags = flags = page->flags; +		last_cpupid = page_cpupid_last(page); + +		flags &= ~(LAST_CPUPID_MASK << LAST_CPUPID_PGSHIFT); +		flags |= (cpupid & LAST_CPUPID_MASK) << LAST_CPUPID_PGSHIFT; +	} while (unlikely(cmpxchg(&page->flags, old_flags, flags) != old_flags)); -	return nr_free_pages; +	return last_cpupid;  } -#endif /* CONFIG_SMP */ +#endif  | 
