On Wed, 12 Apr 2017, Vlastimil Babka wrote: > >> Well, interleave_nodes() will then potentially return a node outside of > >> the allowed memory policy when its called for the first time after > >> mpol_rebind_.. . But thenn it will find the next node within the > >> nodemask and work correctly for the next invocations. > > > > Hmm, you're right. But that could be easily fixed if il_next became il_prev, so > > we would return the result of next_node_in(il_prev) and also store it as the new > > il_prev, right? I somehow assumed it already worked that way. Yup that makes sense and I thought about that when I saw the problem too. > @@ -863,6 +856,18 @@ static int lookup_node(unsigned long addr) > return err; > } > > +/* Do dynamic interleaving for a process */ > +static unsigned interleave_nodes(struct mempolicy *policy, bool update_prev) Why do you need an additional flag? Would it not be better to always update and switch the update_prev=false case to simply use next_node_in()? > +{ > + unsigned next; > + struct task_struct *me = current; > + > + next = next_node_in(me->il_prev, policy->v.nodes); > + if (next < MAX_NUMNODES && update_prev) > + me->il_prev = next; > + return next; > +} > + > /* Retrieve NUMA policy */ > static long do_get_mempolicy(int *policy, nodemask_t *nmask, > unsigned long addr, unsigned long flags) > @@ -916,7 +921,7 @@ static long do_get_mempolicy(int *policy, nodemask_t *nmask, > *policy = err; > } else if (pol == current->mempolicy && > pol->mode == MPOL_INTERLEAVE) { > - *policy = current->il_next; > + *policy = interleave_nodes(current->mempolicy, false); Here -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>