• Nick Piggin's avatar
    [PATCH] sched: improve load balancing pinned tasks · 81026794
    Nick Piggin authored
    John Hawkes explained the problem best:
    
    	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.
    
    Expanding slightly on John's patch, this one attempts to work out whether the
    balancing failure has been due to too many tasks pinned on the runqueue.  This
    allows it to be basically invisible to the regular blancing paths (ie.  when
    there are no pinned tasks).  We can use this extra knowledge to shut down the
    balancing faster, and ensure the migration threads don't start running which
    is another problem observed in the wild.
    Signed-off-by: default avatarNick Piggin <nickpiggin@yahoo.com.au>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    81026794
sched.c 125 KB