sched/numa: Implement hotplug callbacks
Commit-ID: 47d30cf50b1ceb09dc1a920262d80e621b307ae3 Gitweb: http://git.kernel.org/tip/47d30cf50b1ceb09dc1a920262d80e621b307ae3 Author: Peter Zijlstra <[email protected]> AuthorDate: Tue, 6 Mar 2012 17:37:25 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 18 May 2012 08:16:23 +0200
sched/numa: Implement hotplug callbacks
start/stop numa balance threads on-demand using cpu-hotplug.
Signed-off-by Peter Zijlstra <[email protected]>
Cc Suresh Siddha <[email protected]>
Cc Paul Turner <[email protected]>
Cc Dan Smith <[email protected]>
Cc Bharata B Rao <[email protected]>
Cc Lee Schermerhorn <[email protected]>
Cc Christoph Lameter <[email protected]>
Cc Rik van Riel <[email protected]>
Cc Andrea Arcangeli <[email protected]>
Cc Andrew Morton <[email protected]>
Cc Linus Torvalds <[email protected]>
Signed-off-by Ingo Molnar <[email protected]>
--- kernel/sched/numa.c | 62 +++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 55 insertions(+), 7 deletions(-)
kernel/sched/numa.c +55 -7
@@ -710,31 +710,79 @@ static int numad_thread(void *data)return 0 ; } +static int __cpuinit +numa_hotplug (struct notifier_block *nb,unsigned long action,void *hcpu) +{ +int cpu = (long )hcpu; +int node =cpu_to_node (cpu); +struct node_queue *nq =nq_of (node); +struct task_struct *numad; +int err =0 ; + +switch (action & ~CPU_TASKS_FROZEN ) { +case CPU_UP_PREPARE : +if (nq->numad) +break ; + + numad =kthread_create_on_node (numad_thread, + nq, node,"numad/%d" , node); +if (IS_ERR (numad)) { + err =PTR_ERR (numad); +break ; + } + + nq->numad = numad; + nq->next_schedule = jiffies +HZ ;// XXX sync-up? +break ; + +case CPU_ONLINE : +wake_up_process (nq->numad); +break ; + +case CPU_DEAD : +case CPU_UP_CANCELED : +if (!nq->numad) +break ; + +if (cpumask_any_and (cpu_online_mask, +cpumask_of_node (node)) >= nr_cpu_ids) { +kthread_stop (nq->numad); + nq->numad =NULL ; + } +break ; + } + +return notifier_from_errno (err); +} +static __init int numa_init (void ) { -int node; +int node, cpu, err; nqs =kzalloc (sizeof (struct node_queue *) * nr_node_ids,GFP_KERNEL );BUG_ON (!nqs); -for_each_node (node) {// XXX hotplug +for_each_node (node) {struct node_queue *nq =kmalloc_node (sizeof (*nq),GFP_KERNEL | __GFP_ZERO, node);BUG_ON (!nq); - nq->numad =kthread_create_on_node (numad_thread, - nq, node,"numad/%d" , node); -BUG_ON (IS_ERR (nq->numad)); -spin_lock_init (&nq->lock);INIT_LIST_HEAD (&nq->entity_list); nq->next_schedule = jiffies +HZ ; nq->node = node; nqs[node] = nq; + } -wake_up_process (nq->numad); +get_online_cpus (); +cpu_notifier (numa_hotplug,0 ); +for_each_online_cpu (cpu) { + err =numa_hotplug (NULL ,CPU_UP_PREPARE , (void *)(long )cpu); +BUG_ON (notifier_to_errno (err)); +numa_hotplug (NULL ,CPU_ONLINE , (void *)(long )cpu); } +put_online_cpus ();return 0 ; }