From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
To: Yasunori Goto <y-goto@jp.fujitsu.com>
Cc: Nigel Cunningham <ncunningham@crca.org.au>,
"Rafael J. Wysocki" <rjw@sisk.pl>,
Dave Hansen <dave@linux.vnet.ibm.com>,
Matt Tolentino <matthew.e.tolentino@intel.com>,
linux-pm@lists.osdl.org, Dave Hansen <haveblue@us.ibm.com>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org, pavel@suse.cz,
Mel Gorman <mel@skynet.ie>, Andy Whitcroft <apw@shadowen.org>,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [linux-pm] [PATCH] hibernation should work ok with memory hotplug
Date: Thu, 6 Nov 2008 15:04:05 +0900 [thread overview]
Message-ID: <20081106150405.6dd4200a.kamezawa.hiroyu@jp.fujitsu.com> (raw)
In-Reply-To: <20081106121916.4474.E1E9C6FF@jp.fujitsu.com>
On Thu, 06 Nov 2008 12:28:30 +0900
Yasunori Goto <y-goto@jp.fujitsu.com> wrote:
>
> Hmm.
>
> I think simple mutex is enough. read/write lock is not necessary.
> Memory hotplug event is very rare, and there is no requirement of
> parallel execution.
>
OK, change it to mutex and start new thread.
Thanks,
-Kame
>
> > On Thu, 6 Nov 2008 11:07:09 +0900
> > KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote:
> > > Okay. then we can add "kernel thread for calling add/remove memory" and say
> > > "PLEASE WAIT UNTIL HIBERNATION IS READY".
> > >
> > > I can try that by myself but doesn't have suitable machine....
> > > I think I can show you pseudo code in hours. please wait a bit.
> > >
> >
> > How about this one ? as a start step ?
> > I have no test environment. So please take this as a sample.
> > -Kame
> > =
> >
> > Now, MEMORY_HOTPLUG and HIBERNATION is mutually exclusive in Kconfig.
> > That's because
> > - memory hotplug changes pgdat/zone/memmap range.
> > - hibernation countes # of memory based on pgdate/zone/memmap.
> >
> > This patch adds rwsemaphore for making them not to run at the same time.
> >
> > IIUC, add_memory() is called from following places.
> > - probe interface
> > - acpi handler
> > It seems both can sleep. (acpi handler uses sleepable memory allocator etc...)
> >
> > online/offline handlers also sleeps.
> >
> > Anyway, the most difficult thing is how to test this.
> >
> >
> > Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
> >
> > mm/Kconfig | 2 -
> > mm/memory_hotplug.c | 61 +++++++++++++++++++++++++++++++++++++++++++++-------
> > 2 files changed, 54 insertions(+), 9 deletions(-)
> >
> > Index: linux-2.6.27.4/mm/memory_hotplug.c
> > ===================================================================
> > --- linux-2.6.27.4.orig/mm/memory_hotplug.c
> > +++ linux-2.6.27.4/mm/memory_hotplug.c
> > @@ -31,6 +31,13 @@
> >
> > #include "internal.h"
> >
> > +struct rw_semaphore memhp_mutex;
> > +
> > +static int init_memhp_mutex(void)
> > +{
> > + init_rwsem(&memhp_mutex);
> > +}
> > +
> > /* add this memory to iomem resource */
> > static struct resource *register_memory_resource(u64 start, u64 size)
> > {
> > @@ -381,6 +388,7 @@ int online_pages(unsigned long pfn, unsi
> > int ret;
> > struct memory_notify arg;
> >
> > + down_read(&memhp_mutex);
> > arg.start_pfn = pfn;
> > arg.nr_pages = nr_pages;
> > arg.status_change_nid = -1;
> > @@ -392,6 +400,7 @@ int online_pages(unsigned long pfn, unsi
> > ret = memory_notify(MEM_GOING_ONLINE, &arg);
> > ret = notifier_to_errno(ret);
> > if (ret) {
> > + up_read(&memhp_mutex);
> > memory_notify(MEM_CANCEL_ONLINE, &arg);
> > return ret;
> > }
> > @@ -415,6 +424,7 @@ int online_pages(unsigned long pfn, unsi
> > printk(KERN_DEBUG "online_pages %lx at %lx failed\n",
> > nr_pages, pfn);
> > memory_notify(MEM_CANCEL_ONLINE, &arg);
> > + up_read(&memhp_mutex);
> > return ret;
> > }
> >
> > @@ -436,7 +446,7 @@ int online_pages(unsigned long pfn, unsi
> >
> > if (onlined_pages)
> > memory_notify(MEM_ONLINE, &arg);
> > -
> > + up_read(&memhp_mutex);
> > return 0;
> > }
> > #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */
> > @@ -477,14 +487,18 @@ int add_memory(int nid, u64 start, u64 s
> > struct resource *res;
> > int ret;
> >
> > + down_read(&memhp_mutex);
> > res = register_memory_resource(start, size);
> > - if (!res)
> > + if (!res) {
> > + up_read(&memhp_mutex);
> > return -EEXIST;
> > -
> > + }
> > if (!node_online(nid)) {
> > pgdat = hotadd_new_pgdat(nid, start);
> > - if (!pgdat)
> > + if (!pgdat) {
> > + up_read(&memhp_mutex);
> > return -ENOMEM;
> > + }
> > new_pgdat = 1;
> > }
> >
> > @@ -508,7 +522,7 @@ int add_memory(int nid, u64 start, u64 s
> > */
> > BUG_ON(ret);
> > }
> > -
> > + up_read(&memhp_mutex);
> > return ret;
> > error:
> > /* rollback pgdat allocation and others */
> > @@ -517,10 +531,12 @@ error:
> > if (res)
> > release_memory_resource(res);
> >
> > + up_read(&memhp_mutex);
> > return ret;
> > }
> > EXPORT_SYMBOL_GPL(add_memory);
> >
> > +
> > #ifdef CONFIG_MEMORY_HOTREMOVE
> > /*
> > * A free page on the buddy free lists (not the per-cpu lists) has PageBuddy
> > @@ -750,20 +766,23 @@ int offline_pages(unsigned long start_pf
> > return -EINVAL;
> > if (!IS_ALIGNED(end_pfn, pageblock_nr_pages))
> > return -EINVAL;
> > +
> > /* This makes hotplug much easier...and readable.
> > we assume this for now. .*/
> > if (!test_pages_in_a_zone(start_pfn, end_pfn))
> > return -EINVAL;
> >
> > + down_read(&memhp_mutex);
> > zone = page_zone(pfn_to_page(start_pfn));
> > node = zone_to_nid(zone);
> > nr_pages = end_pfn - start_pfn;
> >
> > /* set above range as isolated */
> > ret = start_isolate_page_range(start_pfn, end_pfn);
> > - if (ret)
> > + if (ret) {
> > + up_read(&memhp_mutex);
> > return ret;
> > -
> > + }
> > arg.start_pfn = start_pfn;
> > arg.nr_pages = nr_pages;
> > arg.status_change_nid = -1;
> > @@ -838,6 +857,7 @@ repeat:
> > writeback_set_ratelimit();
> >
> > memory_notify(MEM_OFFLINE, &arg);
> > + up_read(&memhp_mutex);
> > return 0;
> >
> > failed_removal:
> > @@ -846,7 +866,7 @@ failed_removal:
> > memory_notify(MEM_CANCEL_OFFLINE, &arg);
> > /* pushback to free area */
> > undo_isolate_page_range(start_pfn, end_pfn);
> > -
> > + up_read(&memhp_mutex);
> > return ret;
> > }
> > #else
> > @@ -856,3 +876,34 @@ int remove_memory(u64 start, u64 size)
> > }
> > EXPORT_SYMBOL_GPL(remove_memory);
> > #endif /* CONFIG_MEMORY_HOTREMOVE */
> > +
> > +
> > +#ifdef CONFIG_HIBERNATION
> > +
> > +int memhp_hibenation_callback(struct notifier_block *self,
> > + unsigned long action,
> > + void *arg)
> > +{
> > + int ret;
> > +
> > + switch(action) {
> > + case PM_HIBERNATION_PREPARE:
> > + down_write(&memhp_mutex);
> > + break;
> > + case PM_POST_HIBERNATION:
> > + up_write(&memhp_mutex);
> > + break;
> > + case PM_RESTORE_PREPARE:
> > + down_write(&memhp_mutex);
> > + break;
> > + case PM_POST_RESTORE:
> > + up_write(&memhp_mutex);
> > + break;
> > + default:
> > + break;
> > + }
> > + return NOTIFY_OK;
> > +}
> > +#endif
> > +
> > +
> > Index: linux-2.6.27.4/mm/Kconfig
> > ===================================================================
> > --- linux-2.6.27.4.orig/mm/Kconfig
> > +++ linux-2.6.27.4/mm/Kconfig
> > @@ -128,12 +128,9 @@ config SPARSEMEM_VMEMMAP
> > config MEMORY_HOTPLUG
> > bool "Allow for memory hot-add"
> > depends on SPARSEMEM || X86_64_ACPI_NUMA
> > - depends on HOTPLUG && !HIBERNATION && ARCH_ENABLE_MEMORY_HOTPLUG
> > + depends on HOTPLUG && ARCH_ENABLE_MEMORY_HOTPLUG
> > depends on (IA64 || X86 || PPC64 || SUPERH || S390)
> >
> > -comment "Memory hotplug is currently incompatible with Software Suspend"
> > - depends on SPARSEMEM && HOTPLUG && HIBERNATION
> > -
> > config MEMORY_HOTPLUG_SPARSE
> > def_bool y
> > depends on SPARSEMEM && MEMORY_HOTPLUG
> >
>
> --
> Yasunori Goto
>
>
>
--
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-06 6:04 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
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 [this message]
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=20081106150405.6dd4200a.kamezawa.hiroyu@jp.fujitsu.com \
--to=kamezawa.hiroyu@jp.fujitsu.com \
--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=ncunningham@crca.org.au \
--cc=pavel@suse.cz \
--cc=rjw@sisk.pl \
--cc=y-goto@jp.fujitsu.com \
/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