Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e33c3b5e authored by David Rientjes's avatar David Rientjes Committed by Linus Torvalds
Browse files

cpusets: update mems allowed in page allocator



If all allowable memory is unreclaimable, it is possible to loop forever
in the page allocator for ~__GFP_NORETRY allocations.

During this time, it is also possible for a task's cpuset to expand its
set of allowable nodes so that it now includes free memory.  The cached
copy of this set, current->mems_allowed, is stale, however, since there
has not been a subsequent call to cpuset_update_task_memory_state().

The cached copy of the set of allowable nodes is now updated in the page
allocator's slow path so the additional memory is available to
get_page_from_freelist().

[akpm@linux-foundation.org: add comment]
Signed-off-by: default avatarDavid Rientjes <rientjes@google.com>
Cc: Paul Menage <menage@google.com>
Cc: Christoph Lameter <cl@linux-foundation.org>
Cc: Mel Gorman <mel@csn.ul.ie>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent f0f7e0dc
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1561,6 +1561,10 @@ __alloc_pages_internal(gfp_t gfp_mask, unsigned int order,

	/* We now go into synchronous reclaim */
	cpuset_memory_pressure_bump();
	/*
	 * The task's cpuset might have expanded its set of allowable nodes
	 */
	cpuset_update_task_memory_state();
	p->flags |= PF_MEMALLOC;
	reclaim_state.reclaimed_slab = 0;
	p->reclaim_state = &reclaim_state;