include/linux/swap.h | 2 ++ kernel/power/tuxonice_prepare_image.c | 16 ++++++++++++---- mm/vmscan.c | 10 ++++++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff -ruNp 991-per-zone-type-memory-freeing.patch-old/include/linux/swap.h 991-per-zone-type-memory-freeing.patch-new/include/linux/swap.h --- 991-per-zone-type-memory-freeing.patch-old/include/linux/swap.h 2010-04-13 13:46:54.000000000 +1000 +++ 991-per-zone-type-memory-freeing.patch-new/include/linux/swap.h 2010-04-11 08:47:25.000000000 +1000 @@ -252,6 +252,8 @@ extern unsigned long mem_cgroup_shrink_n int nid); extern int __isolate_lru_page(struct page *page, int mode, int file); extern unsigned long shrink_all_memory(unsigned long nr_pages); +extern unsigned long shrink_memory_mask(unsigned long nr_to_reclaim, + gfp_t mask); extern int vm_swappiness; extern int remove_mapping(struct address_space *mapping, struct page *page); extern long vm_total_pages; diff -ruNp 991-per-zone-type-memory-freeing.patch-old/kernel/power/tuxonice_prepare_image.c 991-per-zone-type-memory-freeing.patch-new/kernel/power/tuxonice_prepare_image.c --- 991-per-zone-type-memory-freeing.patch-old/kernel/power/tuxonice_prepare_image.c 2010-04-13 13:46:56.000000000 +1000 +++ 991-per-zone-type-memory-freeing.patch-new/kernel/power/tuxonice_prepare_image.c 2010-04-13 13:30:32.000000000 +1000 @@ -978,7 +978,10 @@ static void eat_memory(void) if (amount_wanted > 0 && !test_result_state(TOI_ABORTED) && image_size_limit != -1) { - unsigned long request = amount_wanted + 50; + unsigned long request = amount_wanted; + unsigned long high_req = max(highpages_ps1_to_free(), + any_to_free(1)); + unsigned long low_req = lowpages_ps1_to_free(); toi_prepare_status(CLEAR_BAR, "Seeking to free %ldMB of memory.", @@ -990,7 +993,11 @@ static void eat_memory(void) * Ask for too many because shrink_all_memory doesn't * currently return enough most of the time. */ - shrink_all_memory(request); + + if (high_req) + shrink_memory_mask(high_req, GFP_HIGHUSER); + if (low_req) + shrink_memory_mask(low_req, GFP_KERNEL); did_eat_memory = 1; @@ -998,8 +1005,9 @@ static void eat_memory(void) amount_wanted = amount_needed(1); - printk(KERN_DEBUG "Asked shrink_all_memory for %ld pages," - "got %ld.\n", request, + printk(KERN_DEBUG "Asked shrink_all_memory for %ld low pages &" + " %ld pages from anywhere, got %ld.\n", + high_req, low_req, request - amount_wanted); toi_cond_pause(0, NULL); diff -ruNp 991-per-zone-type-memory-freeing.patch-old/mm/vmscan.c 991-per-zone-type-memory-freeing.patch-new/mm/vmscan.c --- 991-per-zone-type-memory-freeing.patch-old/mm/vmscan.c 2010-04-13 13:46:56.000000000 +1000 +++ 991-per-zone-type-memory-freeing.patch-new/mm/vmscan.c 2010-04-11 08:36:55.000000000 +1000 @@ -2344,11 +2344,11 @@ unsigned long zone_reclaimable_pages(str * LRU order by reclaiming preferentially * inactive > active > active referenced > active mapped */ -unsigned long shrink_all_memory(unsigned long nr_to_reclaim) +unsigned long shrink_memory_mask(unsigned long nr_to_reclaim, gfp_t mask) { struct reclaim_state reclaim_state; struct scan_control sc = { - .gfp_mask = GFP_HIGHUSER_MOVABLE, + .gfp_mask = mask, .may_swap = 1, .may_unmap = 1, .may_writepage = 1, @@ -2375,6 +2375,12 @@ unsigned long shrink_all_memory(unsigned return nr_reclaimed; } +EXPORT_SYMBOL_GPL(shrink_memory_mask); + +unsigned long shrink_all_memory(unsigned long nr_to_reclaim) +{ + return shrink_memory_mask(nr_to_reclaim, GFP_HIGHUSER_MOVABLE); +} EXPORT_SYMBOL_GPL(shrink_all_memory); #endif /* CONFIG_HIBERNATION */