Merge commit 'v2.6.36-rc7' into core/memblock
Merge reason: Update from -rc3 to -rc7. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
@@ -589,13 +589,13 @@ static void free_pcppages_bulk(struct zone *zone, int count,
|
||||
{
|
||||
int migratetype = 0;
|
||||
int batch_free = 0;
|
||||
int to_free = count;
|
||||
|
||||
spin_lock(&zone->lock);
|
||||
zone->all_unreclaimable = 0;
|
||||
zone->pages_scanned = 0;
|
||||
|
||||
__mod_zone_page_state(zone, NR_FREE_PAGES, count);
|
||||
while (count) {
|
||||
while (to_free) {
|
||||
struct page *page;
|
||||
struct list_head *list;
|
||||
|
||||
@@ -620,8 +620,9 @@ static void free_pcppages_bulk(struct zone *zone, int count,
|
||||
/* MIGRATE_MOVABLE list may include MIGRATE_RESERVEs */
|
||||
__free_one_page(page, zone, 0, page_private(page));
|
||||
trace_mm_page_pcpu_drain(page, 0, page_private(page));
|
||||
} while (--count && --batch_free && !list_empty(list));
|
||||
} while (--to_free && --batch_free && !list_empty(list));
|
||||
}
|
||||
__mod_zone_page_state(zone, NR_FREE_PAGES, count);
|
||||
spin_unlock(&zone->lock);
|
||||
}
|
||||
|
||||
@@ -632,8 +633,8 @@ static void free_one_page(struct zone *zone, struct page *page, int order,
|
||||
zone->all_unreclaimable = 0;
|
||||
zone->pages_scanned = 0;
|
||||
|
||||
__mod_zone_page_state(zone, NR_FREE_PAGES, 1 << order);
|
||||
__free_one_page(page, zone, order, migratetype);
|
||||
__mod_zone_page_state(zone, NR_FREE_PAGES, 1 << order);
|
||||
spin_unlock(&zone->lock);
|
||||
}
|
||||
|
||||
@@ -1462,7 +1463,7 @@ int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
|
||||
{
|
||||
/* free_pages my go negative - that's OK */
|
||||
long min = mark;
|
||||
long free_pages = zone_page_state(z, NR_FREE_PAGES) - (1 << order) + 1;
|
||||
long free_pages = zone_nr_free_pages(z) - (1 << order) + 1;
|
||||
int o;
|
||||
|
||||
if (alloc_flags & ALLOC_HIGH)
|
||||
@@ -1847,6 +1848,7 @@ __alloc_pages_direct_reclaim(gfp_t gfp_mask, unsigned int order,
|
||||
struct page *page = NULL;
|
||||
struct reclaim_state reclaim_state;
|
||||
struct task_struct *p = current;
|
||||
bool drained = false;
|
||||
|
||||
cond_resched();
|
||||
|
||||
@@ -1865,14 +1867,25 @@ __alloc_pages_direct_reclaim(gfp_t gfp_mask, unsigned int order,
|
||||
|
||||
cond_resched();
|
||||
|
||||
if (order != 0)
|
||||
drain_all_pages();
|
||||
if (unlikely(!(*did_some_progress)))
|
||||
return NULL;
|
||||
|
||||
if (likely(*did_some_progress))
|
||||
page = get_page_from_freelist(gfp_mask, nodemask, order,
|
||||
retry:
|
||||
page = get_page_from_freelist(gfp_mask, nodemask, order,
|
||||
zonelist, high_zoneidx,
|
||||
alloc_flags, preferred_zone,
|
||||
migratetype);
|
||||
|
||||
/*
|
||||
* If an allocation failed after direct reclaim, it could be because
|
||||
* pages are pinned on the per-cpu lists. Drain them and try again
|
||||
*/
|
||||
if (!page && !drained) {
|
||||
drain_all_pages();
|
||||
drained = true;
|
||||
goto retry;
|
||||
}
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
@@ -2424,7 +2437,7 @@ void show_free_areas(void)
|
||||
" all_unreclaimable? %s"
|
||||
"\n",
|
||||
zone->name,
|
||||
K(zone_page_state(zone, NR_FREE_PAGES)),
|
||||
K(zone_nr_free_pages(zone)),
|
||||
K(min_wmark_pages(zone)),
|
||||
K(low_wmark_pages(zone)),
|
||||
K(high_wmark_pages(zone)),
|
||||
|
||||
Reference in New Issue
Block a user