[PATCH 6/15] Mempolicy: Mark shared policies for unref

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



PATCH 06/15 - Mempolicy:  Mark shared policies for unref

Against:  2.6.25-rc8-mm1

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:  Lee Schermerhorn <lee.schermerhorn@xxxxxx>

 include/linux/mempolicy.h |    7 +++++++
 mm/mempolicy.c            |    1 +
 2 files changed, 8 insertions(+)

Index: linux-2.6.25-rc8-mm1/mm/mempolicy.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/mm/mempolicy.c	2008-04-03 15:45:38.000000000 -0400
+++ linux-2.6.25-rc8-mm1/mm/mempolicy.c	2008-04-03 15:46:29.000000000 -0400
@@ -1751,6 +1751,7 @@ static struct sp_node *sp_alloc(unsigned
 	n->start = start;
 	n->end = end;
 	mpol_get(pol);
+	pol->flags |= MPOL_F_SHARED;	/* for unref */
 	n->policy = pol;
 	return n;
 }
Index: linux-2.6.25-rc8-mm1/include/linux/mempolicy.h
===================================================================
--- linux-2.6.25-rc8-mm1.orig/include/linux/mempolicy.h	2008-04-03 15:45:38.000000000 -0400
+++ linux-2.6.25-rc8-mm1/include/linux/mempolicy.h	2008-04-03 15:46:29.000000000 -0400
@@ -44,6 +44,13 @@ enum {
 #define MPOL_MF_MOVE_ALL (1<<2)	/* Move every page to conform to mapping */
 #define MPOL_MF_INTERNAL (1<<3)	/* Internal flags start here */
 
+/*
+ * Internal flags that share the struct mempolicy flags word with
+ * "mode flags".  These flags are allocated from bit 0 up, as they
+ * are never OR'ed into the mode in mempolicy API arguments.
+ */
+#define MPOL_F_SHARED  (1 << 0)	/* identify shared policies */
+
 #ifdef __KERNEL__
 
 #include <linux/mmzone.h>
--
To unsubscribe from this list: send the line "unsubscribe linux-numa" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]     [Devices]

  Powered by Linux