1. Once a second rebalance() is called on cpu0 to adjust priorities,
so cpu-bound processes won't lock others out. However it was only
adjusting processes which were running on cpu0. This was observed
to lead to livelock, eg when a higher-priority process spin-waits
for a lock held by a lower priority one.
2. When mmu mapping for a shared segment is changed, procflushseg
is called to wait for other cpus to change their mapping. The
loop contains a sched() call which could return on a different cpu,
and therefore cause some cpus in the list to be skipped
|