From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Dave Hansen <dave@linux.vnet.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
pavel@suse.cz, linux-kernel@vger.kernel.org,
linux-pm@lists.osdl.org,
Matt Tolentino <matthew.e.tolentino@intel.com>,
Dave Hansen <haveblue@us.ibm.com>,
linux-mm@kvack.org, Mel Gorman <mel@skynet.ie>,
Andy Whitcroft <apw@shadowen.org>
Subject: Re: [PATCH] hibernation should work ok with memory hotplug
Date: Tue, 4 Nov 2008 01:29:34 +0100 [thread overview]
Message-ID: <200811040129.35335.rjw@sisk.pl> (raw)
In-Reply-To: <1225753819.12673.518.camel@nimitz>
On Tuesday, 4 of November 2008, Dave Hansen wrote:
> On Tue, 2008-11-04 at 00:05 +0100, Rafael J. Wysocki wrote:
> > On Monday, 3 of November 2008, Dave Hansen wrote:
> > > But, as I think about it, there is another issue that we need to
> > > address, CONFIG_NODES_SPAN_OTHER_NODES.
> > >
> > > A node might have a node_start_pfn=0 and a node_end_pfn=100 (and it may
> > > have only one zone). But, there may be another node with
> > > node_start_pfn=10 and a node_end_pfn=20. This loop:
> > >
> > > for_each_zone(zone) {
> > > ...
> > > for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++)
> > > if (page_is_saveable(zone, pfn))
> > > memory_bm_set_bit(orig_bm, pfn);
> > > }
> > >
> > > will walk over the smaller node's pfn range multiple times. Is this OK?
> >
> > Hm, well, I'm not really sure at the moment.
> >
> > Does it mean that, in your example, the pfns 10 to 20 from the first node
> > refer to the same page frames that are referred to by the pfns from the
> > second node?
>
> Maybe using pfns didn't make for a good example. I could have used
> physical addresses as well.
>
> All that I'm saying is that nodes (and zones) can span other nodes (and
> zones). This means that the address ranges making up that node can
> overlap with the address ranges of another node. This doesn't mean that
> *each* node has those address ranges. Each individual address can only
> be in one node.
>
> Since zone *ranges* overlap, you can't tell to which zone a page belongs
> simply from its address. You need to ask the 'struct page'.
Understood.
This means that some zones may contain some ranges of pfns that correspond
to struct pages in another zone, correct?
> > > I think all you have to do to fix it is check page_zone(page) == zone
> > > and skip out if they don't match.
> >
> > Well, probably. I need to know exactly what's the relationship between pfns,
> > pages and physical page frames in that case.
>
> 1 pfn == 1 'struct page' == 1 physical page
>
> The only exception to that is that we may have more 'struct pages' than
> we have actual physical memory due to rounding and so forth.
OK, I think that the appended patch will do the trick (compiled, untested).
Thanks,
Rafael
Not-yet-signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
kernel/power/snapshot.c | 23 ++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)
Index: linux-2.6/kernel/power/snapshot.c
===================================================================
--- linux-2.6.orig/kernel/power/snapshot.c
+++ linux-2.6/kernel/power/snapshot.c
@@ -817,8 +817,7 @@ static unsigned int count_free_highmem_p
* We should save the page if it isn't Nosave or NosaveFree, or Reserved,
* and it isn't a part of a free chunk of pages.
*/
-
-static struct page *saveable_highmem_page(unsigned long pfn)
+static struct page *saveable_highmem_page(struct zone *zone, unsigned long pfn)
{
struct page *page;
@@ -826,6 +825,8 @@ static struct page *saveable_highmem_pag
return NULL;
page = pfn_to_page(pfn);
+ if (page_zone(page) != zone)
+ return NULL;
BUG_ON(!PageHighMem(page));
@@ -855,13 +856,16 @@ unsigned int count_highmem_pages(void)
mark_free_pages(zone);
max_zone_pfn = zone->zone_start_pfn + zone->spanned_pages;
for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++)
- if (saveable_highmem_page(pfn))
+ if (saveable_highmem_page(zone, pfn))
n++;
}
return n;
}
#else
-static inline void *saveable_highmem_page(unsigned long pfn) { return NULL; }
+static inline void *saveable_highmem_page(struct zone *z, unsigned long p)
+{
+ return NULL;
+}
#endif /* CONFIG_HIGHMEM */
/**
@@ -872,8 +876,7 @@ static inline void *saveable_highmem_pag
* of pages statically defined as 'unsaveable', and it isn't a part of
* a free chunk of pages.
*/
-
-static struct page *saveable_page(unsigned long pfn)
+static struct page *saveable_page(struct zone *zone, unsigned long pfn)
{
struct page *page;
@@ -881,6 +884,8 @@ static struct page *saveable_page(unsign
return NULL;
page = pfn_to_page(pfn);
+ if (page_zone(page) != zone)
+ return NULL;
BUG_ON(PageHighMem(page));
@@ -912,7 +917,7 @@ unsigned int count_data_pages(void)
mark_free_pages(zone);
max_zone_pfn = zone->zone_start_pfn + zone->spanned_pages;
for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++)
- if(saveable_page(pfn))
+ if(saveable_page(zone, pfn))
n++;
}
return n;
@@ -953,7 +958,7 @@ static inline struct page *
page_is_saveable(struct zone *zone, unsigned long pfn)
{
return is_highmem(zone) ?
- saveable_highmem_page(pfn) : saveable_page(pfn);
+ saveable_highmem_page(zone, pfn) : saveable_page(zone, pfn);
}
static void copy_data_page(unsigned long dst_pfn, unsigned long src_pfn)
@@ -984,7 +989,7 @@ static void copy_data_page(unsigned long
}
}
#else
-#define page_is_saveable(zone, pfn) saveable_page(pfn)
+#define page_is_saveable(zone, pfn) saveable_page(zone, pfn)
static inline void copy_data_page(unsigned long dst_pfn, unsigned long src_pfn)
{
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2008-11-04 0:29 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20081029105956.GA16347@atrey.karlin.mff.cuni.cz>
[not found] ` <200810291325.01481.rjw@sisk.pl>
2008-11-03 20:51 ` Andrew Morton
2008-11-03 21:18 ` [linux-pm] " Nigel Cunningham
2008-11-03 21:21 ` Dave Hansen
2008-11-03 22:24 ` Rafael J. Wysocki
2008-11-03 22:34 ` Dave Hansen
2008-11-03 23:05 ` Rafael J. Wysocki
2008-11-03 23:10 ` Dave Hansen
2008-11-04 0:29 ` Rafael J. Wysocki [this message]
2008-11-04 0:52 ` Dave Hansen
2008-11-03 23:39 ` Andy Whitcroft
2008-11-04 4:02 ` [linux-pm] " Nigel Cunningham
2008-11-04 7:08 ` Rafael J. Wysocki
2008-11-04 7:36 ` Dave Hansen
2008-11-04 8:54 ` Rafael J. Wysocki
2008-11-04 15:21 ` Dave Hansen
2008-11-04 15:35 ` Rafael J. Wysocki
2008-11-04 15:39 ` Dave Hansen
2008-11-04 16:34 ` Rafael J. Wysocki
2008-11-04 16:59 ` Dave Hansen
2008-11-05 0:38 ` KAMEZAWA Hiroyuki
2008-11-05 11:08 ` Rafael J. Wysocki
2008-11-06 0:14 ` KAMEZAWA Hiroyuki
2008-11-06 0:28 ` Dave Hansen
2008-11-06 0:53 ` KAMEZAWA Hiroyuki
2008-11-06 2:03 ` Nigel Cunningham
2008-11-06 2:13 ` KAMEZAWA Hiroyuki
2008-11-06 14:47 ` Alan Stern
2008-11-07 1:09 ` KAMEZAWA Hiroyuki
2008-11-06 8:47 ` Pavel Machek
2008-11-06 1:17 ` KAMEZAWA Hiroyuki
2008-11-06 1:43 ` Nigel Cunningham
2008-11-06 1:54 ` KAMEZAWA Hiroyuki
2008-11-06 1:59 ` KAMEZAWA Hiroyuki
2008-11-06 2:00 ` Nigel Cunningham
2008-11-06 2:07 ` KAMEZAWA Hiroyuki
2008-11-06 3:12 ` KAMEZAWA Hiroyuki
2008-11-06 3:28 ` Yasunori Goto
2008-11-06 6:04 ` KAMEZAWA Hiroyuki
2008-11-06 14:48 ` Alan Stern
2008-11-06 20:46 ` Nigel Cunningham
2008-11-06 9:12 ` Pavel Machek
2008-11-06 9:12 ` KAMEZAWA Hiroyuki
2008-11-06 9:26 ` Nigel Cunningham
2008-11-06 14:43 ` Alan Stern
2008-11-04 7:09 ` Dave Hansen
2008-11-04 7:30 ` Nigel Cunningham
2008-11-04 7:53 ` Dave Hansen
2008-11-05 9:10 ` Nigel Cunningham
2008-11-05 10:58 ` Rafael J. Wysocki
2008-11-05 16:23 ` Dave Hansen
2008-11-06 12:28 ` Pavel Machek
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=200811040129.35335.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=akpm@linux-foundation.org \
--cc=apw@shadowen.org \
--cc=dave@linux.vnet.ibm.com \
--cc=haveblue@us.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-pm@lists.osdl.org \
--cc=matthew.e.tolentino@intel.com \
--cc=mel@skynet.ie \
--cc=pavel@suse.cz \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox