summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2001-06-10 16:17:47 +0000
committerRalf Baechle <ralf@linux-mips.org>2001-06-10 16:17:47 +0000
commit4c2d47edfd6114ce818a93c97a5f34ca38c6c5f3 (patch)
tree582925a7fcd23fb71927e4d9f0b9d0c9182572f0 /arch
parent764fb51bab6c4f71a6708a275d246d260cc7fa05 (diff)
We were not always calling handle_softirq resulting in softirqs
potencially delayed. 32-bit kernel got it wrong for the SMP case.
Diffstat (limited to 'arch')
-rw-r--r--arch/mips/kernel/entry.S11
-rw-r--r--arch/mips/kernel/scall_o32.S10
-rw-r--r--arch/mips64/kernel/scall_64.S10
-rw-r--r--arch/mips64/kernel/scall_o32.S10
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