Skip to content

Commit

Permalink
mempolicy: support mpol=local tmpfs mount option
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: Christoph Lameter <[email protected]>
Cc: David Rientjes <[email protected]>
Cc: Mel Gorman <[email protected]>
Cc: Andi Kleen <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Lee Schermerhorn authored and torvalds committed Apr 28, 2008
1 parent 095f1fc commit 3f226aa
Showing 1 changed file with 17 additions and 8 deletions.
25 changes: 17 additions & 8 deletions mm/mempolicy.c
Original file line number Diff line number Diff line change
Expand Up @@ -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[] =
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
Expand Down

0 comments on commit 3f226aa

Please sign in to comment.