All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wu Zhangjin <wuzhangjin@gmail.com>
To: Ralf Baechle <ralf@linux-mips.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
	linux-mips@linux-mips.org, Pavel Machek <pavel@ucw.cz>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Subject: Re: [PATCH] [MIPS] Hibernation: only save pages in system ram
Date: Fri, 03 Jul 2009 11:21:37 +0800	[thread overview]
Message-ID: <1246591297.27828.165.camel@falcon> (raw)
In-Reply-To: <20090702232205.GE14804@linux-mips.org>

On Fri, 2009-07-03 at 00:22 +0100, Ralf Baechle wrote:
> On Tue, Jun 30, 2009 at 10:52:50PM +0800, Wu Zhangjin wrote:
> 
> > From: Wu Zhangjin <wuzj@lemote.com>
> > 
> > when using hibernation(STD) with CONFIG_FLATMEM in linux-mips-64bit, it
> > fails for the current mips-specific hibernation implementation save the
> > pages in all of the memory space(except the nosave section) and make
> > there will be not enough memory left to the STD task itself, and then
> > fail. in reality, we only need to save the pages in system rams.
> > 
> > here is the reason why it fail:
> > 
> > kernel/power/snapshot.c:
> > 
> > static void mark_nosave_pages(struct memory_bitmap *bm)
> > {
> > 		...
> > 		if (pfn_valid(pfn)) {
> > 			...
> > 		}
> > }
> > 
> > arch/mips/include/asm/page.h:
> > 
> > 	...
> > 	#ifdef CONFIG_FLATMEM
> > 
> > 	#define pfn_valid(pfn)		((pfn) >= ARCH_PFN_OFFSET && (pfn) < max_mapnr)
> > 
> > 	#elif defined(CONFIG_SPARSEMEM)
> > 
> > 	/* pfn_valid is defined in linux/mmzone.h */
> > 	...
> > 
> > we can rewrite pfn_valid(pfn) to fix this problem, but I really do not
> > want to touch such a widely-used macro, so, I used another solution:
> > 
> > static struct page *saveable_page(struct zone *zone, unsigned long pfn)
> > {
> > 	...
> > 	if ( .... pfn_is_nosave(pfn)
> > 		return NULL;
> > 	...
> > }
> > 
> > and pfn_is_nosave is implemented in arch/mips/power/cpu.c, so, hacking
> > this one is better.
> 
> No - pfn_valid() is broken, so it should be fixed.  Commit
> 752fbeb2e3555c0d236e992f1195fd7ce30e728d introduced the breakage.  It
> seemed to assume that the valid range for PFNs doesn't start at 0 but
> some higher number but got that entirely wrong..
> 
> #define ARCH_PFN_OFFSET         PFN_UP(PHYS_OFFSET)
> #define pfn_valid(pfn)         ((pfn) >= ARCH_PFN_OFFSET && (pfn) < max_mapnr)
> 
> works nicely when PHYS_OFFSET is 0 - as for most MIPS systems and goes
> horribly wrong otherwise.  So I suggest below patch.

Just test it with the latest master branch of linux-mips on fulong2e,
Your patch works well, thanks!

(BTW: of course, the ide-relative bug is also there even with Bart's
patch, so, currently, I just revert this part of the ide patch: "ide:
improve handling of Power Management requests" to test your patch: 

diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
index d5f3c77..8c4608c 100644
--- a/drivers/ide/ide-io.c
+++ b/drivers/ide/ide-io.c
@@ -468,12 +468,12 @@ void do_ide_request(struct request_queue *q)
                ide_hwif_t *prev_port;
 repeat:
                prev_port = hwif->host->cur_port;
-
+/*
                if (drive->dev_flags & IDE_DFLAG_BLOCKED)
                        rq = hwif->rq;
                else
                        WARN_ON_ONCE(hwif->rq);
-
+*/
                if (drive->dev_flags & IDE_DFLAG_SLEEPING &&
                    time_after(drive->sleep, jiffies)) {
                        ide_unlock_port(hwif);

So, I will try to test Bart's patch with linux-next, I'm cloning it
currently! perhaps there is something missing in my git repo or the
linux-mips git repo? because i can not apply bart's patch neither to my
git repo nor to the master branch of linux-mips git repo directly, even
if pulled linux-next and Davie's ide-2.6 in.
)

Regards,
Wu Zhangjin

> 
>   Ralf
> 
> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
> 
>  arch/mips/include/asm/page.h |    9 ++++++++-
>  1 files changed, 8 insertions(+), 1 deletions(-)
> 
> diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h
> index dc0eaa7..96a14a4 100644
> --- a/arch/mips/include/asm/page.h
> +++ b/arch/mips/include/asm/page.h
> @@ -165,7 +165,14 @@ typedef struct { unsigned long pgprot; } pgprot_t;
>  
>  #ifdef CONFIG_FLATMEM
>  
> -#define pfn_valid(pfn)		((pfn) >= ARCH_PFN_OFFSET && (pfn) < max_mapnr)
> +#define pfn_valid(pfn)							\
> +({									\
> +	unsigned long __pfn = (pfn);					\
> +	/* avoid <linux/bootmem.h> include hell */			\
> +	extern unsigned long min_low_pfn;				\
> +									\
> +	__pfn >= min_low_pfn && __pfn < max_mapnr;			\
> +})
>  
>  #elif defined(CONFIG_SPARSEMEM)
>  

  reply	other threads:[~2009-07-03  3:27 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-30 14:52 [PATCH] [MIPS] Hibernation: only save pages in system ram Wu Zhangjin
2009-07-02 21:45 ` Pavel Machek
2009-07-02 23:22 ` Ralf Baechle
2009-07-03  3:21   ` Wu Zhangjin [this message]
2009-07-03  4:05     ` Wu Zhangjin
2009-07-02 23:22 ` Rafael J. Wysocki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1246591297.27828.165.camel@falcon \
    --to=wuzhangjin@gmail.com \
    --cc=bzolnier@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@linux-mips.org \
    --cc=pavel@ucw.cz \
    --cc=ralf@linux-mips.org \
    --cc=rjw@sisk.pl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.