lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <50DA6AB3.2030608@jp.fujitsu.com> Date: Wed, 26 Dec 2012 12:10:43 +0900 From: Kamezawa Hiroyuki <kamezawa.hiroyu@...fujitsu.com> To: Tang Chen <tangchen@...fujitsu.com> CC: akpm@...ux-foundation.org, rientjes@...gle.com, liuj97@...il.com, len.brown@...el.com, benh@...nel.crashing.org, paulus@...ba.org, cl@...ux.com, minchan.kim@...il.com, kosaki.motohiro@...fujitsu.com, isimatu.yasuaki@...fujitsu.com, wujianguo@...wei.com, wency@...fujitsu.com, hpa@...or.com, linfeng@...fujitsu.com, laijs@...fujitsu.com, mgorman@...e.de, yinghai@...nel.org, x86@...nel.org, linux-mm@...ck.org, linux-kernel@...r.kernel.org, linuxppc-dev@...ts.ozlabs.org, linux-acpi@...r.kernel.org, linux-s390@...r.kernel.org, linux-sh@...r.kernel.org, linux-ia64@...r.kernel.org, cmetcalf@...era.com, sparclinux@...r.kernel.org Subject: Re: [PATCH v5 02/14] memory-hotplug: check whether all memory blocks are offlined or not when removing memory (2012/12/24 21:09), Tang Chen wrote: > From: Yasuaki Ishimatsu <isimatu.yasuaki@...fujitsu.com> > > We remove the memory like this: > 1. lock memory hotplug > 2. offline a memory block > 3. unlock memory hotplug > 4. repeat 1-3 to offline all memory blocks > 5. lock memory hotplug > 6. remove memory(TODO) > 7. unlock memory hotplug > > All memory blocks must be offlined before removing memory. But we don't hold > the lock in the whole operation. So we should check whether all memory blocks > are offlined before step6. Otherwise, kernel maybe panicked. > > Signed-off-by: Wen Congyang <wency@...fujitsu.com> > Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@...fujitsu.com> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@...fujitsu.com> a nitpick below. > --- > drivers/base/memory.c | 6 +++++ > include/linux/memory_hotplug.h | 1 + > mm/memory_hotplug.c | 47 ++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 54 insertions(+), 0 deletions(-) > > diff --git a/drivers/base/memory.c b/drivers/base/memory.c > index 987604d..8300a18 100644 > --- a/drivers/base/memory.c > +++ b/drivers/base/memory.c > @@ -693,6 +693,12 @@ int offline_memory_block(struct memory_block *mem) > return ret; > } > > +/* return true if the memory block is offlined, otherwise, return false */ > +bool is_memblock_offlined(struct memory_block *mem) > +{ > + return mem->state == MEM_OFFLINE; > +} > + > /* > * Initialize the sysfs support for memory devices... > */ > diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h > index 4a45c4e..8dd0950 100644 > --- a/include/linux/memory_hotplug.h > +++ b/include/linux/memory_hotplug.h > @@ -247,6 +247,7 @@ extern int add_memory(int nid, u64 start, u64 size); > extern int arch_add_memory(int nid, u64 start, u64 size); > extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages); > extern int offline_memory_block(struct memory_block *mem); > +extern bool is_memblock_offlined(struct memory_block *mem); > extern int remove_memory(u64 start, u64 size); > extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn, > int nr_pages); > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c > index 62e04c9..d43d97b 100644 > --- a/mm/memory_hotplug.c > +++ b/mm/memory_hotplug.c > @@ -1430,6 +1430,53 @@ repeat: > goto repeat; > } > > + lock_memory_hotplug(); > + > + /* > + * we have offlined all memory blocks like this: > + * 1. lock memory hotplug > + * 2. offline a memory block > + * 3. unlock memory hotplug > + * > + * repeat step1-3 to offline the memory block. All memory blocks > + * must be offlined before removing memory. But we don't hold the > + * lock in the whole operation. So we should check whether all > + * memory blocks are offlined. > + */ > + > + for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) { I prefer adding mem = NULL at the start of this for(). > + section_nr = pfn_to_section_nr(pfn); > + if (!present_section_nr(section_nr)) > + continue; > + > + section = __nr_to_section(section_nr); > + /* same memblock? */ > + if (mem) > + if ((section_nr >= mem->start_section_nr) && > + (section_nr <= mem->end_section_nr)) > + continue; > + Thanks, -Kame -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists