vserver 1.9.5.x5
[linux-2.6.git] / drivers / base / node.c
index df74785..583d57e 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/hugetlb.h>
 #include <linux/cpumask.h>
 #include <linux/topology.h>
+#include <linux/nodemask.h>
 
 static struct sysdev_class node_class = {
        set_kset_name("node"),
@@ -23,7 +24,7 @@ static ssize_t node_read_cpumap(struct sys_device * dev, char * buf)
        int len;
 
        /* 2004/06/03: buf currently PAGE_SIZE, need > 1 char per 4 bits. */
-       BUILD_BUG_ON(NR_CPUS/4 > PAGE_SIZE/2);
+       BUILD_BUG_ON(MAX_NUMNODES/4 > PAGE_SIZE/2);
 
        len = cpumask_scnprintf(buf, PAGE_SIZE-1, mask);
        len += sprintf(buf + len, "\n");
@@ -111,6 +112,24 @@ static ssize_t node_read_numastat(struct sys_device * dev, char * buf)
 }
 static SYSDEV_ATTR(numastat, S_IRUGO, node_read_numastat, NULL);
 
+static ssize_t node_read_distance(struct sys_device * dev, char * buf)
+{
+       int nid = dev->id;
+       int len = 0;
+       int i;
+
+       /* buf currently PAGE_SIZE, need ~4 chars per node */
+       BUILD_BUG_ON(MAX_NUMNODES*4 > PAGE_SIZE/2);
+
+       for_each_online_node(i)
+               len += sprintf(buf + len, "%s%d", i ? " " : "", node_distance(nid, i));
+
+       len += sprintf(buf + len, "\n");
+       return len;
+}
+static SYSDEV_ATTR(distance, S_IRUGO, node_read_distance, NULL);
+
+
 /*
  * register_node - Setup a driverfs device for a node.
  * @num - Node number to use when creating the device.
@@ -129,6 +148,7 @@ int __init register_node(struct node *node, int num, struct node *parent)
                sysdev_create_file(&node->sysdev, &attr_cpumap);
                sysdev_create_file(&node->sysdev, &attr_meminfo);
                sysdev_create_file(&node->sysdev, &attr_numastat);
+               sysdev_create_file(&node->sysdev, &attr_distance);
        }
        return error;
 }