Skip to content
  • David Rientjes's avatar
    mm: test and set zone reclaim lock before starting reclaim · d773ed6b
    David Rientjes authored
    
    
    Introduces new zone flag interface for testing and setting flags:
    
    	int zone_test_and_set_flag(struct zone *zone, zone_flags_t flag)
    
    Instead of setting and clearing ZONE_RECLAIM_LOCKED each time shrink_zone() is
    called, this flag is test and set before starting zone reclaim.  Zone reclaim
    starts in __alloc_pages() when a zone's watermark fails and the system is in
    zone_reclaim_mode.  If it's already in reclaim, there's no need to start again
    so it is simply considered full for that allocation attempt.
    
    There is a change of behavior with regard to concurrent zone shrinking.  It is
    now possible for try_to_free_pages() or kswapd to already be shrinking a
    particular zone when __alloc_pages() starts zone reclaim.  In this case, it is
    possible for two concurrent threads to invoke shrink_zone() for a single zone.
    
    This change forbids a zone to be in zone reclaim twice, which was always the
    behavior, but allows for concurrent try_to_free_pages() or kswapd shrinking
    when starting zone reclaim.
    
    Cc: Andrea Arcangeli <andrea@suse.de>
    Cc: Christoph Lameter <clameter@sgi.com>
    Signed-off-by: default avatarDavid Rientjes <rientjes@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    d773ed6b