Messages in this thread | | | Date | Fri, 17 Jan 2014 14:44:00 +0100 | From | Daniel Lezcano <> | Subject | Re: [PATCH 2/4] sched: Fix race in idle_balance() |
| |
On 01/17/2014 02:33 PM, Peter Zijlstra wrote: > On Fri, Jan 17, 2014 at 10:04:02AM +0100, Daniel Lezcano wrote: >> The scheduler main function 'schedule()' checks if there are no more tasks >> on the runqueue. Then it checks if a task should be pulled in the current >> runqueue in idle_balance() assuming it will go to idle otherwise. >> >> But the idle_balance() releases the rq->lock in order to lookup in the sched >> domains and takes the lock again right after. That opens a window where >> another cpu may put a task in our runqueue, so we won't go to idle but >> we have filled the idle_stamp, thinking we will. >> >> This patch closes the window by checking if the runqueue has been modified >> but without pulling a task after taking the lock again, so we won't go to idle >> right after in the __schedule() function. > > Did you actually observe this or was it found by reading the code?
When I tried to achieve what is doing the patch 4/4, I was falling in the BUG() (comment in patch 4/4). So I did some tests and checked that we enter idle_balance() with nr_running == 0 but we exit with nr_running > 0 and pulled_task == 0.
-- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog
-- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |