From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: LKML <linux-kernel@vger.kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@kernel.org>,
"Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>,
Rusty Russell <rusty@rustcorp.com.au>, Tejun Heo <tj@kernel.org>
Subject: Re: [RFC patch V2 4/7] softirq: Use hotplug thread infrastructure
Date: Fri, 15 Jun 2012 14:49:04 -0700 [thread overview]
Message-ID: <20120615214904.GA26153@linux.vnet.ibm.com> (raw)
In-Reply-To: <20120615140714.592954302@linutronix.de>
On Fri, Jun 15, 2012 at 02:13:22PM -0000, Thomas Gleixner wrote:
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
And I got the following build errors on !SMP:
kernel/built-in.o: In function `run_ksoftirqd':
/usr/local/autobench/var/tmp/build/kernel/softirq.c:739: undefined reference to `.smpboot_thread_check_parking'
kernel/built-in.o: In function `watchdog':
/usr/local/autobench/var/tmp/build/kernel/watchdog.c:383: undefined reference to `.smpboot_thread_check_parking'
kernel/built-in.o: In function `spawn_ksoftirqd':
/usr/local/autobench/var/tmp/build/kernel/softirq.c:853: undefined reference to `.smpboot_register_percpu_thread'
kernel/built-in.o: In function `lockup_detector_init':
/usr/local/autobench/var/tmp/build/kernel/watchdog.c:514: undefined reference to `.smpboot_register_percpu_thread'
My guess is that !SMP needs empty definitions of these functions.
Thanx, Paul
> ---
> kernel/softirq.c | 84 +++++++++++--------------------------------------------
> 1 file changed, 18 insertions(+), 66 deletions(-)
>
> Index: tip/kernel/softirq.c
> ===================================================================
> --- tip.orig/kernel/softirq.c
> +++ tip/kernel/softirq.c
> @@ -23,6 +23,7 @@
> #include <linux/rcupdate.h>
> #include <linux/ftrace.h>
> #include <linux/smp.h>
> +#include <linux/smpboot.h>
> #include <linux/tick.h>
>
> #define CREATE_TRACE_POINTS
> @@ -733,24 +734,17 @@ void __init softirq_init(void)
> open_softirq(HI_SOFTIRQ, tasklet_hi_action);
> }
>
> -static int run_ksoftirqd(void * __bind_cpu)
> +static int run_ksoftirqd(void *td)
> {
> - set_current_state(TASK_INTERRUPTIBLE);
> -
> - while (!kthread_should_stop()) {
> + while (!smpboot_thread_check_parking(td)) {
> + set_current_state(TASK_INTERRUPTIBLE);
> preempt_disable();
> - if (!local_softirq_pending()) {
> + if (!local_softirq_pending())
> schedule_preempt_disabled();
> - }
>
> __set_current_state(TASK_RUNNING);
>
> while (local_softirq_pending()) {
> - /* Preempt disable stops cpu going offline.
> - If already offline, we'll be on wrong CPU:
> - don't process */
> - if (cpu_is_offline((long)__bind_cpu))
> - goto wait_to_die;
> local_irq_disable();
> if (local_softirq_pending())
> __do_softirq();
> @@ -758,23 +752,10 @@ static int run_ksoftirqd(void * __bind_c
> sched_preempt_enable_no_resched();
> cond_resched();
> preempt_disable();
> - rcu_note_context_switch((long)__bind_cpu);
> + rcu_note_context_switch(smp_processor_id());
> }
> preempt_enable();
> - set_current_state(TASK_INTERRUPTIBLE);
> }
> - __set_current_state(TASK_RUNNING);
> - return 0;
> -
> -wait_to_die:
> - preempt_enable();
> - /* Wait for kthread_stop */
> - set_current_state(TASK_INTERRUPTIBLE);
> - while (!kthread_should_stop()) {
> - schedule();
> - set_current_state(TASK_INTERRUPTIBLE);
> - }
> - __set_current_state(TASK_RUNNING);
> return 0;
> }
>
> @@ -841,50 +822,17 @@ static int __cpuinit cpu_callback(struct
> unsigned long action,
> void *hcpu)
> {
> - int hotcpu = (unsigned long)hcpu;
> - struct task_struct *p;
> -
> switch (action) {
> - case CPU_UP_PREPARE:
> - case CPU_UP_PREPARE_FROZEN:
> - p = kthread_create_on_node(run_ksoftirqd,
> - hcpu,
> - cpu_to_node(hotcpu),
> - "ksoftirqd/%d", hotcpu);
> - if (IS_ERR(p)) {
> - printk("ksoftirqd for %i failed\n", hotcpu);
> - return notifier_from_errno(PTR_ERR(p));
> - }
> - kthread_bind(p, hotcpu);
> - per_cpu(ksoftirqd, hotcpu) = p;
> - break;
> - case CPU_ONLINE:
> - case CPU_ONLINE_FROZEN:
> - wake_up_process(per_cpu(ksoftirqd, hotcpu));
> - break;
> #ifdef CONFIG_HOTPLUG_CPU
> - case CPU_UP_CANCELED:
> - case CPU_UP_CANCELED_FROZEN:
> - if (!per_cpu(ksoftirqd, hotcpu))
> - break;
> - /* Unbind so it can run. Fall thru. */
> - kthread_bind(per_cpu(ksoftirqd, hotcpu),
> - cpumask_any(cpu_online_mask));
> case CPU_DEAD:
> case CPU_DEAD_FROZEN: {
> - static const struct sched_param param = {
> - .sched_priority = MAX_RT_PRIO-1
> - };
> -
> - p = per_cpu(ksoftirqd, hotcpu);
> - per_cpu(ksoftirqd, hotcpu) = NULL;
> - sched_setscheduler_nocheck(p, SCHED_FIFO, ¶m);
> - kthread_stop(p);
> + int hotcpu = (unsigned long)hcpu;
> +
> takeover_tasklets(hotcpu);
> break;
> }
> #endif /* CONFIG_HOTPLUG_CPU */
> - }
> + }
> return NOTIFY_OK;
> }
>
> @@ -892,14 +840,18 @@ static struct notifier_block __cpuinitda
> .notifier_call = cpu_callback
> };
>
> +static struct smp_hotplug_thread softirq_threads = {
> + .store = &ksoftirqd,
> + .thread_fn = run_ksoftirqd,
> + .thread_comm = "ksoftirqd/%u",
> +};
> +
> static __init int spawn_ksoftirqd(void)
> {
> - void *cpu = (void *)(long)smp_processor_id();
> - int err = cpu_callback(&cpu_nfb, CPU_UP_PREPARE, cpu);
> -
> - BUG_ON(err != NOTIFY_OK);
> - cpu_callback(&cpu_nfb, CPU_ONLINE, cpu);
> register_cpu_notifier(&cpu_nfb);
> +
> + BUG_ON(smpboot_register_percpu_thread(&softirq_threads));
> +
> return 0;
> }
> early_initcall(spawn_ksoftirqd);
>
>
next prev parent reply other threads:[~2012-06-15 21:49 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-15 14:13 [RFC patch V2 0/7] Per cpu thread hotplug infrastructure Thomas Gleixner
2012-06-15 14:13 ` [RFC patch V2 1/7] rcu: Yield simpler Thomas Gleixner
2012-06-15 14:13 ` [RFC patch V2 3/7] smpboot: Provide infrastructure for percpu hotplug threads Thomas Gleixner
2012-06-15 14:13 ` [RFC patch V2 2/7] kthread: Implement park/unpark facility Thomas Gleixner
2012-06-18 8:43 ` Namhyung Kim
2012-06-18 8:50 ` Thomas Gleixner
2012-06-15 14:13 ` [RFC patch V2 4/7] softirq: Use hotplug thread infrastructure Thomas Gleixner
2012-06-15 21:49 ` Paul E. McKenney [this message]
2012-06-15 14:13 ` [RFC patch V2 5/7] watchdog: " Thomas Gleixner
2012-06-15 14:13 ` [RFC patch V2 6/7] rcu: Use smp_hotplug_thread facility for RCUs per-CPU kthread Thomas Gleixner
2012-06-15 14:13 ` [RFC patch V2 7/7] infiniband: ehca: Use hotplug thread infrastructure Thomas Gleixner
2012-06-26 23:26 ` [RFC patch V2 0/7] Per cpu thread hotplug infrastructure Paul E. McKenney
2012-06-27 9:52 ` Peter Zijlstra
2012-06-27 14:14 ` Paul E. McKenney
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=20120615214904.GA26153@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=rusty@rustcorp.com.au \
--cc=srivatsa.bhat@linux.vnet.ibm.com \
--cc=tglx@linutronix.de \
--cc=tj@kernel.org \
/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