On some CPUs, there is a small window in the idle task which might
cause a large latency to wakeup a process.
http://www.linux-mips.org/archives/linux-mips/2005-11/msg00114.html
This can be avoided on some CPUs which can use xxx_wait_irqoff(), but
still there are many CPUs out of luck.
And now we have dyntick/tickless kernel. On tickless kernel the
problem might become more serious. We cannot know the worst latency
time. Theoretically a task can lose wakeup-event forever.
Of course "nowait" kernel option will help, but are there any other
good solutions?
Just an idea: If we put an WAIT in hazard area of the MTC0 which
enables interrupts, can we accomplish something like
atomic-test-and-wait operation?
void r4k_wait_bulletproof(void)
{
local_irq_disable();
if (!need_resched())
__asm__(
" .set push \n"
" .set mips3 \n"
" .set noat \n"
" .align 4 \n" /* avoid stall on wait */
" mfc0 $1, $12 \n"
" ori $1, 1 \n"
" mtc0 $1, $12 \n"
" wait \n"
" xori $1, 1 \n"
" mtc0 $1, $12 \n"
" .set pop \n");
local_irq_enable();
}
If this work as expected? Comments from pipeline gurus are welcome ;)
---
Atsushi Nemoto
|