lkml.org 
[lkml]   [2012]   [Dec]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v5 01/14] memory-hotplug: try to offline the memory twice to avoid dependence
    (2012/12/24 21:09), Tang Chen wrote:
    > From: Wen Congyang <wency@cn.fujitsu.com>
    >
    > memory can't be offlined when CONFIG_MEMCG is selected.
    > For example: there is a memory device on node 1. The address range
    > is [1G, 1.5G). You will find 4 new directories memory8, memory9, memory10,
    > and memory11 under the directory /sys/devices/system/memory/.
    >
    > If CONFIG_MEMCG is selected, we will allocate memory to store page cgroup
    > when we online pages. When we online memory8, the memory stored page cgroup
    > is not provided by this memory device. But when we online memory9, the memory
    > stored page cgroup may be provided by memory8. So we can't offline memory8
    > now. We should offline the memory in the reversed order.
    >

    If memory8 is onlined as NORMAL memory ...right ?

    IIUC, vmalloc() uses __GFP_HIGHMEM but doesn't use __GFP_MOVABLE.

    > When the memory device is hotremoved, we will auto offline memory provided
    > by this memory device. But we don't know which memory is onlined first, so
    > offlining memory may fail. In such case, iterate twice to offline the memory.
    > 1st iterate: offline every non primary memory block.
    > 2nd iterate: offline primary (i.e. first added) memory block.
    >
    > This idea is suggested by KOSAKI Motohiro.
    >
    > Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>

    I'm not sure but the whole DIMM should be onlined as MOVABLE mem ?

    Anyway, I agree this kind of retry is required if memory is onlined as NORMAL mem.
    But retry-once is ok ?

    Thanks,
    -Kame

    > ---
    > mm/memory_hotplug.c | 16 ++++++++++++++--
    > 1 files changed, 14 insertions(+), 2 deletions(-)
    >
    > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
    > index d04ed87..62e04c9 100644
    > --- a/mm/memory_hotplug.c
    > +++ b/mm/memory_hotplug.c
    > @@ -1388,10 +1388,13 @@ int remove_memory(u64 start, u64 size)
    > unsigned long start_pfn, end_pfn;
    > unsigned long pfn, section_nr;
    > int ret;
    > + int return_on_error = 0;
    > + int retry = 0;
    >
    > start_pfn = PFN_DOWN(start);
    > end_pfn = start_pfn + PFN_DOWN(size);
    >
    > +repeat:
    > for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
    > section_nr = pfn_to_section_nr(pfn);
    > if (!present_section_nr(section_nr))
    > @@ -1410,14 +1413,23 @@ int remove_memory(u64 start, u64 size)
    >
    > ret = offline_memory_block(mem);
    > if (ret) {
    > - kobject_put(&mem->dev.kobj);
    > - return ret;
    > + if (return_on_error) {
    > + kobject_put(&mem->dev.kobj);
    > + return ret;
    > + } else {
    > + retry = 1;
    > + }
    > }
    > }
    >
    > if (mem)
    > kobject_put(&mem->dev.kobj);
    >
    > + if (retry) {
    > + return_on_error = 1;
    > + goto repeat;
    > + }
    > +
    > return 0;
    > }
    > #else
    >




    \
     
     \ /
      Last update: 2012-12-26 04:41    [W:4.615 / U:0.152 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site