Messages in this thread | | | Date | Tue, 29 Jul 2008 17:44:57 +0400 | From | Oleg Nesterov <> | Subject | Re: [patch, minor] workqueue: consistently use 'err' in __create_workqueue_key() |
| |
On 07/29, Oleg Nesterov wrote: > > On 07/29, Dmitry Adamushko wrote: > > > > And I'd say this behavior (of having a partially-created object > > visible to the outside world) is not that robust. e.g. the > > aforementioned race would be eliminated if we place a wq on the global > > list only when it's been successfully initialized. > > Yes, we can change __create_workqueue_key() to check err == 0 before > list_add(),
Well no, we can't do even this.
Then we have another race with cpu-hotplug. Suppose we have CPUs 0, 1, 2. create_workqueue() fails to create cwq->thread for CPU 2 and calls destroy_workqueue(). Before it takes the cpu_add_remove_lock, _cpu_down() removes CPU 1 from cpu_populated_map, but since we didn't add this wq on the global list, cwq[1]->thread remains alive.
destroy_workqueue() takes cpu_add_remove_lock, and calls cleanup_workqueue_thread() for CPUs 0 and 2. cwq[1]->thread is lost.
Damn. I had this in mind when I wrote the code, but forgot. We need comments, I'll send the patch.
Oleg.
| |