• Mel Gorman's avatar
    mm/page_alloc: always attempt to allocate at least one page during bulk allocation · c572e488
    Mel Gorman authored
    Peter Pavlisko reported the following problem on kernel bugzilla 216007.
    
    	When I try to extract an uncompressed tar archive (2.6 milion
    	files, 760.3 GiB in size) on newly created (empty) XFS file system,
    	after first low tens of gigabytes extracted the process hangs in
    	iowait indefinitely. One CPU core is 100% occupied with iowait,
    	the other CPU core is idle (on 2-core Intel Celeron G1610T).
    
    It was bisected to c9fa5630 ("xfs: use alloc_pages_bulk_array() for
    buffers") but XFS is only the messenger.  The problem is that nothing is
    waking kswapd to reclaim some pages at a time the PCP lists cannot be
    refilled until some reclaim happens.  The bulk allocator checks that there
    are some pages in the array and the original intent was that a bulk
    allocator did not necessarily need all the requested pages and it was best
    to return as quickly as possible.
    
    This was fine for the first user of the API but both NFS and XFS require
    the requested number of pages be available before making progress.  Both
    could be adjusted to call the page allocator directly if a bulk allocation
    fails but it puts a burden on users of the API.  Adjust the semantics to
    attempt at least one allocation via __alloc_pages() before returning so
    kswapd is woken if necessary.
    
    It was reported via bugzilla that the patch addressed the problem and that
    the tar extraction completed successfully.  This may also address bug
    215975 but has yet to be confirmed.
    
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=216007
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=215975
    Link: https://lkml.kernel.org/r/20220526091210.GC3441@techsingularity.net
    Fixes: 387ba26f ("mm/page_alloc: add a bulk page allocator")
    Signed-off-by: default avatarMel Gorman <mgorman@techsingularity.net>
    Cc: "Darrick J. Wong" <djwong@kernel.org>
    Cc: Dave Chinner <dchinner@redhat.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Jesper Dangaard Brouer <brouer@redhat.com>
    Cc: Chuck Lever <chuck.lever@oracle.com>
    Cc: <stable@vger.kernel.org>	[5.13+]
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    c572e488
page_alloc.c 268 KB