John Hawkes wrote: > A large number of processes that are pinned to a single CPU results in > every other CPU's load_balance() seeing this overloaded CPU as "busiest", > yet move_tasks() never finds a task to pull-migrate. This condition > occurs during module unload, but can also occur as a denial-of-service > using sys_sched_setaffinity(). Several hundred CPUs performing this > fruitless load_balance() will livelock on the busiest CPU's runqueue > lock. A smaller number of CPUs will livelock if the pinned task count > gets high. This simple patch remedies the more common first problem: > after a move_tasks() failure to migrate anything, the balance_interval > increments. Using a simple increment, vs. the more dramatic doubling of > the balance_interval, is conservative and yet also effective. > > John Hawkes > John and I also discussed a slightly more sophisticated algorithm for this that would try to be a bit smarter about the reason for balance failures (described in the changelog). John, this works quite well here, would you have any objections using it instead? Does it cure your problems there?