diff options
Diffstat (limited to 'kernel/workqueue.c')
| -rw-r--r-- | kernel/workqueue.c | 41 | 
1 files changed, 11 insertions, 30 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 3003ecad08f..b6b966ce145 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -49,8 +49,6 @@ struct cpu_workqueue_struct {  	struct workqueue_struct *wq;  	struct task_struct *thread; - -	int run_depth;		/* Detect run_workqueue() recursion depth */  } ____cacheline_aligned;  /* @@ -269,13 +267,6 @@ DEFINE_TRACE(workqueue_execution);  static void run_workqueue(struct cpu_workqueue_struct *cwq)  {  	spin_lock_irq(&cwq->lock); -	cwq->run_depth++; -	if (cwq->run_depth > 3) { -		/* morton gets to eat his hat */ -		printk("%s: recursion depth exceeded: %d\n", -			__func__, cwq->run_depth); -		dump_stack(); -	}  	while (!list_empty(&cwq->worklist)) {  		struct work_struct *work = list_entry(cwq->worklist.next,  						struct work_struct, entry); @@ -318,7 +309,6 @@ static void run_workqueue(struct cpu_workqueue_struct *cwq)  		spin_lock_irq(&cwq->lock);  		cwq->current_work = NULL;  	} -	cwq->run_depth--;  	spin_unlock_irq(&cwq->lock);  } @@ -375,29 +365,20 @@ static void insert_wq_barrier(struct cpu_workqueue_struct *cwq,  static int flush_cpu_workqueue(struct cpu_workqueue_struct *cwq)  { -	int active; +	int active = 0; +	struct wq_barrier barr; -	if (cwq->thread == current) { -		/* -		 * Probably keventd trying to flush its own queue. So simply run -		 * it by hand rather than deadlocking. -		 */ -		run_workqueue(cwq); -		active = 1; -	} else { -		struct wq_barrier barr; +	WARN_ON(cwq->thread == current); -		active = 0; -		spin_lock_irq(&cwq->lock); -		if (!list_empty(&cwq->worklist) || cwq->current_work != NULL) { -			insert_wq_barrier(cwq, &barr, &cwq->worklist); -			active = 1; -		} -		spin_unlock_irq(&cwq->lock); - -		if (active) -			wait_for_completion(&barr.done); +	spin_lock_irq(&cwq->lock); +	if (!list_empty(&cwq->worklist) || cwq->current_work != NULL) { +		insert_wq_barrier(cwq, &barr, &cwq->worklist); +		active = 1;  	} +	spin_unlock_irq(&cwq->lock); + +	if (active) +		wait_for_completion(&barr.done);  	return active;  }  |