On Saturday 25 February 2006 06:04, Kazuaki Oda wrote: > Hi, > > When reading kern_switch.c, I noticed odd difference between !SMP and > SMP in maybe_preempt_in_ksegrp(). > > In !SMP case: > ================================================================= > #ifdef PREEMPTION > #ifndef FULL_PREEMPTION > if (td->td_priority > PRI_MAX_ITHD) { > running_thread->td_flags |= TDF_NEEDRESCHED; > return; > } > #endif /* FULL_PREEMPTION */ > ================================================================= > > In SMP case: > ================================================================= > #ifdef PREEMPTION > > #if !defined(FULL_PREEMPTION) > if (td->td_priority > PRI_MAX_ITHD) { > running_thread->td_flags |= TDF_NEEDRESCHED; > } > #endif /* ! FULL_PREEMPTION */ > ================================================================= > > Is there any reason not to return after setting TDF_NEEDRESCHED flag > in SMP case? Because of this, we do context switch even if td's > priority is lower than PRI_MAX_ITHD. And, I think, it is not > PREEMPTION, but FULL_PREEMPTION.
Yes, that is a bug, but it only would affect multithreaded applications I think. Also, the maybe_preempt_in_kseg() stuff doesn't handle idle priority threads correctly in the !FULL_PREEMPTION case (the maybe_preempt() function in !FULL_PREEMPTION always preempts _to_ interrupt threads and always preempts _from_ idle priority threads). -- John Baldwin <[EMAIL PROTECTED]> <>< http://www.FreeBSD.org/~jhb/ "Power Users Use the Power to Serve" = http://www.FreeBSD.org _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "[EMAIL PROTECTED]"