mm, memory_hotplug: consider offline memblocks removable
authorMichal Hocko <mhocko@suse.com>
Thu, 6 Jul 2017 22:37:53 +0000 (15:37 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 6 Jul 2017 23:24:32 +0000 (16:24 -0700)
is_pageblock_removable_nolock() relies on having zone association to
examine all the page blocks to check whether they are movable or free.
This is just wasting of cycles when the memblock is offline.  Later
patch in the series will also change the time when the page is
associated with a zone so we let's bail out early if the memblock is
offline.

Link: http://lkml.kernel.org/r/20170515085827.16474-7-mhocko@kernel.org
Signed-off-by: Michal Hocko <mhocko@suse.com>
Reported-by: Igor Mammedov <imammedo@redhat.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Balbir Singh <bsingharora@gmail.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Daniel Kiper <daniel.kiper@oracle.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Jerome Glisse <jglisse@redhat.com>
Cc: Joonsoo Kim <js1304@gmail.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Reza Arbab <arbab@linux.vnet.ibm.com>
Cc: Tobias Regnery <tobias.regnery@gmail.com>
Cc: Toshi Kani <toshi.kani@hpe.com>
Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
Cc: Xishi Qiu <qiuxishi@huawei.com>
Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/base/memory.c

index f8fd562c3f18644d8f964f0dbb4628551b427975..1e884d82af6fcfebe02db0e20564d1c9ce50e71f 100644 (file)
@@ -128,6 +128,9 @@ static ssize_t show_mem_removable(struct device *dev,
        int ret = 1;
        struct memory_block *mem = to_memory_block(dev);
 
+       if (mem->state != MEM_ONLINE)
+               goto out;
+
        for (i = 0; i < sections_per_block; i++) {
                if (!present_section_nr(mem->start_section_nr + i))
                        continue;
@@ -135,6 +138,7 @@ static ssize_t show_mem_removable(struct device *dev,
                ret &= is_mem_section_removable(pfn, PAGES_PER_SECTION);
        }
 
+out:
        return sprintf(buf, "%d\n", ret);
 }