Messages in this thread | | | Date | Thu, 30 Mar 2017 15:40:26 -0700 | From | Andrew Morton <> | Subject | Re: [lkp-robot] [mm, page_alloc] b7ef62aa8a: BUG:kernel_hang_in_boot_stage |
| |
> > BUG: kernel hang in boot stage > > Thanks, I was able to reproduce and debug this. > Andrew, please apply the following -fix. There will be conflicts on later > patches, but with trivial resolution (pages -> free_pages). Thanks! > > ... > > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -1977,6 +1977,9 @@ static void steal_suitable_fallback(struct zone *zone, struct page *page, > goto single_page; > > pages = move_freepages_block(zone, page, start_type); > + /* moving whole block can fail due to zone boundary conditions */ > + if (!pages) > + goto single_page; > > /* Claim the whole block if over half of it is free */ > if (pages >= (1 << (pageblock_order-1)) ||
The result is a bit odd:
free_pages = move_freepages_block(zone, page, start_type, &movable_pages); /* * Determine how many pages are compatible with our allocation. * For movable allocation, it's the number of movable pages which * we just obtained. For other types it's a bit more tricky. */ if (start_type == MIGRATE_MOVABLE) { alike_pages = movable_pages; } else { /* * If we are falling back a RECLAIMABLE or UNMOVABLE allocation * to MOVABLE pageblock, consider all non-movable pages as * compatible. If it's UNMOVABLE falling back to RECLAIMABLE or * vice versa, be conservative since we can't distinguish the * exact migratetype of non-movable pages. */ if (old_block_type == MIGRATE_MOVABLE) alike_pages = pageblock_nr_pages - (free_pages + movable_pages); else alike_pages = 0; }
/* moving whole block can fail due to zone boundary conditions */ if (!free_pages) goto single_page;
should we do `goto single_page' as soon as the move_freepages_block() call fails?
| |