lkml.org 
[lkml]   [2012]   [Nov]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 17/46] mm: mempolicy: Add MPOL_MF_NOOP
    Date
    From: Lee Schermerhorn <lee.schermerhorn@hp.com>

    NOTE: I have not yet addressed by own review feedback of this patch. At
    this point I'm trying to construct a baseline tree and will apply
    my own review feedback later and then fold it in.

    This patch augments the MPOL_MF_LAZY feature by adding a "NOOP" policy
    to mbind(). When the NOOP policy is used with the 'MOVE and 'LAZY
    flags, mbind() will map the pages PROT_NONE so that they will be
    migrated on the next touch.

    This allows an application to prepare for a new phase of operation
    where different regions of shared storage will be assigned to
    worker threads, w/o changing policy. Note that we could just use
    "default" policy in this case. However, this also allows an
    application to request that pages be migrated, only if necessary,
    to follow any arbitrary policy that might currently apply to a
    range of pages, without knowing the policy, or without specifying
    multiple mbind()s for ranges with different policies.

    [ Bug in early version of mpol_parse_str() reported by Fengguang Wu. ]

    Bug-Reported-by: Reported-by: Fengguang Wu <fengguang.wu@intel.com>
    Signed-off-by: Lee Schermerhorn <lee.schermerhorn@hp.com>
    Reviewed-by: Rik van Riel <riel@redhat.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Mel Gorman <mgorman@suse.de>
    ---
    include/uapi/linux/mempolicy.h | 1 +
    mm/mempolicy.c | 11 ++++++-----
    2 files changed, 7 insertions(+), 5 deletions(-)

    diff --git a/include/uapi/linux/mempolicy.h b/include/uapi/linux/mempolicy.h
    index 3e835c9..d23dca8 100644
    --- a/include/uapi/linux/mempolicy.h
    +++ b/include/uapi/linux/mempolicy.h
    @@ -21,6 +21,7 @@ enum {
    MPOL_BIND,
    MPOL_INTERLEAVE,
    MPOL_LOCAL,
    + MPOL_NOOP, /* retain existing policy for range */
    MPOL_MAX, /* always last member of enum */
    };

    diff --git a/mm/mempolicy.c b/mm/mempolicy.c
    index 54bd3e5..c21e914 100644
    --- a/mm/mempolicy.c
    +++ b/mm/mempolicy.c
    @@ -251,10 +251,10 @@ static struct mempolicy *mpol_new(unsigned short mode, unsigned short flags,
    pr_debug("setting mode %d flags %d nodes[0] %lx\n",
    mode, flags, nodes ? nodes_addr(*nodes)[0] : -1);

    - if (mode == MPOL_DEFAULT) {
    + if (mode == MPOL_DEFAULT || mode == MPOL_NOOP) {
    if (nodes && !nodes_empty(*nodes))
    return ERR_PTR(-EINVAL);
    - return NULL; /* simply delete any existing policy */
    + return NULL;
    }
    VM_BUG_ON(!nodes);

    @@ -1147,7 +1147,7 @@ static long do_mbind(unsigned long start, unsigned long len,
    if (start & ~PAGE_MASK)
    return -EINVAL;

    - if (mode == MPOL_DEFAULT)
    + if (mode == MPOL_DEFAULT || mode == MPOL_NOOP)
    flags &= ~MPOL_MF_STRICT;

    len = (len + PAGE_SIZE - 1) & PAGE_MASK;
    @@ -2409,7 +2409,8 @@ static const char * const policy_modes[] =
    [MPOL_PREFERRED] = "prefer",
    [MPOL_BIND] = "bind",
    [MPOL_INTERLEAVE] = "interleave",
    - [MPOL_LOCAL] = "local"
    + [MPOL_LOCAL] = "local",
    + [MPOL_NOOP] = "noop", /* should not actually be used */
    };


    @@ -2460,7 +2461,7 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)
    break;
    }
    }
    - if (mode >= MPOL_MAX)
    + if (mode >= MPOL_MAX || mode == MPOL_NOOP)
    goto out;

    switch (mode) {
    --
    1.7.9.2


    \
     
     \ /
      Last update: 2012-11-21 13:01    [W:4.432 / U:1.380 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site