Commit 20b0bb36 authored by Zwane Mwaikambo's avatar Zwane Mwaikambo Committed by Linus Torvalds

[PATCH] Run softirqs on proper processor on offline

We take down ksoftirqds at CPU_DEAD time, so there is a brief period whereupon
there is a ksoftirqd thread for an offline processor, it is at this point that
->cpus_allowed won't have it pinned anymore.  An online processor would then
take down that ksoftirqd and exit it.

Ensure that we only offline the processor when it's safe and never run
softirqs in another processor's ksoftirqd context.  This also gets rid of the
warnings in ksoftirqd on cpu offline.
Signed-off-by: default avatarZwane Mwaikambo <zwane@arm.linux.org.uk>
Acked-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent ad87b375
...@@ -355,8 +355,12 @@ static int ksoftirqd(void * __bind_cpu) ...@@ -355,8 +355,12 @@ static int ksoftirqd(void * __bind_cpu)
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
while (!kthread_should_stop()) { while (!kthread_should_stop()) {
if (!local_softirq_pending()) preempt_disable();
if (!local_softirq_pending()) {
preempt_enable_no_resched();
schedule(); schedule();
preempt_disable();
}
__set_current_state(TASK_RUNNING); __set_current_state(TASK_RUNNING);
...@@ -364,14 +368,14 @@ static int ksoftirqd(void * __bind_cpu) ...@@ -364,14 +368,14 @@ static int ksoftirqd(void * __bind_cpu)
/* Preempt disable stops cpu going offline. /* Preempt disable stops cpu going offline.
If already offline, we'll be on wrong CPU: If already offline, we'll be on wrong CPU:
don't process */ don't process */
preempt_disable();
if (cpu_is_offline((long)__bind_cpu)) if (cpu_is_offline((long)__bind_cpu))
goto wait_to_die; goto wait_to_die;
do_softirq(); do_softirq();
preempt_enable(); preempt_enable_no_resched();
cond_resched(); cond_resched();
preempt_disable();
} }
preempt_enable();
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
} }
__set_current_state(TASK_RUNNING); __set_current_state(TASK_RUNNING);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment