From: Lee Schermerhorn <lee.schermerhorn@hp.com>
To: linux-mm@kvack.org, linux-numa@vger.kernel.org
Cc: akpm@linux-foundation.org, Mel Gorman <mel@csn.ul.ie>,
clameter@sgi.com, Randy Dunlap <randy.dunlap@oracle.com>,
Nishanth Aravamudan <nacc@us.ibm.com>,
David Rientjes <rientjes@google.com>, Adam Litke <agl@us.ibm.com>,
Andy Whitcroft <apw@canonical.com>,
eric.whitney@hp.com
Subject: [PATCH 10/10] hugetlb: offload per node attribute registrations
Date: Thu, 01 Oct 2009 12:59:09 -0400 [thread overview]
Message-ID: <20091001165909.32248.63490.sendpatchset@localhost.localdomain> (raw)
In-Reply-To: <20091001165721.32248.14861.sendpatchset@localhost.localdomain>
[PATCH 10/10] hugetlb: offload [un]registration of sysfs attr to worker thread
Against: 2.6.31-mmotm-090925-1435
New in V6
V7: + remove redundant check for memory{ful|less} node from
node_hugetlb_work(). Rely on [added] return from
hugetlb_register_node() to differentiate between transitions
to/from memoryless state.
This patch offloads the registration and unregistration of per node
hstate sysfs attributes to a worker thread rather than attempt the
allocation/attachment or detachment/freeing of the attributes in
the context of the memory hotplug handler.
N.B., Only tested build, boot, libhugetlbfs regression.
i.e., no memory hotplug testing.
Signed-off-by: Lee Schermerhorn <lee.schermerhorn@hp.com>
drivers/base/node.c | 51 ++++++++++++++++++++++++++++++++++++++++++---------
include/linux/node.h | 5 +++++
2 files changed, 47 insertions(+), 9 deletions(-)
Index: linux-2.6.31-mmotm-090925-1435/include/linux/node.h
===================================================================
--- linux-2.6.31-mmotm-090925-1435.orig/include/linux/node.h 2009-09-30 15:05:20.000000000 -0400
+++ linux-2.6.31-mmotm-090925-1435/include/linux/node.h 2009-09-30 15:05:58.000000000 -0400
@@ -21,9 +21,14 @@
#include <linux/sysdev.h>
#include <linux/cpumask.h>
+#include <linux/workqueue.h>
struct node {
struct sys_device sysdev;
+
+#if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) && defined(CONFIG_HUGETLBFS)
+ struct work_struct node_work;
+#endif
};
struct memory_block;
Index: linux-2.6.31-mmotm-090925-1435/drivers/base/node.c
===================================================================
--- linux-2.6.31-mmotm-090925-1435.orig/drivers/base/node.c 2009-09-30 15:05:57.000000000 -0400
+++ linux-2.6.31-mmotm-090925-1435/drivers/base/node.c 2009-09-30 15:05:58.000000000 -0400
@@ -186,11 +186,14 @@ static SYSDEV_ATTR(distance, S_IRUGO, no
static node_registration_func_t __hugetlb_register_node;
static node_registration_func_t __hugetlb_unregister_node;
-static inline void hugetlb_register_node(struct node *node)
+static inline bool hugetlb_register_node(struct node *node)
{
if (__hugetlb_register_node &&
- node_state(node->sysdev.id, N_HIGH_MEMORY))
+ node_state(node->sysdev.id, N_HIGH_MEMORY)) {
__hugetlb_register_node(node);
+ return true;
+ }
+ return false;
}
static inline void hugetlb_unregister_node(struct node *node)
@@ -387,10 +390,31 @@ static int link_mem_sections(int nid)
return err;
}
+#ifdef CONFIG_HUGETLBFS
/*
* Handle per node hstate attribute [un]registration on transistions
* to/from memoryless state.
*/
+static void node_hugetlb_work(struct work_struct *work)
+{
+ struct node *node = container_of(work, struct node, node_work);
+
+ /*
+ * We only get here when a node transitions to/from memoryless state.
+ * We can detect which transition occurred by examining whether the
+ * node has memory now. hugetlb_register_node() already check this
+ * so we try to register the attributes. If that fails, then the
+ * node has transitioned to memoryless, try to unregister the
+ * attributes.
+ */
+ if (!hugetlb_register_node(node))
+ hugetlb_unregister_node(node);
+}
+
+static void init_node_hugetlb_work(int nid)
+{
+ INIT_WORK(&node_devices[nid].node_work, node_hugetlb_work);
+}
static int node_memory_callback(struct notifier_block *self,
unsigned long action, void *arg)
@@ -399,14 +423,16 @@ static int node_memory_callback(struct n
int nid = mnb->status_change_nid;
switch (action) {
- case MEM_ONLINE: /* memory successfully brought online */
+ case MEM_ONLINE:
+ case MEM_OFFLINE:
+ /*
+ * offload per node hstate [un]registration to a work thread
+ * when transitioning to/from memoryless state.
+ */
if (nid != NUMA_NO_NODE)
- hugetlb_register_node(&node_devices[nid]);
- break;
- case MEM_OFFLINE: /* or offline */
- if (nid != NUMA_NO_NODE)
- hugetlb_unregister_node(&node_devices[nid]);
+ schedule_work(&node_devices[nid].node_work);
break;
+
case MEM_GOING_ONLINE:
case MEM_GOING_OFFLINE:
case MEM_CANCEL_ONLINE:
@@ -417,7 +443,8 @@ static int node_memory_callback(struct n
return NOTIFY_OK;
}
-#else
+#endif /* CONFIG_HUGETLBFS */
+#else /* !CONFIG_MEMORY_HOTPLUG_SPARSE */
static int link_mem_sections(int nid) { return 0; }
static inline int node_memory_callback(struct notifier_block *self,
@@ -425,6 +452,9 @@ static inline int node_memory_callback(s
{
return NOTIFY_OK;
}
+
+static void init_node_hugetlb_work(int nid) { }
+
#endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */
int register_one_node(int nid)
@@ -449,6 +479,9 @@ int register_one_node(int nid)
/* link memory sections under this node */
error = link_mem_sections(nid);
+
+ /* initialize work queue for memory hot plug */
+ init_node_hugetlb_work(nid);
}
return error;
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2009-10-01 16:59 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-01 16:57 [PATCH 0/10] hugetlb: V8 numa control of persistent huge pages alloc/free Lee Schermerhorn
2009-10-01 16:57 ` [PATCH 1/10] hugetlb: rework hstate_next_node_* functions Lee Schermerhorn
2009-10-01 16:57 ` [PATCH 2/10] hugetlb: add nodemask arg to huge page alloc, free and surplus adjust fcns Lee Schermerhorn
2009-10-01 16:58 ` [PATCH 3/10] hugetlb: factor init_nodemask_of_node Lee Schermerhorn
2009-10-02 9:48 ` Mel Gorman
2009-10-02 11:38 ` Lee Schermerhorn
2009-10-03 17:25 ` Andrew Morton
2009-10-01 16:58 ` [PATCH 4/10] hugetlb: derive huge pages nodes allowed from task mempolicy Lee Schermerhorn
2009-10-02 10:11 ` Mel Gorman
2009-10-02 22:41 ` David Rientjes
2009-10-02 22:16 ` [patch] nodemask: make NODEMASK_ALLOC more general David Rientjes
2009-10-02 22:48 ` Christoph Lameter
2009-10-03 1:03 ` KAMEZAWA Hiroyuki
2009-10-06 3:46 ` David Rientjes
2009-10-03 0:59 ` KAMEZAWA Hiroyuki
2009-10-02 22:16 ` [PATCH 4/10] hugetlb: derive huge pages nodes allowed from task mempolicy David Rientjes
2009-10-02 23:23 ` Christoph Lameter
2009-10-05 11:15 ` Lee Schermerhorn
2009-10-05 20:58 ` David Rientjes
2009-10-06 2:54 ` Lee Schermerhorn
2009-10-06 3:33 ` David Rientjes
2009-10-01 16:58 ` [PATCH 5/10] hugetlb: add generic definition of NUMA_NO_NODE Lee Schermerhorn
2009-10-01 16:58 ` [PATCH 6/10] hugetlb: add per node hstate attributes Lee Schermerhorn
2009-10-01 16:58 ` [PATCH 7/10] hugetlb: update hugetlb documentation for NUMA controls Lee Schermerhorn
2009-10-01 19:47 ` Randy Dunlap
2009-10-02 11:43 ` Lee Schermerhorn
2009-10-01 16:58 ` [PATCH 8/10] hugetlb: use only nodes with memory for huge pages Lee Schermerhorn
2009-10-01 16:59 ` [PATCH 9/10] hugetlb: handle memory hot-plug events Lee Schermerhorn
2009-10-01 16:59 ` Lee Schermerhorn [this message]
2010-03-31 11:23 ` [APPLIED] [PATCH 0/10] hugetlb: V8 numa control of persistent huge pages alloc/free Andy Whitcroft
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20091001165909.32248.63490.sendpatchset@localhost.localdomain \
--to=lee.schermerhorn@hp.com \
--cc=agl@us.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=apw@canonical.com \
--cc=clameter@sgi.com \
--cc=eric.whitney@hp.com \
--cc=linux-mm@kvack.org \
--cc=linux-numa@vger.kernel.org \
--cc=mel@csn.ul.ie \
--cc=nacc@us.ibm.com \
--cc=randy.dunlap@oracle.com \
--cc=rientjes@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).