From 4c2d47edfd6114ce818a93c97a5f34ca38c6c5f3 Mon Sep 17 00:00:00 2001 From: Ralf Baechle Date: Sun, 10 Jun 2001 16:17:47 +0000 Subject: We were not always calling handle_softirq resulting in softirqs potencially delayed. 32-bit kernel got it wrong for the SMP case. --- arch/mips/kernel/entry.S | 11 ++++++++--- arch/mips/kernel/scall_o32.S | 10 ++++++++-- arch/mips64/kernel/scall_64.S | 10 ++++++++-- arch/mips64/kernel/scall_o32.S | 10 ++++++++-- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S index 59bc8c2c9..8232e9364 100644 --- a/arch/mips/kernel/entry.S +++ b/arch/mips/kernel/entry.S @@ -44,12 +44,17 @@ reschedule: jal schedule EXPORT(ret_from_sys_call) EXPORT(ret_from_irq) .type ret_from_irq,@function - lw t0, irq_stat # softirq_active - lw t1, irq_stat+4 # softirq_mask. unused delay slot + la t1, irq_stat # softirq_active +#ifdef CONFIG_SMP + lw t0, TASK_PROCESSOR($28) + sll t0, t0, 5 + addu t1, t0 +#endif + lw t0, 0(t1) # softirq_active + lw t1, 4(t1) # softirq_mask. unused delay slot and t0, t1 bnez t0, handle_softirq - 9: lw t0,PT_STATUS(sp) # returning to kernel mode? lw t2, TASK_NEED_RESCHED($28) andi t1, t0, KU_USER diff --git a/arch/mips/kernel/scall_o32.S b/arch/mips/kernel/scall_o32.S index bdc72ca4e..d7c107599 100644 --- a/arch/mips/kernel/scall_o32.S +++ b/arch/mips/kernel/scall_o32.S @@ -65,8 +65,14 @@ stack_done: 1: sw v0, PT_R2(sp) # result EXPORT(o32_ret_from_sys_call) - lw t0, irq_stat # softirq_active - lw t1, irq_stat+4 # softirq_mask. unused delay slot + la t1, irq_stat # softirq_active +#ifdef CONFIG_SMP + lw t0, TASK_PROCESSOR($28) + sll t0, t0, 5 + addu t1, t0 +#endif + lw t0, 0(t1) # softirq_active + lw t1, 4(t1) # softirq_mask. unused delay slot and t0, t1 bnez t0, o32_handle_softirq diff --git a/arch/mips64/kernel/scall_64.S b/arch/mips64/kernel/scall_64.S index 4e10263b6..326e76ec2 100644 --- a/arch/mips64/kernel/scall_64.S +++ b/arch/mips64/kernel/scall_64.S @@ -63,8 +63,14 @@ NESTED(handle_sys64, PT_SIZE, sp) 1: sd v0, PT_R2(sp) # result FEXPORT(ret_from_sys_call_64) - lw t0, irq_stat # softirq_active - lw t1, irq_stat+4 # softirq_mask. unused delay slot + la t1, irq_stat # softirq_active +#ifdef CONFIG_SMP + lwu t0, TASK_PROCESSOR($28) + dsll t0, t0, 5 + daddu t1, t0 +#endif + lw t0, 0(t1) # softirq_active + lw t1, 4(t1) # softirq_mask. unused delay slot and t0, t1 bnez t0, handle_softirq_64 diff --git a/arch/mips64/kernel/scall_o32.S b/arch/mips64/kernel/scall_o32.S index 935d72848..c529ac04b 100644 --- a/arch/mips64/kernel/scall_o32.S +++ b/arch/mips64/kernel/scall_o32.S @@ -76,8 +76,14 @@ stack_done: 1: sd v0, PT_R2(sp) # result FEXPORT(o32_ret_from_sys_call) - lw t0, irq_stat # softirq_active - lw t1, irq_stat+4 # softirq_mask. unused delay slot + la t1, irq_stat # softirq_active +#ifdef CONFIG_SMP + lwu t0, TASK_PROCESSOR($28) + dsll t0, t0, 5 + daddu t1, t0 +#endif + lw t0, 0(t1) # softirq_active + lw t1, 4(t1) # softirq_mask. unused delay slot and t0, t1 bnez t0, o32_handle_softirq -- cgit v1.2.3