Re: [PATCH 16/43] workqueue: kill cpu_populated_map

From: Oleg Nesterov
Date: Sun Feb 28 2010 - 11:02:09 EST


On 02/26, Tejun Heo wrote:
>
> @@ -1023,41 +991,40 @@ struct workqueue_struct *__create_workqueue_key(const char *name,
> ...
> + cpu_maps_update_done();
> ...
> +
> + spin_lock(&workqueue_lock);
> + list_add(&wq->list, &workqueues);
> + spin_unlock(&workqueue_lock);

OK, but if cpu_up() happens right after we drop cpu_maps_update_done(),
cwq->thread on the new CPU will run unbound?

> @@ -1127,47 +1091,30 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb,
> ...
> list_for_each_entry(wq, &workqueues, list) {

this becomes unsafe. create/destroy can modify workqueues list
in parallel.

> case CPU_ONLINE:
> - start_workqueue_thread(cwq, cpu);
> + __set_cpus_allowed(cwq->thread, get_cpu_mask(cpu),
> + true);

if the thread doesn't have PF_THREAD_BOUND, who will set it?

> case CPU_POST_DEAD:
> - cleanup_workqueue_thread(cwq);
> + lock_map_acquire(&cwq->wq->lockdep_map);
> + lock_map_release(&cwq->wq->lockdep_map);
> + flush_cpu_workqueue(cwq);

This can race with destroy_workqueue(), no?



I guess this patch is preparation, probably these problems should
go away later...

Oleg.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/