int order;
 
        while (start < end) {
-               order = min_t(int, MAX_ORDER, __ffs(start));
+               /*
+                * Free the pages in the largest chunks alignment allows.
+                *
+                * __ffs() behaviour is undefined for 0. start == 0 is
+                * MAX_ORDER-aligned, set order to MAX_ORDER for the case.
+                */
+               if (start)
+                       order = min_t(int, MAX_ORDER, __ffs(start));
+               else
+                       order = MAX_ORDER;
 
                while (start + (1UL << order) > end)
                        order--;
 
         * this and the first chunk to online will be pageblock_nr_pages.
         */
        for (pfn = start_pfn; pfn < end_pfn;) {
-               int order = min_t(int, MAX_ORDER, __ffs(pfn));
+               int order;
+
+               /*
+                * Free to online pages in the largest chunks alignment allows.
+                *
+                * __ffs() behaviour is undefined for 0. start == 0 is
+                * MAX_ORDER-aligned, Set order to MAX_ORDER for the case.
+                */
+               if (pfn)
+                       order = min_t(int, MAX_ORDER, __ffs(pfn));
+               else
+                       order = MAX_ORDER;
 
                (*online_page_callback)(pfn_to_page(pfn), order);
                pfn += (1UL << order);