Re: [PATCH] String conversions for memory policy

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

 



On Sat, 30 Jul 2005, Paul Jackson wrote:

> Would it make sense for you to do the same thing, when displaying
> mempolicies in /proc/<pid>/numa_policy?

Here is a new rev of the conversions patch. Thanks for all the feedback:

---

String conversions for memory policy

This patch adds two new functions to mm/mempolicy.c that allow the conversion
of a memory policy to a textual representation and vice versa.

Syntax of textual representation:

default
preferred=<nodenumber>
bind=<nodelist>
interleave=<nodelist>

Signed-off-by: Christoph Lameter <[email protected]>

Index: linux-2.6.13-rc4/mm/mempolicy.c
===================================================================
--- linux-2.6.13-rc4.orig/mm/mempolicy.c	2005-08-01 10:49:36.000000000 -0700
+++ linux-2.6.13-rc4/mm/mempolicy.c	2005-08-01 11:27:33.000000000 -0700
@@ -1170,3 +1170,100 @@
 {
 	sys_set_mempolicy(MPOL_DEFAULT, NULL, 0);
 }
+
+/*
+ * Convert a mempolicy into a string.
+ * Returns the number of characters in buffer (if positive)
+ * or an error (negative)
+ */
+int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol)
+{
+	char *p = buffer;
+	char *e = buffer + maxlen;
+
+	if (!pol || pol->policy == MPOL_DEFAULT) {
+
+		if (e < p + 8)
+			return -ENOSPC;
+
+		strcpy(buffer,"default");
+		p += 7;
+
+	} else if (pol->policy == MPOL_PREFERRED) {
+
+		if (e < p + 8 /* fixed string size */ + 4 /* max len of node number */)
+			return -ENOSPC;
+
+		p += sprintf(p, "prefer=%d", pol->v.preferred_node);
+
+	} else if (pol->policy == MPOL_BIND) {
+		nodemask_t nodes;
+
+		get_zonemask(pol, nodes.bits);
+
+		if (e < p + 8)
+			return -ENOSPC;
+
+		p += sprintf(p, "bind=");
+	 	p += nodelist_scnprintf(p, e - p, nodes);
+
+	} else if (pol->policy == MPOL_INTERLEAVE) {
+
+		if (e < p + 14)
+			return -ENOSPC;
+
+		p += sprintf(p, "interleave=");
+	 	p += nodelist_scnprintf(p, e - p, * (nodemask_t *)pol->v.nodes);
+
+	} else {
+
+		BUG();
+		return -EFAULT;
+
+	}
+	return p - buffer;
+}
+
+/*
+ * Convert a representation of a memory policy from text
+ * form to binary.
+ *
+ * Returns either a memory policy or NULL for error.
+ */
+struct mempolicy *str_to_mpol(char *buffer)
+{
+	nodemask_t nodes;
+	int mode;
+
+	if (strnicmp(buffer, "default", 7) == 0)
+		return &default_policy;
+
+	if (strnicmp(buffer, "prefer=", 7) == 0) {
+		int node;
+
+		mode = MPOL_PREFERRED;
+		node = simple_strtoul(buffer + 7, NULL, 10);
+		if (node >= MAX_NUMNODES || !node_online(node))
+			return NULL;
+
+		nodes_clear(nodes);
+		node_set(node, nodes);
+
+	} else if (strnicmp(buffer, "interleave=", 11) == 0) {
+
+		mode = MPOL_INTERLEAVE;
+		if (nodelist_parse(buffer + 11, nodes) ||
+		    nodes_empty(nodes))
+			return NULL;
+
+	} else if (strnicmp(buffer, "bind=", 5) == 0) {
+
+		mode = MPOL_BIND;
+		if (nodelist_parse(buffer+5, nodes))
+			return NULL;
+
+	}
+
+	return mpol_new(MPOL_BIND, nodes.bits);
+}
+
Index: linux-2.6.13-rc4/include/linux/mempolicy.h
===================================================================
--- linux-2.6.13-rc4.orig/include/linux/mempolicy.h	2005-08-01 10:49:35.000000000 -0700
+++ linux-2.6.13-rc4/include/linux/mempolicy.h	2005-08-01 10:49:41.000000000 -0700
@@ -157,6 +157,10 @@
 extern void numa_policy_init(void);
 extern struct mempolicy default_policy;
 
+/* Conversion functions */
+int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol);
+struct mempolicy *str_to_mpol(char *buffer);
+
 #else
 
 struct mempolicy {};
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]
  Powered by Linux