Commit r270423 fixed a regression in sched_yield() that was introduced in
earlier changes. Unfortunately, at the same time it introduced an new regression.
The problem is that SWT_RELINQUISH (6), like all other SWT_* constants and unlike
SW_* flags, is not a bit flag. So, flags & SWT_RELINQUISH is true in cases where
that was not really indended, for example, with SWT_OWEPREEMPT (2) and
SWT_REMOTEPREEMPT (11).
A straight forward fix would be to use (flags & SW_TYPE_MASK) == SWT_RELINQUISH,
but my impression is that the switch types are designed mostly for gathering
statistics, not for influencing scheduling decisions.
So, I decided that it would be better to check for SW_PREEMPT flag instead.
That's also the same flag that was checked before r239157.
I double-checked how that flag is sed and I am confident that the flag is set only
in the places where we really have preemption:
- critical_exit + td_owepreempt
- sched_preempt in the ULE scheduler
- sched_preempt in the 4BSD scheduler
This work is sponsored by Panzura.