Thread (35 messages) 35 messages, 5 authors, 2012-11-27

Re: [PATCH v3 06/12] memory-hotplug: unregister memory section on SPARSEMEM_VMEMMAP

From: Wen Congyang <hidden>
Date: 2012-11-21 02:59:25
Also in: linux-acpi, linux-mm, linux-s390, linux-sh, lkml, sparclinux

At 11/20/2012 07:16 PM, Jaegeuk Hanse Wrote:
On 11/01/2012 05:44 PM, Wen Congyang wrote:
quoted
From: Yasuaki Ishimatsu <redacted>

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
quoted
CC: David Rientjes <rientjes@google.com>
CC: Jiang Liu <redacted>
CC: Len Brown <redacted>
CC: Christoph Lameter <redacted>
Cc: Minchan Kim <redacted>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: KOSAKI Motohiro <redacted>
CC: Wen Congyang <redacted>
Signed-off-by: Yasuaki Ishimatsu <redacted>
---
  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)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help