Messages in this thread | | | Subject | Re: [lkp-robot] [mm, page_alloc] b7ef62aa8a: BUG:kernel_hang_in_boot_stage | From | Vlastimil Babka <> | Date | Fri, 31 Mar 2017 09:13:40 +0200 |
| |
On 03/31/2017 12:40 AM, Andrew Morton wrote: >> > 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?
Yeah, that would be more obvious. Thanks!
| |