From 3f226aa1cbc006f9d90f22084f519ad2a1286cd8 Mon Sep 17 00:00:00 2001 From: Lee Schermerhorn Date: Mon, 28 Apr 2008 02:13:24 -0700 Subject: [PATCH] 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 Cc: Christoph Lameter Cc: David Rientjes Cc: Mel Gorman Cc: Andi Kleen Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- mm/mempolicy.c | 25 +++++++++++++++++-------- 1 file 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) /* * "local" is pseudo-policy: MPOL_PREFERRED with MPOL_F_LOCAL flag - * Used only for mpol_to_str() + * Used only for mpol_parse_str() and mpol_to_str() */ #define MPOL_LOCAL (MPOL_INTERLEAVE + 1) static const char * const policy_types[] = @@ -1990,21 +1990,16 @@ int mpol_parse_str(char *str, unsigned short *mode, unsigned short *mode_flags, if (flags) *flags++ = '\0'; /* terminate mode string */ - for (i = 0; i < MPOL_MAX; i++) { + for (i = 0; i <= MPOL_LOCAL; i++) { if (!strcmp(str, policy_types[i])) { *mode = i; break; } } - if (i == MPOL_MAX) + if (i > MPOL_LOCAL) goto out; switch (*mode) { - case MPOL_DEFAULT: - /* Don't allow a nodelist nor flags */ - if (!nodelist && !flags) - err = 0; - break; case MPOL_PREFERRED: /* Insist on a nodelist of one node only */ if (nodelist) { @@ -2027,6 +2022,20 @@ int mpol_parse_str(char *str, unsigned short *mode, unsigned short *mode_flags, if (!nodelist) *policy_nodes = node_states[N_HIGH_MEMORY]; err = 0; + break; + default: + /* + * MPOL_DEFAULT or MPOL_LOCAL + * Don't allow a nodelist nor flags + */ + if (!nodelist && !flags) + err = 0; + if (*mode == MPOL_DEFAULT) + goto out; + /* else MPOL_LOCAL */ + *mode = MPOL_PREFERRED; + nodes_clear(*policy_nodes); + break; } *mode_flags = 0;