Re: [patch] mm: page_alloc: spill to remote nodes before waking kswapd

From: Rik van Riel
Date: Thu Mar 20 2014 - 17:16:34 EST


On 03/20/2014 04:53 PM, Johannes Weiner wrote:
On NUMA systems, a node may start thrashing cache or even swap
anonymous pages while there are still free pages on remote nodes.

This is a result of 81c0a2bb515f ("mm: page_alloc: fair zone allocator
policy") and fff4068cba48 ("mm: page_alloc: revert NUMA aspect of fair
allocation policy"). Before those changes, the allocator would first
try all allowed zones, including those on remote nodes, before waking
any kswapds. But now, the allocator fastpath doubles as the fairness
pass, which in turn can only consider the local node to prevent remote
spilling based on exhausted fairness batches alone. Remote nodes are
only considered in the slowpath, after the kswapds are woken up. But
if remote nodes still have free memory, kswapd should not be woken to
rebalance the local node or it may thrash cash or swap prematurely.

Fix this by adding one more unfair pass over the zonelist that is
allowed to spill to remote nodes after the local fairness pass fails
but before entering the slowpath and waking the kswapds.

This also gets rid of the GFP_THISNODE exemption from the fairness
protocol because the unfair pass is no longer tied to kswapd, which
GFP_THISNODE is not allowed to wake up.

However, because remote spills can be more frequent now - we prefer
them over local kswapd reclaim - the allocation batches on remote
nodes could underflow more heavily. When resetting the batches, use
atomic_long_read() directly instead of zone_page_state() to calculate
the delta as the latter filters negative counter values.

Signed-off-by: Johannes Weiner <hannes@xxxxxxxxxxx>
Cc: <stable@xxxxxxxxxx> [3.12+]

Acked-by: Rik van Riel <riel@xxxxxxxxxx>

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/