memory-hotplug: use zone_can_shift() for sysfs valid_zones attribute
authorReza Arbab <arbab@linux.vnet.ibm.com>
Tue, 26 Jul 2016 22:22:27 +0000 (15:22 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 26 Jul 2016 23:19:19 +0000 (16:19 -0700)
Since zone_can_shift() is being used to validate the target zone during
onlining, it should also be used to determine the content of
valid_zones.

Link: http://lkml.kernel.org/r/1462816419-4479-4-git-send-email-arbab@linux.vnet.ibm.com
Signed-off-by: Reza Arbab <arbab@linux.vnet.ibm.com>
Reviewd-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Daniel Kiper <daniel.kiper@oracle.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Tang Chen <tangchen@cn.fujitsu.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: David Vrabel <david.vrabel@citrix.com>
Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Andrew Banman <abanman@sgi.com>
Cc: Chen Yucong <slaoub@gmail.com>
Cc: Yasunori Goto <y-goto@jp.fujitsu.com>
Cc: Zhang Zhen <zhenzhang.zhang@huawei.com>
Cc: Shaohua Li <shaohua.li@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/base/memory.c

index f46dba8b7092e305ca6e7b404bbf7a2ef8ce2a12..dc75de9059cd1983401b35bffb5c697d2e55b813 100644 (file)
@@ -391,6 +391,7 @@ static ssize_t show_valid_zones(struct device *dev,
        unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block;
        struct page *first_page;
        struct zone *zone;
+       int zone_shift = 0;
 
        start_pfn = section_nr_to_pfn(mem->start_section_nr);
        end_pfn = start_pfn + nr_pages;
@@ -402,21 +403,26 @@ static ssize_t show_valid_zones(struct device *dev,
 
        zone = page_zone(first_page);
 
-       if (zone_idx(zone) == ZONE_MOVABLE - 1) {
-               /*The mem block is the last memoryblock of this zone.*/
-               if (end_pfn == zone_end_pfn(zone))
-                       return sprintf(buf, "%s %s\n",
-                                       zone->name, (zone + 1)->name);
+       /* MMOP_ONLINE_KEEP */
+       sprintf(buf, "%s", zone->name);
+
+       /* MMOP_ONLINE_KERNEL */
+       zone_shift = zone_can_shift(start_pfn, nr_pages, ZONE_NORMAL);
+       if (zone_shift) {
+               strcat(buf, " ");
+               strcat(buf, (zone + zone_shift)->name);
        }
 
-       if (zone_idx(zone) == ZONE_MOVABLE) {
-               /*The mem block is the first memoryblock of ZONE_MOVABLE.*/
-               if (start_pfn == zone->zone_start_pfn)
-                       return sprintf(buf, "%s %s\n",
-                                       zone->name, (zone - 1)->name);
+       /* MMOP_ONLINE_MOVABLE */
+       zone_shift = zone_can_shift(start_pfn, nr_pages, ZONE_MOVABLE);
+       if (zone_shift) {
+               strcat(buf, " ");
+               strcat(buf, (zone + zone_shift)->name);
        }
 
-       return sprintf(buf, "%s\n", zone->name);
+       strcat(buf, "\n");
+
+       return strlen(buf);
 }
 static DEVICE_ATTR(valid_zones, 0444, show_valid_zones, NULL);
 #endif