[PATCH 12/15] Mempolicy: Clean-up mpol-to-str() mempolicy formatting

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


PATCH 12/15 Mempolicy:  Clean-up of mpol-to-str() mempolicy formatting

Against:  2.6.25-rc8-mm1

Signed-off-by:  Lee Schermerhorn <lee.schermerhorn@xxxxxx>

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@xxxxxx>

 mm/mempolicy.c |   17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

Index: linux-2.6.25-rc8-mm1/mm/mempolicy.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/mm/mempolicy.c	2008-04-03 15:54:01.000000000 -0400
+++ linux-2.6.25-rc8-mm1/mm/mempolicy.c	2008-04-03 17:11:56.000000000 -0400
@@ -1966,6 +1966,11 @@ static inline int mpol_to_str(char *buff
 	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
@@ -1992,7 +1997,6 @@ static inline int mpol_to_str(char *buff
 
 	default:
 		BUG();
-		return -EFAULT;
 	}
 
 	l = strlen(policy_types[mode]);
@@ -2003,16 +2007,17 @@ static inline int mpol_to_str(char *buff
 	p += l;
 
 	if (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)) {
--
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

[Home]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]    [Yosemite Photos]    [Free Online Dating]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Devices]

Add to Google Powered by Linux