Messages in this thread | | | Date | Wed, 29 Aug 2012 10:21:47 +0800 | From | Lai Jiangshan <> | Subject | Re: [PATCH 4/7] workqueue: single pass rebind_workers |
| |
On 08/28/2012 03:04 AM, Tejun Heo wrote: > Hello, Lai. > > On Tue, Aug 28, 2012 at 01:58:24AM +0800, Lai Jiangshan wrote: >> busy_worker_rebind_fn() can't return until all idle workers are rebound, >> the code of busy_worker_rebind_fn() ensure this. >> >> So we can change the order of the code of rebind_workers(), >> and make it a single pass do the rebind_workers(). >> >> It makes the code much clean and better readability. > > I can't see how this could be correct.
Could you elaborate more why it is not correct.
> What prevents busy worker from > grabbing manager_mutex before idle one? >
busy worker still has WORKER_REBIND when it enter busy_worker_rebind_fn(), so it can sleep(include grab the manager_mutex). When this mutex_lock() returns, it means rebind_workers() are done which means all idle are rebound and can be locally woken up. So busy worker can return from busy_worker_rebind_fn() and handle other possible-sleeping items.
If the CPU is offline again, the busy worker has WORKER_UNBOUND, it is also correct when it returns from busy_worker_rebind_fn().
| |