• L
    mempolicy: mark shared policies for unref · aab0b102
    Lee Schermerhorn 提交于
    As part of yet another rework of mempolicy reference counting, we want to be
    able to identify shared policies efficiently, because they have an extra ref
    taken on lookup that needs to be removed when we're finished using the policy.
    
      Note:  the extra ref is required because the policies are
      shared between tasks/processes and can be changed/freed
      by one task while another task is using them--e.g., for
      page allocation.
    
    Building on David Rientjes mempolicy "mode flags" enhancement, this patch
    indicates a "shared" policy by setting a new MPOL_F_SHARED flag in the flags
    member of the struct mempolicy added by David.  MPOL_F_SHARED, and any future
    "internal mode flags" are reserved from bit zero up, as they will never be
    passed in the upper bits of the mode argument of a mempolicy API.
    
    I set the MPOL_F_SHARED flag when the policy is installed in the shared policy
    rb-tree.  Don't need/want to clear the flag when removing from the tree as the
    mempolicy is freed [unref'd] internally to the sp_delete() function.  However,
    a task could hold another reference on this mempolicy from a prior lookup.  We
    need the MPOL_F_SHARED flag to stay put so that any tasks holding a ref will
    unref, eventually freeing, the mempolicy.
    
    A later patch in this series will introduce a function to conditionally unref
    [mpol_free] a policy.  The MPOL_F_SHARED flag is one reason [currently the
    only reason] to unref/free a policy via the conditional free.
    Signed-off-by: NLee Schermerhorn <lee.schermerhorn@hp.com>
    Cc: Christoph Lameter <clameter@sgi.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Cc: Andi Kleen <ak@suse.de>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    aab0b102
mempolicy.c 54.4 KB