lkml.org 
[lkml]   [2010]   [Apr]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 1/2] mm: fix bugs of mpol_rebind_nodemask()
    on 2010-4-23 5:20, David Rientjes wrote:
    > On Thu, 22 Apr 2010, Miao Xie wrote:
    >
    >> - local variable might be an empty nodemask, so must be checked before setting
    >> pol->v.nodes to it.
    >>
    >> - nodes_remap() may cause the weight of pol->v.nodes being monotonic decreasing.
    >> and never become large even we pass a nodemask with large weight after
    >> ->v.nodes become little.
    >>
    >
    > That's always been the intention of rebinding a mempolicy nodemask: we
    > remap the current mempolicy nodes over the new nodemask given the set of
    > allowed nodes. The nodes_remap() shouldn't be removed.

    Suppose the current mempolicy nodes is 0-2, we can remap it from 0-2 to 2,
    then we can remap it from 2 to 1, but we can't remap it from 2 to 0-2.

    that is to say it can't be remaped to a large set of allowed nodes, and the task
    just can use the small set of nodes for ever, even the large set of nodes is allowed,
    I think it is unreasonable.

    Thanks
    Miao

    >
    >> this patch fixes these two problem.
    >>
    >> Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>
    >> ---
    >> mm/mempolicy.c | 9 ++++++---
    >> 1 files changed, 6 insertions(+), 3 deletions(-)
    >>
    >> diff --git a/mm/mempolicy.c b/mm/mempolicy.c
    >> index 08f40a2..03ba9fc 100644
    >> --- a/mm/mempolicy.c
    >> +++ b/mm/mempolicy.c
    >> @@ -291,12 +291,15 @@ static void mpol_rebind_nodemask(struct mempolicy *pol,
    >> else if (pol->flags & MPOL_F_RELATIVE_NODES)
    >> mpol_relative_nodemask(&tmp, &pol->w.user_nodemask, nodes);
    >> else {
    >> - nodes_remap(tmp, pol->v.nodes, pol->w.cpuset_mems_allowed,
    >> - *nodes);
    >> + tmp = *nodes;
    >> pol->w.cpuset_mems_allowed = *nodes;
    >> }
    >>
    >> - pol->v.nodes = tmp;
    >> + if (nodes_empty(tmp))
    >> + pol->v.nodes = *nodes;
    >> + else
    >> + pol->v.nodes = tmp;
    >> +
    >> if (!node_isset(current->il_next, tmp)) {
    >> current->il_next = next_node(current->il_next, tmp);
    >> if (current->il_next >= MAX_NUMNODES)
    >
    >
    >




    \
     
     \ /
      Last update: 2010-04-23 03:29    [W:0.023 / U:0.636 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site