aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLee Schermerhorn <lee.schermerhorn@hp.com>2008-04-28 05:13:24 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-28 11:58:25 -0400
commit3f226aa1cbc006f9d90f22084f519ad2a1286cd8 (patch)
treee54a87abb19f9dea184f4c17c4c8532d3d715de8
parent095f1fc4ebf36c64fddf9b6db29b1ab5517378e6 (diff)
mempolicy: support mpol=local tmpfs mount option
For tmpfs/shmem shared policies, MPOL_DEFAULT is not necessarily equivalent to "local allocation". Because shared policies are at the same "scope" level [see Documentation/vm/numa_memory_policy.txt], as vma policies MPOL_DEFAULT means "fall back to current task policy". This patch extends the memory policy string parsing function to display "local" for MPOL_PREFERRED + MPOL_F_LOCAL. This allows one to specify local allocation as the default policy for shared memory areas via the tmpfs mpol mount option, regardless of the current task's policy. Also, "local" is now displayed for this policy. This patch allows us to accept the same input format as the display. Signed-off-by: Lee 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/mempolicy.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 155bb284dbf1..6b751565eed1 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -1951,7 +1951,7 @@ void numa_default_policy(void)
1951 1951
1952/* 1952/*
1953 * "local" is pseudo-policy: MPOL_PREFERRED with MPOL_F_LOCAL flag 1953 * "local" is pseudo-policy: MPOL_PREFERRED with MPOL_F_LOCAL flag
1954 * Used only for mpol_to_str() 1954 * Used only for mpol_parse_str() and mpol_to_str()
1955 */ 1955 */
1956#define MPOL_LOCAL (MPOL_INTERLEAVE + 1) 1956#define MPOL_LOCAL (MPOL_INTERLEAVE + 1)
1957static const char * const policy_types[] = 1957static const char * const policy_types[] =
@@ -1990,21 +1990,16 @@ int mpol_parse_str(char *str, unsigned short *mode, unsigned short *mode_flags,
1990 if (flags) 1990 if (flags)
1991 *flags++ = '\0'; /* terminate mode string */ 1991 *flags++ = '\0'; /* terminate mode string */
1992 1992
1993 for (i = 0; i < MPOL_MAX; i++) { 1993 for (i = 0; i <= MPOL_LOCAL; i++) {
1994 if (!strcmp(str, policy_types[i])) { 1994 if (!strcmp(str, policy_types[i])) {
1995 *mode = i; 1995 *mode = i;
1996 break; 1996 break;
1997 } 1997 }
1998 } 1998 }
1999 if (i == MPOL_MAX) 1999 if (i > MPOL_LOCAL)
2000 goto out; 2000 goto out;
2001 2001
2002 switch (*mode) { 2002 switch (*mode) {
2003 case MPOL_DEFAULT:
2004 /* Don't allow a nodelist nor flags */
2005 if (!nodelist && !flags)
2006 err = 0;
2007 break;
2008 case MPOL_PREFERRED: 2003 case MPOL_PREFERRED:
2009 /* Insist on a nodelist of one node only */ 2004 /* Insist on a nodelist of one node only */
2010 if (nodelist) { 2005 if (nodelist) {
@@ -2027,6 +2022,20 @@ int mpol_parse_str(char *str, unsigned short *mode, unsigned short *mode_flags,
2027 if (!nodelist) 2022 if (!nodelist)
2028 *policy_nodes = node_states[N_HIGH_MEMORY]; 2023 *policy_nodes = node_states[N_HIGH_MEMORY];
2029 err = 0; 2024 err = 0;
2025 break;
2026 default:
2027 /*
2028 * MPOL_DEFAULT or MPOL_LOCAL
2029 * Don't allow a nodelist nor flags
2030 */
2031 if (!nodelist && !flags)
2032 err = 0;
2033 if (*mode == MPOL_DEFAULT)
2034 goto out;
2035 /* else MPOL_LOCAL */
2036 *mode = MPOL_PREFERRED;
2037 nodes_clear(*policy_nodes);
2038 break;
2030 } 2039 }
2031 2040
2032 *mode_flags = 0; 2041 *mode_flags = 0;