8475 lines · 239.9 KB · C
RawDownload
	schedule();	goto woke_up;} static bool assign_rescuer_work(struct pool_workqueue *pwq, struct worker *rescuer){	struct worker_pool *pool = pwq->pool;	struct work_struct *cursor = &pwq->mayday_cursor;	struct work_struct *work, *n; 	/* have work items to rescue? */	if (!pwq->nr_active)		return false; 	/* need rescue? */	if (!need_to_create_worker(pool)) {		/*		 * The pool has idle workers and doesn't need the rescuer, so it		 * could simply return false here.		 *		 * However, the memory pressure might not be fully relieved.		 * In PERCPU pool with concurrency enabled, having idle workers		 * does not necessarily mean memory pressure is gone; it may		 * simply mean regular workers have woken up, completed their		 * work, and gone idle again due to concurrency limits.		 *		 * In this case, those working workers may later sleep again,		 * the pool may run out of idle workers, and it will have to		 * allocate new ones and wait for the timer to send mayday,		 * causing unnecessary delay - especially if memory pressure		 * was never resolved throughout.		 *		 * Do more work if memory pressure is still on to reduce		 * relapse, using (pool->flags & POOL_MANAGER_ACTIVE), though		 * not precisely, unless there are other PWQs needing help.		 */		if (!(pool->flags & POOL_MANAGER_ACTIVE) ||		    !list_empty(&pwq->wq->maydays))			return false;	} 	/* search from the start or cursor if available */	if (list_empty(&cursor->entry))		work = list_first_entry(&pool->worklist, struct work_struct, entry);	else		work = list_next_entry(cursor, entry); 	/* find the next work item to rescue */	list_for_each_entry_safe_from(work, n, &pool->worklist, entry) {		if (get_work_pwq(work) == pwq && assign_work(work, rescuer, &n)) {			pwq->stats[PWQ_STAT_RESCUED]++;			/* put the cursor for next search */			list_move_tail(&cursor->entry, &n->entry);			return true;		}	} 	return false;} /** * rescuer_thread - the rescuer thread function * @__rescuer: self * * Workqueue rescuer thread function.  There's one rescuer for each * workqueue which has WQ_MEM_RECLAIM set. * * Regular work processing on a pool may block trying to create a new * worker which uses GFP_KERNEL allocation which has slight chance of * developing into deadlock if some works currently on the same queue * need to be processed to satisfy the GFP_KERNEL allocation.  This is * the problem rescuer solves. * * When such condition is possible, the pool summons rescuers of all * workqueues which have works queued on the pool and let them process * those works so that forward progress can be guaranteed. * * This should happen rarely. * * Return: 0 */static int rescuer_thread(void *__rescuer){	struct worker *rescuer = __rescuer;	struct workqueue_struct *wq = rescuer->rescue_wq;	bool should_stop; 	set_user_nice(current, RESCUER_NICE_LEVEL); 	/*	 * Mark rescuer as worker too.  As WORKER_PREP is never cleared, it	 * doesn't participate in concurrency management.	 */	set_pf_worker(true);repeat:	set_current_state(TASK_IDLE); 	/*	 * By the time the rescuer is requested to stop, the workqueue	 * shouldn't have any work pending, but @wq->maydays may still have	 * pwq(s) queued.  This can happen by non-rescuer workers consuming	 * all the work items before the rescuer got to them.  Go through	 * @wq->maydays processing before acting on should_stop so that the	 * list is always empty on exit.	 */	should_stop = kthread_should_stop(); 	/* see whether any pwq is asking for help */	raw_spin_lock_irq(&wq_mayday_lock); 	while (!list_empty(&wq->maydays)) {		struct pool_workqueue *pwq = list_first_entry(&wq->maydays,					struct pool_workqueue, mayday_node);		struct worker_pool *pool = pwq->pool;		unsigned int count = 0; 		__set_current_state(TASK_RUNNING);		list_del_init(&pwq->mayday_node); 		raw_spin_unlock_irq(&wq_mayday_lock); 		worker_attach_to_pool(rescuer, pool); 		raw_spin_lock_irq(&pool->lock); 		WARN_ON_ONCE(!list_empty(&rescuer->scheduled)); 		while (assign_rescuer_work(pwq, rescuer)) {			process_scheduled_works(rescuer); 			/*			 * If the per-turn work item limit is reached and other			 * PWQs are in mayday, requeue mayday for this PWQ and			 * let the rescuer handle the other PWQs first.			 */			if (++count > RESCUER_BATCH && !list_empty(&pwq->wq->maydays) &&			    pwq->nr_active && need_to_create_worker(pool)) {				raw_spin_lock(&wq_mayday_lock);				send_mayday(pwq);				raw_spin_unlock(&wq_mayday_lock);				break;			}		} 		/* The cursor can not be left behind without the rescuer watching it. */		if (!list_empty(&pwq->mayday_cursor.entry) && list_empty(&pwq->mayday_node))			list_del_init(&pwq->mayday_cursor.entry); 		/*		 * Leave this pool. Notify regular workers; otherwise, we end up		 * with 0 concurrency and stalling the execution.		 */		kick_pool(pool); 		raw_spin_unlock_irq(&pool->lock); 		worker_detach_from_pool(rescuer); 		/*		 * Put the reference grabbed by send_mayday().  @pool might		 * go away any time after it.		 */		put_pwq_unlocked(pwq); 		raw_spin_lock_irq(&wq_mayday_lock);	} 	raw_spin_unlock_irq(&wq_mayday_lock); 	if (should_stop) {		__set_current_state(TASK_RUNNING);		set_pf_worker(false);		return 0;	} 	/* rescuers should never participate in concurrency management */	WARN_ON_ONCE(!(rescuer->flags & WORKER_NOT_RUNNING));	schedule();	goto repeat;} static void bh_worker(struct worker *worker){	struct worker_pool *pool = worker->pool;	int nr_restarts = BH_WORKER_RESTARTS;	unsigned long end = jiffies + BH_WORKER_JIFFIES; 	worker_lock_callback(pool);	raw_spin_lock_irq(&pool->lock);	worker_leave_idle(worker); 	/*	 * This function follows the structure of worker_thread(). See there for	 * explanations on each step.	 */	if (!need_more_worker(pool))		goto done; 	WARN_ON_ONCE(!list_empty(&worker->scheduled));	worker_clr_flags(worker, WORKER_PREP | WORKER_REBOUND); 	do {		struct work_struct *work =			list_first_entry(&pool->worklist,					 struct work_struct, entry); 		if (assign_work(work, worker, NULL))			process_scheduled_works(worker);	} while (keep_working(pool) &&		 --nr_restarts && time_before(jiffies, end)); 	worker_set_flags(worker, WORKER_PREP);done:	worker_enter_idle(worker);	kick_pool(pool);	raw_spin_unlock_irq(&pool->lock);	worker_unlock_callback(pool);} /* * TODO: Convert all tasklet users to workqueue and use softirq directly. * * This is currently called from tasklet[_hi]action() and thus is also called * whenever there are tasklets to run. Let's do an early exit if there's nothing * queued. Once conversion from tasklet is complete, the need_more_worker() test * can be dropped. * * After full conversion, we'll add worker->softirq_action, directly use the * softirq action and obtain the worker pointer from the softirq_action pointer. */void workqueue_softirq_action(bool highpri){	struct worker_pool *pool =		&per_cpu(bh_worker_pools, smp_processor_id())[highpri];	if (need_more_worker(pool))		bh_worker(list_first_entry(&pool->workers, struct worker, node));} struct wq_drain_dead_softirq_work {	struct work_struct	work;	struct worker_pool	*pool;	struct completion	done;}; static void drain_dead_softirq_workfn(struct work_struct *work){	struct wq_drain_dead_softirq_work *dead_work =		container_of(work, struct wq_drain_dead_softirq_work, work);	struct worker_pool *pool = dead_work->pool;	bool repeat; 	/*	 * @pool's CPU is dead and we want to execute its still pending work	 * items from this BH work item which is running on a different CPU. As	 * its CPU is dead, @pool can't be kicked and, as work execution path	 * will be nested, a lockdep annotation needs to be suppressed. Mark	 * @pool with %POOL_BH_DRAINING for the special treatments.	 */	raw_spin_lock_irq(&pool->lock);	pool->flags |= POOL_BH_DRAINING;	raw_spin_unlock_irq(&pool->lock); 	bh_worker(list_first_entry(&pool->workers, struct worker, node)); 	raw_spin_lock_irq(&pool->lock);	pool->flags &= ~POOL_BH_DRAINING;	repeat = need_more_worker(pool);	raw_spin_unlock_irq(&pool->lock); 	/*	 * bh_worker() might hit consecutive execution limit and bail. If there	 * still are pending work items, reschedule self and return so that we	 * don't hog this CPU's BH.	 */	if (repeat) {		if (pool->attrs->nice == HIGHPRI_NICE_LEVEL)			queue_work(system_bh_highpri_wq, work);		else			queue_work(system_bh_wq, work);	} else {		complete(&dead_work->done);	}} /* * @cpu is dead. Drain the remaining BH work items on the current CPU. It's * possible to allocate dead_work per CPU and avoid flushing. However, then we * have to worry about draining overlapping with CPU coming back online or * nesting (one CPU's dead_work queued on another CPU which is also dead and so * on). Let's keep it simple and drain them synchronously. These are BH work * items which shouldn't be requeued on the same pool. Shouldn't take long. */void workqueue_softirq_dead(unsigned int cpu){	int i; 	for (i = 0; i < NR_STD_WORKER_POOLS; i++) {		struct worker_pool *pool = &per_cpu(bh_worker_pools, cpu)[i];		struct wq_drain_dead_softirq_work dead_work; 		if (!need_more_worker(pool))			continue; 		INIT_WORK_ONSTACK(&dead_work.work, drain_dead_softirq_workfn);		dead_work.pool = pool;		init_completion(&dead_work.done); 		if (pool->attrs->nice == HIGHPRI_NICE_LEVEL)			queue_work(system_bh_highpri_wq, &dead_work.work);		else			queue_work(system_bh_wq, &dead_work.work); 		wait_for_completion(&dead_work.done);		destroy_work_on_stack(&dead_work.work);	}} /** * check_flush_dependency - check for flush dependency sanity * @target_wq: workqueue being flushed * @target_work: work item being flushed (NULL for workqueue flushes) * @from_cancel: are we called from the work cancel path * * %current is trying to flush the whole @target_wq or @target_work on it. * If this is not the cancel path (which implies work being flushed is either * already running, or will not be at all), check if @target_wq doesn't have * %WQ_MEM_RECLAIM and verify that %current is not reclaiming memory or running * on a workqueue which doesn't have %WQ_MEM_RECLAIM as that can break forward- * progress guarantee leading to a deadlock. */static void check_flush_dependency(struct workqueue_struct *target_wq,				   struct work_struct *target_work,				   bool from_cancel){	work_func_t target_func;	struct worker *worker; 	if (from_cancel || target_wq->flags & WQ_MEM_RECLAIM)		return; 	worker = current_wq_worker();	target_func = target_work ? target_work->func : NULL; 	WARN_ONCE(current->flags & PF_MEMALLOC,		  "workqueue: PF_MEMALLOC task %d(%s) is flushing !WQ_MEM_RECLAIM %s:%ps",		  current->pid, current->comm, target_wq->name, target_func);	WARN_ONCE(worker && ((worker->current_pwq->wq->flags &			      (WQ_MEM_RECLAIM | __WQ_LEGACY)) == WQ_MEM_RECLAIM),		  "workqueue: WQ_MEM_RECLAIM %s:%ps is flushing !WQ_MEM_RECLAIM %s:%ps",		  worker->current_pwq->wq->name, worker->current_func,		  target_wq->name, target_func);} struct wq_barrier {	struct work_struct	work;	struct completion	done;	struct task_struct	*task;	/* purely informational */}; static void wq_barrier_func(struct work_struct *work){	struct wq_barrier *barr = container_of(work, struct wq_barrier, work);	complete(&barr->done);} /** * insert_wq_barrier - insert a barrier work * @pwq: pwq to insert barrier into * @barr: wq_barrier to insert * @target: target work to attach @barr to * @worker: worker currently executing @target, NULL if @target is not executing * * @barr is linked to @target such that @barr is completed only after * @target finishes execution.  Please note that the ordering * guarantee is observed only with respect to @target and on the local * cpu. * * Currently, a queued barrier can't be canceled.  This is because * try_to_grab_pending() can't determine whether the work to be * grabbed is at the head of the queue and thus can't clear LINKED * flag of the previous work while there must be a valid next work * after a work with LINKED flag set. * * Note that when @worker is non-NULL, @target may be modified * underneath us, so we can't reliably determine pwq from @target. * * CONTEXT: * raw_spin_lock_irq(pool->lock). */static void insert_wq_barrier(struct pool_workqueue *pwq,			      struct wq_barrier *barr,			      struct work_struct *target, struct worker *worker){	static __maybe_unused struct lock_class_key bh_key, thr_key;	unsigned int work_flags = 0;	unsigned int work_color;	struct list_head *head; 	/*	 * debugobject calls are safe here even with pool->lock locked	 * as we know for sure that this will not trigger any of the	 * checks and call back into the fixup functions where we	 * might deadlock.	 *	 * BH and threaded workqueues need separate lockdep keys to avoid	 * spuriously triggering "inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W}	 * usage".	 */	INIT_WORK_ONSTACK_KEY(&barr->work, wq_barrier_func,			      (pwq->wq->flags & WQ_BH) ? &bh_key : &thr_key);	__set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(&barr->work)); 	init_completion_map(&barr->done, &target->lockdep_map); 	barr->task = current; 	/* The barrier work item does not participate in nr_active. */	work_flags |= WORK_STRUCT_INACTIVE; 	/*	 * If @target is currently being executed, schedule the	 * barrier to the worker; otherwise, put it after @target.	 */	if (worker) {		head = worker->scheduled.next;		work_color = worker->current_color;	} else {		unsigned long *bits = work_data_bits(target); 		head = target->entry.next;		/* there can already be other linked works, inherit and set */		work_flags |= *bits & WORK_STRUCT_LINKED;		work_color = get_work_color(*bits);		__set_bit(WORK_STRUCT_LINKED_BIT, bits);	} 	pwq->nr_in_flight[work_color]++;	work_flags |= work_color_to_flags(work_color); 	insert_work(pwq, &barr->work, head, work_flags);} /** * flush_workqueue_prep_pwqs - prepare pwqs for workqueue flushing * @wq: workqueue being flushed * @flush_color: new flush color, < 0 for no-op * @work_color: new work color, < 0 for no-op * * Prepare pwqs for workqueue flushing. * * If @flush_color is non-negative, flush_color on all pwqs should be * -1.  If no pwq has in-flight commands at the specified color, all * pwq->flush_color's stay at -1 and %false is returned.  If any pwq * has in flight commands, its pwq->flush_color is set to * @flush_color, @wq->nr_pwqs_to_flush is updated accordingly, pwq * wakeup logic is armed and %true is returned. * * The caller should have initialized @wq->first_flusher prior to * calling this function with non-negative @flush_color.  If * @flush_color is negative, no flush color update is done and %false * is returned. * * If @work_color is non-negative, all pwqs should have the same * work_color which is previous to @work_color and all will be * advanced to @work_color. * * CONTEXT: * mutex_lock(wq->mutex). * * Return: * %true if @flush_color >= 0 and there's something to flush.  %false * otherwise. */static bool flush_workqueue_prep_pwqs(struct workqueue_struct *wq,				      int flush_color, int work_color){	bool wait = false;	struct pool_workqueue *pwq;	struct worker_pool *current_pool = NULL; 	if (flush_color >= 0) {		WARN_ON_ONCE(atomic_read(&wq->nr_pwqs_to_flush));		atomic_set(&wq->nr_pwqs_to_flush, 1);	} 	/*	 * For unbound workqueue, pwqs will map to only a few pools.	 * Most of the time, pwqs within the same pool will be linked	 * sequentially to wq->pwqs by cpu index. So in the majority	 * of pwq iters, the pool is the same, only doing lock/unlock	 * if the pool has changed. This can largely reduce expensive	 * lock operations.	 */	for_each_pwq(pwq, wq) {		if (current_pool != pwq->pool) {			if (likely(current_pool))				raw_spin_unlock_irq(&current_pool->lock);			current_pool = pwq->pool;			raw_spin_lock_irq(&current_pool->lock);		}

Lines 3501–4000 of 8475. Previous lines