diff options
| author | Eric Dumazet <eric.dumazet@gmail.com> | 2011-03-22 19:30:44 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-22 20:44:01 -0400 |
| commit | 207205a2ba2655652fe46a60b49838af6c16a919 (patch) | |
| tree | 4309aa7cd5cf39c805219001e0ed8ec5b71e4d5e /include/linux | |
| parent | b6a84016bd2598e35ead635147fa53619982648d (diff) | |
kthread: NUMA aware kthread_create_on_node()
All kthreads being created from a single helper task, they all use memory
from a single node for their kernel stack and task struct.
This patch suite creates kthread_create_on_node(), adding a 'cpu' parameter
to parameters already used by kthread_create().
This parameter serves in allocating memory for the new kthread on its
memory node if possible.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Acked-by: David S. Miller <davem@davemloft.net>
Reviewed-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
Cc: Tejun Heo <tj@kernel.org>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: David Howells <dhowells@redhat.com>
Cc: <linux-arch@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/kthread.h | 14 | ||||
| -rw-r--r-- | include/linux/sched.h | 1 |
2 files changed, 11 insertions, 4 deletions
diff --git a/include/linux/kthread.h b/include/linux/kthread.h index 7ff16f7d3ed4..1e923e5e88e8 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h | |||
| @@ -4,10 +4,15 @@ | |||
| 4 | #include <linux/err.h> | 4 | #include <linux/err.h> |
| 5 | #include <linux/sched.h> | 5 | #include <linux/sched.h> |
| 6 | 6 | ||
| 7 | struct task_struct *kthread_create(int (*threadfn)(void *data), | 7 | struct task_struct *kthread_create_on_node(int (*threadfn)(void *data), |
| 8 | void *data, | 8 | void *data, |
| 9 | const char namefmt[], ...) | 9 | int node, |
| 10 | __attribute__((format(printf, 3, 4))); | 10 | const char namefmt[], ...) |
| 11 | __attribute__((format(printf, 4, 5))); | ||
| 12 | |||
| 13 | #define kthread_create(threadfn, data, namefmt, arg...) \ | ||
| 14 | kthread_create_on_node(threadfn, data, -1, namefmt, ##arg) | ||
| 15 | |||
| 11 | 16 | ||
| 12 | /** | 17 | /** |
| 13 | * kthread_run - create and wake a thread. | 18 | * kthread_run - create and wake a thread. |
| @@ -34,6 +39,7 @@ void *kthread_data(struct task_struct *k); | |||
| 34 | 39 | ||
| 35 | int kthreadd(void *unused); | 40 | int kthreadd(void *unused); |
| 36 | extern struct task_struct *kthreadd_task; | 41 | extern struct task_struct *kthreadd_task; |
| 42 | extern int tsk_fork_get_node(struct task_struct *tsk); | ||
| 37 | 43 | ||
| 38 | /* | 44 | /* |
| 39 | * Simple work processor based on kthread. | 45 | * Simple work processor based on kthread. |
diff --git a/include/linux/sched.h b/include/linux/sched.h index c15936fe998b..4b601be3dace 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -1471,6 +1471,7 @@ struct task_struct { | |||
| 1471 | #ifdef CONFIG_NUMA | 1471 | #ifdef CONFIG_NUMA |
| 1472 | struct mempolicy *mempolicy; /* Protected by alloc_lock */ | 1472 | struct mempolicy *mempolicy; /* Protected by alloc_lock */ |
| 1473 | short il_next; | 1473 | short il_next; |
| 1474 | short pref_node_fork; | ||
| 1474 | #endif | 1475 | #endif |
| 1475 | atomic_t fs_excl; /* holding fs exclusive resources */ | 1476 | atomic_t fs_excl; /* holding fs exclusive resources */ |
| 1476 | struct rcu_head rcu; | 1477 | struct rcu_head rcu; |
