Re: [PATCH] String conversions for memory policy

From: Christoph Lameter
Date: Mon Aug 01 2005 - 13:52:17 EST


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 <christoph@xxxxxxxxxxx>

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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/