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;
 
        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