|
@@ -1213,8 +1213,13 @@ static void worker_enter_idle(struct worker *worker)
|
|
|
} else
|
|
|
wake_up_all(&gcwq->trustee_wait);
|
|
|
|
|
|
- /* sanity check nr_running */
|
|
|
- WARN_ON_ONCE(gcwq->nr_workers == gcwq->nr_idle &&
|
|
|
+ /*
|
|
|
+ * Sanity check nr_running. Because trustee releases gcwq->lock
|
|
|
+ * between setting %WORKER_ROGUE and zapping nr_running, the
|
|
|
+ * warning may trigger spuriously. Check iff trustee is idle.
|
|
|
+ */
|
|
|
+ WARN_ON_ONCE(gcwq->trustee_state == TRUSTEE_DONE &&
|
|
|
+ gcwq->nr_workers == gcwq->nr_idle &&
|
|
|
atomic_read(get_gcwq_nr_running(gcwq->cpu)));
|
|
|
}
|
|
|
|