summaryrefslogtreecommitdiff
path: root/arch/s390/kernel/entry64.S
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2007-11-20 11:13:35 +0100
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2007-11-20 11:13:46 +0100
commitb8e7a54cd06b0b0174029ef3a7f5a1415a2c28f2 (patch)
treee42beedde089c3aabe9df1537ad687f2756a69ac /arch/s390/kernel/entry64.S
parent37e3a6ac5a30468021a2f366e497d455bbcb5d21 (diff)
downloadlinux-next-b8e7a54cd06b0b0174029ef3a7f5a1415a2c28f2.tar.gz
[S390] Fix kernel preemption.
When returning from IRQ handling and TIF_NEED_RESCHED is set we must call preempt_schedule_irq() instead of schedule(). Otherwise the BKL might be unlocked in schedule() and therfore everything that relies on the BKL is broken. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/entry64.S')
-rw-r--r--arch/s390/kernel/entry64.S12
1 files changed, 2 insertions, 10 deletions
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S
index e15c80efdd05..a3e47b893f07 100644
--- a/arch/s390/kernel/entry64.S
+++ b/arch/s390/kernel/entry64.S
@@ -623,15 +623,8 @@ io_preempt:
io_resume_loop:
tm __TI_flags+7(%r9),_TIF_NEED_RESCHED
jno io_restore
- larl %r1,.Lc_pactive
- mvc __TI_precount(4,%r9),0(%r1)
- TRACE_IRQS_ON
- stosm __SF_EMPTY(%r15),0x03 # reenable interrupts
- brasl %r14,schedule # call schedule
- stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts
- TRACE_IRQS_OFF
- xc __TI_precount(4,%r9),__TI_precount(%r9)
- j io_resume_loop
+ larl %r14,io_resume_loop
+ jg preempt_schedule_irq
#endif
#
@@ -1029,7 +1022,6 @@ cleanup_io_leave_insn:
*/
.align 4
.Lconst:
-.Lc_pactive: .long PREEMPT_ACTIVE
.Lnr_syscalls: .long NR_syscalls
.L0x0130: .short 0x130
.L0x0140: .short 0x140