memset(wq, 0, sizeof(*wq)); 
struct workqueue_struct *__create_workqueue(const char *name,					    int singlethread){	int cpu, destroy = 0;	struct workqueue_struct *wq;	struct task_struct *p;	wq = kmalloc(sizeof(*wq), GFP_KERNEL);	if (!wq)		return NULL;	memset(wq, 0, sizeof(*wq));	wq->name = name;	/* We don't need the distraction of CPUs appearing and vanishing. */	lock_cpu_hotplug();	if (singlethread) {		INIT_LIST_HEAD(&wq->list);		p = create_workqueue_thread(wq, 0);		if (!p)			destroy = 1;		else			wake_up_process(p);	} else {		spin_lock(&workqueue_lock);		list_add(&wq->list, &workqueues);		spin_unlock(&workqueue_lock);		for_each_online_cpu(cpu) {			p = create_workqueue_thread(wq, cpu);			if (p) {				kthread_bind(p, cpu);				wake_up_process(p);			} else				destroy = 1;		}	}	unlock_cpu_hotplug();	/*	 * Was there any error during startup? If yes then clean up:	 */	if (destroy) {		destroy_workqueue(wq);		wq = NULL;	}	return wq;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/dd3927105b6f65afb7dac17682172cdfb86d3f00/workqueue.c/clean/kernel/workqueue.c