* For two pages to be swapped in the shuffle, they must be free (on a
  * 'free_area' lru), have the same order, and have the same migratetype.
  */
-static struct page * __meminit shuffle_valid_page(unsigned long pfn, int order)
+static struct page * __meminit shuffle_valid_page(struct zone *zone,
+                                                 unsigned long pfn, int order)
 {
-       struct page *page;
+       struct page *page = pfn_to_online_page(pfn);
 
        /*
         * Given we're dealing with randomly selected pfns in a zone we
         * need to ask questions like...
         */
 
-       /* ...is the pfn even in the memmap? */
-       if (!pfn_valid_within(pfn))
+       /* ... is the page managed by the buddy? */
+       if (!page)
                return NULL;
 
-       /* ...is the pfn in a present section or a hole? */
-       if (!pfn_in_present_section(pfn))
+       /* ... is the page assigned to the same zone? */
+       if (page_zone(page) != zone)
                return NULL;
 
        /* ...is the page free and currently on a free_area list? */
-       page = pfn_to_page(pfn);
        if (!PageBuddy(page))
                return NULL;
 
                 * page_j randomly selected in the span @zone_start_pfn to
                 * @spanned_pages.
                 */
-               page_i = shuffle_valid_page(i, order);
+               page_i = shuffle_valid_page(z, i, order);
                if (!page_i)
                        continue;
 
                        j = z->zone_start_pfn +
                                ALIGN_DOWN(get_random_long() % z->spanned_pages,
                                                order_pages);
-                       page_j = shuffle_valid_page(j, order);
+                       page_j = shuffle_valid_page(z, j, order);
                        if (page_j && page_j != page_i)
                                break;
                }