* [Linux-ia64] fix for 2.4.7 UP hang
@ 2001-07-26 7:06 David Mosberger
0 siblings, 0 replies; only message in thread
From: David Mosberger @ 2001-07-26 7:06 UTC (permalink / raw)
To: linux-ia64
The attached patch fixes the bug that causes 2.4.7 to hang on UP
systems. It turns out that this is a very old bug (since 2.3.11!)
that happens to get triggered reliably in 2.4.7 on UP machines. The
problem is that in the UP case, we failed to call schedule_tail()
after a fork/clone. This had the effect that if a task yielded the
CPU and the next task to be execute was a newly forked/cloned task,
then the yielding task would never get scheduled again. In other
words, on a UP system it would have been possible for some tasks to
get "stuck", even though they were marked runnable. Can't say I have
seen this in practice, but I'm not using UP machines very often
anymore.
--david
--- lia64-kdb/arch/ia64/kernel/entry.S~ Sat Jul 21 20:20:10 2001
+++ lia64-kdb/arch/ia64/kernel/entry.S Wed Jul 25 23:49:38 2001
@@ -492,15 +492,13 @@
GLOBAL_ENTRY(ia64_ret_from_clone)
PT_REGS_UNWIND_INFO(0)
-#ifdef CONFIG_SMP
/*
- * In SMP mode, we need to call invoke_schedule_tail to complete the scheduling process.
+ * We need to call schedule_tail() to complete the scheduling process.
* Called by ia64_switch_to after do_fork()->copy_thread(). r8 contains the
* address of the previously executing task.
*/
br.call.sptk.few rp=invoke_schedule_tail
.ret8:
-#endif
adds r2=IA64_TASK_PTRACE_OFFSET,r13
;;
ld8 r2=[r2]
@@ -554,7 +552,7 @@
#ifdef CONFIG_PERFMON
(p9) br.call.spnt.many b7=pfm_overflow_notify
#endif
-# if __GNUC__ < 3
+#if __GNUC__ < 3
(p7) br.call.spnt.many b7=invoke_schedule
#else
(p7) br.call.spnt.many b7=schedule
@@ -766,7 +764,6 @@
br.cond.sptk.many ia64_leave_kernel
END(handle_syscall_error)
-# ifdef CONFIG_SMP
/*
* Invoke schedule_tail(task) while preserving in0-in7, which may be needed
* in case a system call gets restarted.
@@ -783,7 +780,7 @@
br.ret.sptk.many rp
END(invoke_schedule_tail)
-# endif /* CONFIG_SMP */
+#if __GNUC__ < 3
/*
* Invoke schedule() while preserving in0-in7, which may be needed
@@ -805,6 +802,8 @@
mov rp=loc0
br.ret.sptk.many rp
END(invoke_schedule)
+
+#endif /* __GNUC__ < 3 */
/*
* Setup stack and call ia64_do_signal. Note that pSys and pNonSys need to
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2001-07-26 7:06 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2001-07-26 7:06 [Linux-ia64] fix for 2.4.7 UP hang David Mosberger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox