From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from psmtp.com (na3sys010amx168.postini.com [74.125.245.168]) by kanga.kvack.org (Postfix) with SMTP id B91076B00FD for ; Fri, 16 Mar 2012 10:53:12 -0400 (EDT) Message-Id: <20120316144241.074193109@chello.nl> Date: Fri, 16 Mar 2012 15:40:43 +0100 From: Peter Zijlstra Subject: [RFC][PATCH 15/26] sched, numa: Implement hotplug hooks References: <20120316144028.036474157@chello.nl> Content-Disposition: inline; filename=numa-foo-6a.patch Sender: owner-linux-mm@kvack.org List-ID: To: Linus Torvalds , Andrew Morton , Thomas Gleixner , Ingo Molnar , Paul Turner , Suresh Siddha , Mike Galbraith , "Paul E. McKenney" , Lai Jiangshan , Dan Smith , Bharata B Rao , Lee Schermerhorn , Andrea Arcangeli , Rik van Riel , Johannes Weiner Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, Peter Zijlstra start/stop numa balance threads on-demand using cpu-hotlpug. Signed-off-by: Peter Zijlstra --- kernel/sched/numa.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 7 deletions(-) --- a/kernel/sched/numa.c +++ b/kernel/sched/numa.c @@ -596,31 +596,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; } -- 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/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1422954Ab2CPO64 (ORCPT ); Fri, 16 Mar 2012 10:58:56 -0400 Received: from casper.infradead.org ([85.118.1.10]:36590 "EHLO casper.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1422827Ab2CPOxY (ORCPT ); Fri, 16 Mar 2012 10:53:24 -0400 Message-Id: <20120316144241.074193109@chello.nl> User-Agent: quilt/0.48-1 Date: Fri, 16 Mar 2012 15:40:43 +0100 From: Peter Zijlstra To: Linus Torvalds , Andrew Morton , Thomas Gleixner , Ingo Molnar , Paul Turner , Suresh Siddha , Mike Galbraith , "Paul E. McKenney" , Lai Jiangshan , Dan Smith , Bharata B Rao , Lee Schermerhorn , Andrea Arcangeli , Rik van Riel , Johannes Weiner Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, Peter Zijlstra Subject: [RFC][PATCH 15/26] sched, numa: Implement hotplug hooks References: <20120316144028.036474157@chello.nl> Content-Disposition: inline; filename=numa-foo-6a.patch Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org start/stop numa balance threads on-demand using cpu-hotlpug. Signed-off-by: Peter Zijlstra --- kernel/sched/numa.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 7 deletions(-) --- a/kernel/sched/numa.c +++ b/kernel/sched/numa.c @@ -596,31 +596,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; }