cpusets: restructure the function cpuset_update_task_memory_state()
The kernel still allocates the page caches on old node after modifying its cpuset's mems when 'memory_spread_page' was set, or it didn't spread the page cache evenly over all the nodes that faulting task is allowed to usr after memory_spread_page was set. it is caused by the old mem_allowed and flags of the task, the current kernel doesn't updates them unless some function invokes cpuset_update_task_memory_state(), it is too late sometimes.We must update the mem_allowed and the flags of the tasks in time. Slab has the same problem. The following patches fix this bug by updating tasks' mem_allowed and spread flag after its cpuset's mems or spread flag is changed. This patch: Extract a function from cpuset_update_task_memory_state(). It will be used later for update tasks' page/slab spread flags after its cpuset's flag is set Signed-off-by: Miao Xie <miaox@cn.fujitsu.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Christoph Lameter <cl@linux-foundation.org> Cc: Paul Menage <menage@google.com> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Cc: Yasunori Goto <y-goto@jp.fujitsu.com> Cc: Pekka Enberg <penberg@cs.helsinki.fi> Cc: David Rientjes <rientjes@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
dcf975d585
commit
f3b39d47eb
|
@ -331,6 +331,24 @@ static void guarantee_online_mems(const struct cpuset *cs, nodemask_t *pmask)
|
|||
BUG_ON(!nodes_intersects(*pmask, node_states[N_HIGH_MEMORY]));
|
||||
}
|
||||
|
||||
/*
|
||||
* update task's spread flag if cpuset's page/slab spread flag is set
|
||||
*
|
||||
* Called with callback_mutex/cgroup_mutex held
|
||||
*/
|
||||
static void cpuset_update_task_spread_flag(struct cpuset *cs,
|
||||
struct task_struct *tsk)
|
||||
{
|
||||
if (is_spread_page(cs))
|
||||
tsk->flags |= PF_SPREAD_PAGE;
|
||||
else
|
||||
tsk->flags &= ~PF_SPREAD_PAGE;
|
||||
if (is_spread_slab(cs))
|
||||
tsk->flags |= PF_SPREAD_SLAB;
|
||||
else
|
||||
tsk->flags &= ~PF_SPREAD_SLAB;
|
||||
}
|
||||
|
||||
/**
|
||||
* cpuset_update_task_memory_state - update task memory placement
|
||||
*
|
||||
|
@ -388,14 +406,7 @@ void cpuset_update_task_memory_state(void)
|
|||
cs = task_cs(tsk); /* Maybe changed when task not locked */
|
||||
guarantee_online_mems(cs, &tsk->mems_allowed);
|
||||
tsk->cpuset_mems_generation = cs->mems_generation;
|
||||
if (is_spread_page(cs))
|
||||
tsk->flags |= PF_SPREAD_PAGE;
|
||||
else
|
||||
tsk->flags &= ~PF_SPREAD_PAGE;
|
||||
if (is_spread_slab(cs))
|
||||
tsk->flags |= PF_SPREAD_SLAB;
|
||||
else
|
||||
tsk->flags &= ~PF_SPREAD_SLAB;
|
||||
cpuset_update_task_spread_flag(cs, tsk);
|
||||
task_unlock(tsk);
|
||||
mutex_unlock(&callback_mutex);
|
||||
mpol_rebind_task(tsk, &tsk->mems_allowed);
|
||||
|
|
Loading…
Reference in New Issue
Block a user