mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 14:12:06 +00:00
mempolicy: clean-up mpol-to-str() mempolicy formatting
mpol-to-str() formats memory policies into printable strings. Currently this is only used to display "numa_maps". A subsequent patch will use mpol_to_str() for formatting tmpfs [shmem] mpol mount options, allowing us to remove essentially duplicate code in mm/shmem.c. This patch cleans up mpol_to_str() generally and in preparation for that patch. 1) show_numa_maps() is not checking the return code from mpol_to_str(). There's not a lot we can do in this context if mpol_to_str() did return the error [insufficient space in buffer]. Proposed "solution": just check, under DEBUG_VM, that callers are providing sufficient buffer space for the policy, flags, and a few nodes. This way, we'll get some display. show_numa_maps() is providing a 50-byte buffer, so it won't trip this check. 50-bytes should be sufficient unless one has a large number of nodes in a very sparse nodemask. 2) The display of the new mode flags ["static" & "relative"] was set up to display multiple flags, separated by a "bar" '|'. However, this support is incomplete--e.g., need_bar was never incremented; and currently, these two flags are mutually exclusive. So remove the "bar" support, for now, and only display one flag. 3) Use snprint() to format flags, so as not to overflow the buffer. Not that it's ever happed, AFAIK. 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>
This commit is contained in:
parent
fc36b8d3d8
commit
2291990ab3
@ -1965,6 +1965,11 @@ static inline int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol)
|
||||
unsigned short mode;
|
||||
unsigned short flags = pol ? pol->flags : 0;
|
||||
|
||||
/*
|
||||
* Sanity check: room for longest mode, flag and some nodes
|
||||
*/
|
||||
VM_BUG_ON(maxlen < strlen("interleave") + strlen("relative") + 16);
|
||||
|
||||
if (!pol || pol == &default_policy)
|
||||
mode = MPOL_DEFAULT;
|
||||
else
|
||||
@ -1991,7 +1996,6 @@ static inline int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol)
|
||||
|
||||
default:
|
||||
BUG();
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
l = strlen(policy_types[mode]);
|
||||
@ -2002,16 +2006,17 @@ static inline int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol)
|
||||
p += l;
|
||||
|
||||
if (flags & MPOL_MODE_FLAGS) {
|
||||
int need_bar = 0;
|
||||
|
||||
if (buffer + maxlen < p + 2)
|
||||
return -ENOSPC;
|
||||
*p++ = '=';
|
||||
|
||||
/*
|
||||
* Currently, the only defined flags are mutually exclusive
|
||||
*/
|
||||
if (flags & MPOL_F_STATIC_NODES)
|
||||
p += sprintf(p, "%sstatic", need_bar++ ? "|" : "");
|
||||
if (flags & MPOL_F_RELATIVE_NODES)
|
||||
p += sprintf(p, "%srelative", need_bar++ ? "|" : "");
|
||||
p += snprintf(p, buffer + maxlen - p, "static");
|
||||
else if (flags & MPOL_F_RELATIVE_NODES)
|
||||
p += snprintf(p, buffer + maxlen - p, "relative");
|
||||
}
|
||||
|
||||
if (!nodes_empty(nodes)) {
|
||||
|
Loading…
Reference in New Issue
Block a user