powerpc: Copy back TIF flags on return from softirq stack
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Mon, 18 Jul 2011 17:17:22 +0000 (17:17 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 22 Jul 2011 03:38:58 +0000 (13:38 +1000)
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>
arch/powerpc/kernel/irq.c

index 346cc4a..d281fb6 100644 (file)
@@ -451,11 +451,18 @@ static inline void do_softirq_onstack(void)
        curtp = current_thread_info();
        irqtp = softirq_ctx[smp_processor_id()];
        irqtp->task = curtp->task;
+       irqtp->flags = 0;
        current->thread.ksp_limit = (unsigned long)irqtp +
                                    _ALIGN_UP(sizeof(struct thread_info), 16);
        call_do_softirq(irqtp);
        current->thread.ksp_limit = saved_sp_limit;
        irqtp->task = NULL;
+
+       /* Set any flag that may have been set on the
+        * alternate stack
+        */
+       if (irqtp->flags)
+               set_bits(irqtp->flags, &curtp->flags);
 }
 
 void do_softirq(void)