aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2011-07-18 13:17:22 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2011-07-21 23:38:58 -0400
commit50d2a4223bb875d1e3a7ee97d40dd03bf31ce1b7 (patch)
tree56f82f9e393067c45ad8151076d1a790dd7f7848 /arch/powerpc
parent5adfd346e48c7742bad179f9e959d15afbf5f95e (diff)
powerpc: Copy back TIF flags on return from softirq stack
We already did it for hard IRQs but it looks like we forgot to do it for softirqs. Without this, we would lose flags such as TIF_NEED_RESCHED set using current_thread_info() by something running of a softirq. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/kernel/irq.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index 346cc4a396fe..d281fb6f12f3 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -451,11 +451,18 @@ static inline void do_softirq_onstack(void)
451 curtp = current_thread_info(); 451 curtp = current_thread_info();
452 irqtp = softirq_ctx[smp_processor_id()]; 452 irqtp = softirq_ctx[smp_processor_id()];
453 irqtp->task = curtp->task; 453 irqtp->task = curtp->task;
454 irqtp->flags = 0;
454 current->thread.ksp_limit = (unsigned long)irqtp + 455 current->thread.ksp_limit = (unsigned long)irqtp +
455 _ALIGN_UP(sizeof(struct thread_info), 16); 456 _ALIGN_UP(sizeof(struct thread_info), 16);
456 call_do_softirq(irqtp); 457 call_do_softirq(irqtp);
457 current->thread.ksp_limit = saved_sp_limit; 458 current->thread.ksp_limit = saved_sp_limit;
458 irqtp->task = NULL; 459 irqtp->task = NULL;
460
461 /* Set any flag that may have been set on the
462 * alternate stack
463 */
464 if (irqtp->flags)
465 set_bits(irqtp->flags, &curtp->flags);
459} 466}
460 467
461void do_softirq(void) 468void do_softirq(void)