At 11/20/2012 07:16 PM, Jaegeuk Hanse Wrote: > On 11/01/2012 05:44 PM, Wen Congyang wrote: >> From: Yasuaki Ishimatsu <isimatu.yasu...@jp.fujitsu.com> >> >> Currently __remove_section for SPARSEMEM_VMEMMAP does nothing. But >> even if >> we use SPARSEMEM_VMEMMAP, we can unregister the memory_section. >> >> So the patch add unregister_memory_section() into __remove_section(). > > Hi Yasuaki, > > I have a question about these sparse vmemmap memory related patches. Hot > add memory need allocated vmemmap pages, but this time is allocated by > buddy system. How can gurantee virtual address is continuous to the > address allocated before? If not continuous, page_to_pfn and pfn_to_page > can't work correctly.
vmemmap has its virtual address range: ffffea0000000000 - ffffeaffffffffff (=40 bits) virtual memory map (1TB) We allocate memory from buddy system to store struct page, and its virtual address isn't in this range. So we should update the page table: kmalloc_section_memmap() sparse_mem_map_populate() pfn_to_page() // get the virtual address in the vmemmap range vmemmap_populate() // we update page table here When we use vmemmap, page_to_pfn() always returns address in the vmemmap range, not the address that kmalloc() returns. So the virtual address is continuous. Thanks Wen Congyang > > Regards, > Jaegeuk > >> >> CC: David Rientjes <rient...@google.com> >> CC: Jiang Liu <liu...@gmail.com> >> CC: Len Brown <len.br...@intel.com> >> CC: Christoph Lameter <c...@linux.com> >> Cc: Minchan Kim <minchan....@gmail.com> >> CC: Andrew Morton <a...@linux-foundation.org> >> CC: KOSAKI Motohiro <kosaki.motoh...@jp.fujitsu.com> >> CC: Wen Congyang <we...@cn.fujitsu.com> >> Signed-off-by: Yasuaki Ishimatsu <isimatu.yasu...@jp.fujitsu.com> >> --- >> mm/memory_hotplug.c | 13 ++++++++----- >> 1 file changed, 8 insertions(+), 5 deletions(-) >> >> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c >> index ca07433..66a79a7 100644 >> --- a/mm/memory_hotplug.c >> +++ b/mm/memory_hotplug.c >> @@ -286,11 +286,14 @@ static int __meminit __add_section(int nid, >> struct zone *zone, >> #ifdef CONFIG_SPARSEMEM_VMEMMAP >> static int __remove_section(struct zone *zone, struct mem_section *ms) >> { >> - /* >> - * XXX: Freeing memmap with vmemmap is not implement yet. >> - * This should be removed later. >> - */ >> - return -EBUSY; >> + int ret = -EINVAL; >> + >> + if (!valid_section(ms)) >> + return ret; >> + >> + ret = unregister_memory_section(ms); >> + >> + return ret; >> } >> #else >> static int __remove_section(struct zone *zone, struct mem_section *ms) > > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/