|
@@ -1033,8 +1033,10 @@ static void cpuset_change_task_nodemask(struct task_struct *tsk,
|
|
|
need_loop = task_has_mempolicy(tsk) ||
|
|
|
!nodes_intersects(*newmems, tsk->mems_allowed);
|
|
|
|
|
|
- if (need_loop)
|
|
|
+ if (need_loop) {
|
|
|
+ local_irq_disable();
|
|
|
write_seqcount_begin(&tsk->mems_allowed_seq);
|
|
|
+ }
|
|
|
|
|
|
nodes_or(tsk->mems_allowed, tsk->mems_allowed, *newmems);
|
|
|
mpol_rebind_task(tsk, newmems, MPOL_REBIND_STEP1);
|
|
@@ -1042,8 +1044,10 @@ static void cpuset_change_task_nodemask(struct task_struct *tsk,
|
|
|
mpol_rebind_task(tsk, newmems, MPOL_REBIND_STEP2);
|
|
|
tsk->mems_allowed = *newmems;
|
|
|
|
|
|
- if (need_loop)
|
|
|
+ if (need_loop) {
|
|
|
write_seqcount_end(&tsk->mems_allowed_seq);
|
|
|
+ local_irq_enable();
|
|
|
+ }
|
|
|
|
|
|
task_unlock(tsk);
|
|
|
}
|