mm: add numa node symlink for memory section in sysfs
Alex Chiang [Tue, 15 Dec 2009 01:59:05 +0000 (17:59 -0800)]
Commit c04fc586c (mm: show node to memory section relationship with
symlinks in sysfs) created symlinks from nodes to memory sections, e.g.

/sys/devices/system/node/node1/memory135 -> ../../memory/memory135

If you're examining the memory section though and are wondering what node
it might belong to, you can find it by grovelling around in sysfs, but
it's a little cumbersome.

Add a reverse symlink for each memory section that points back to the
node to which it belongs.

Signed-off-by: Alex Chiang <achiang@hp.com>
Cc: Gary Hade <garyhade@us.ibm.com>
Cc: Badari Pulavarty <pbadari@us.ibm.com>
Cc: Ingo Molnar <mingo@elte.hu>
Acked-by: David Rientjes <rientjes@google.com>
Cc: Greg KH <greg@kroah.com>
Cc: Randy Dunlap <randy.dunlap@oracle.com>
Cc: David Rientjes <rientjes@google.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Documentation/ABI/testing/sysfs-devices-memory
Documentation/memory-hotplug.txt
drivers/base/node.c

index 9fe91c0..bf1627b 100644 (file)
@@ -60,6 +60,19 @@ Description:
 Users:         hotplug memory remove tools
                https://w3.opensource.ibm.com/projects/powerpc-utils/
 
+
+What:          /sys/devices/system/memoryX/nodeY
+Date:          October 2009
+Contact:       Linux Memory Management list <linux-mm@kvack.org>
+Description:
+               When CONFIG_NUMA is enabled, a symbolic link that
+               points to the corresponding NUMA node directory.
+
+               For example, the following symbolic link is created for
+               memory section 9 on node0:
+               /sys/devices/system/memory/memory9/node0 -> ../../node/node0
+
+
 What:          /sys/devices/system/node/nodeX/memoryY
 Date:          September 2008
 Contact:       Gary Hade <garyhade@us.ibm.com>
@@ -70,4 +83,3 @@ Description:
                memory section directory.  For example, the following symbolic
                link is created for memory section 9 on node0.
                /sys/devices/system/node/node0/memory9 -> ../../memory/memory9
-
index bbc8a6a..57e7e9c 100644 (file)
@@ -160,12 +160,15 @@ Under each section, you can see 4 files.
 NOTE:
   These directories/files appear after physical memory hotplug phase.
 
-If CONFIG_NUMA is enabled the
-/sys/devices/system/memory/memoryXXX memory section
-directories can also be accessed via symbolic links located in
-the /sys/devices/system/node/node* directories.  For example:
+If CONFIG_NUMA is enabled the memoryXXX/ directories can also be accessed
+via symbolic links located in the /sys/devices/system/node/node* directories.
+
+For example:
 /sys/devices/system/node/node0/memory9 -> ../../memory/memory9
 
+A backlink will also be created:
+/sys/devices/system/memory/memory9/node0 -> ../../node/node0
+
 --------------------------------
 4. Physical memory hot-add phase
 --------------------------------
index 54e5d8e..44eed11 100644 (file)
@@ -312,6 +312,7 @@ static int get_nid_for_pfn(unsigned long pfn)
 /* register memory section under specified node if it spans that node */
 int register_mem_sect_under_node(struct memory_block *mem_blk, int nid)
 {
+       int ret;
        unsigned long pfn, sect_start_pfn, sect_end_pfn;
 
        if (!mem_blk)
@@ -328,9 +329,15 @@ int register_mem_sect_under_node(struct memory_block *mem_blk, int nid)
                        continue;
                if (page_nid != nid)
                        continue;
-               return sysfs_create_link_nowarn(&node_devices[nid].sysdev.kobj,
+               ret = sysfs_create_link_nowarn(&node_devices[nid].sysdev.kobj,
                                        &mem_blk->sysdev.kobj,
                                        kobject_name(&mem_blk->sysdev.kobj));
+               if (ret)
+                       return ret;
+
+               return sysfs_create_link_nowarn(&mem_blk->sysdev.kobj,
+                               &node_devices[nid].sysdev.kobj,
+                               kobject_name(&node_devices[nid].sysdev.kobj));
        }
        /* mem section does not span the specified node */
        return 0;
@@ -359,6 +366,8 @@ int unregister_mem_sect_under_nodes(struct memory_block *mem_blk)
                        continue;
                sysfs_remove_link(&node_devices[nid].sysdev.kobj,
                         kobject_name(&mem_blk->sysdev.kobj));
+               sysfs_remove_link(&mem_blk->sysdev.kobj,
+                        kobject_name(&node_devices[nid].sysdev.kobj));
        }
        return 0;
 }