Re: [Suspend2][ 07/13] [Suspend2] Page_alloc paranoia.

Nick Piggin
2006-06-27T06:11:48Z

Nigel Cunningham wrote:
> Add paranoia to the page_alloc code to ensure we don't start page reclaim
> during suspending.
>

Nack. Set PF_MEMALLOC if you must.

> Signed-off-by: Nigel Cunningham <nigel@suspend2.net>
>
> mm/page_alloc.c | 18 +++++++++++++-----
> 1 files changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 253a450..838ae19 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -25,6 +25,7 @@
> #include <linux/kernel.h>
> #include <linux/module.h>
> #include <linux/suspend.h>
> +#include <linux/freezer.h>
> #include <linux/pagevec.h>
> #include <linux/blkdev.h>
> #include <linux/slab.h>
> @@ -37,6 +38,7 @@
> #include <linux/nodemask.h>
> #include <linux/vmalloc.h>
> #include <linux/mempolicy.h>
> +#include "../kernel/power/pageflags.h"
>
> #include <asm/tlbflush.h>
> #include <asm/div64.h>
> @@ -905,7 +907,8 @@ get_page_from_freelist(gfp_t gfp_mask, u
> else
> mark = (*z)->pages_high;
> if (!zone_watermark_ok(*z, order, mark,
> - classzone_idx, alloc_flags))
> + classzone_idx, alloc_flags) &&
> + likely(!test_freezer_state(FREEZER_ON)))
> if (!zone_reclaim_mode ||
> !zone_reclaim(*z, gfp_mask, order))
> continue;
> @@ -950,10 +953,12 @@ restart:
> if (page)
> goto got_pg;
>
> - do {
> - if (cpuset_zone_allowed(*z, gfp_mask|__GFP_HARDWALL))
> - wakeup_kswapd(*z, order);
> - } while (*(++z));
> + if (likely(!test_freezer_state(FREEZER_ON))) {
> + do {
> + if (cpuset_zone_allowed(*z, gfp_mask|__GFP_HARDWALL))
> + wakeup_kswapd(*z, order);
> + } while (*(++z));
> + }
>
> /*
> * OK, we're below the kswapd watermark and have kicked background
> @@ -997,6 +1002,7 @@ nofail_alloc:
> if (page)
> goto got_pg;
> if (gfp_mask & __GFP_NOFAIL) {
> + BUG_ON(unlikely(test_freezer_state(FREEZING_COMPLETE)));
> blk_congestion_wait(WRITE, HZ/50);
> goto nofail_alloc;
> }
> @@ -1009,6 +1015,8 @@ nofail_alloc:
> goto nopage;
>
> rebalance:
> + BUG_ON(unlikely(test_freezer_state(FREEZER_ON)));
> +
> cond_resched();
>
> /* We now go into synchronous reclaim */
>
> --
> Nigel Cunningham nigel at suspend2 dot net

--
SUSE Labs, Novell Inc.
Send instant messages to your online friends http://au.messenger.yahoo.com