Re: Userland swsusp failure (mm-related)

From: Pavel Machek
Date: Tue Apr 11 2006 - 17:37:13 EST


Hi!

> > Rafael J. Wysocki wrote:
> > >>>Well, it looks like we didn't free enough RAM for suspend in this case.
> > >>>Unfortunately we were below the min watermark for ZONE_NORMAL and
> > >>>we tried to allocate with GFP_ATOMIC (Nick, shouldn't we fall back to
> > >>>ZONE_DMA in this case?).
> > >>>
> > >>>I think we can safely ignore the watermarks in swsusp, so probably
> > >>>we can set PF_MEMALLOC for the current task temporarily and reset
> > >>>it when we have allocated memory. Pavel, what do you think?
> > >>
> > >>Seems little hacky but okay to me.
> > >>
> > >>Should not fixing "how much to free" computation to free a bit more be
> > >>enough to handle this?
> > >
> > >
> > > Yes, but in that case we'll leave some memory unused. ;-)
> > >
> >
> > Probably doesn't fall back to ZONE_DMA because of lowmem reserve.
> > Yes, PF_MEMALLOC sounds like it might do what you want. A little
> > hackish perhaps, but better than putting swsusp special cases
> > into page_alloc.c.
>
> The appended patch contains the changes I'd like to make. Pavel, is that
> acceptable?

Why is PF_MEMALLOC only neccessary for pagedir allocations, and not
for normal page allocations, too?


> Rafael
>
> ---
> kernel/power/snapshot.c | 10 ++++++++--
> 1 files changed, 8 insertions(+), 2 deletions(-)
>
> Index: linux-2.6.17-rc1-mm2/kernel/power/snapshot.c
> ===================================================================
> --- linux-2.6.17-rc1-mm2.orig/kernel/power/snapshot.c 2006-04-08 21:29:55.000000000 +0200
> +++ linux-2.6.17-rc1-mm2/kernel/power/snapshot.c 2006-04-11 22:09:28.000000000 +0200
> @@ -461,17 +461,23 @@ static struct pbe *swsusp_alloc(unsigned
> {
> struct pbe *pblist;
>
> + /* We don't want to be affected by zone watermarks etc. */
> + current->flags |= PF_MEMALLOC;
> +
> if (!(pblist = alloc_pagedir(nr_pages, GFP_ATOMIC | __GFP_COLD, 0))) {
> printk(KERN_ERR "suspend: Allocating pagedir failed.\n");
> - return NULL;
> + goto out;
> }
>
> if (alloc_data_pages(pblist, GFP_ATOMIC | __GFP_COLD, 0)) {
> printk(KERN_ERR "suspend: Allocating image pages failed.\n");
> swsusp_free();
> - return NULL;
> + pblist = NULL;
> }
>
> +out:
> + current->flags &= ~PF_MEMALLOC;
> +
> return pblist;
> }
>

--
Thanks, Sharp!
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/