X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=kernel%2Fworkqueue.c;h=9a3128dc67df450d201969bb5fa9a99773d99c1b;hb=66340e5b259bd7ca67cf0ca079dd3997fa198d4b;hp=211eadb23323b80cff3a9e094b5bc238b09ca06f;hpb=0976dfc1d0cd80a4e9dfaf87bd8744612bde475a;p=~andy%2Flinux diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 211eadb2332..9a3128dc67d 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -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))); } @@ -1813,7 +1818,9 @@ __acquires(&gcwq->lock) * lock freed" warnings as well as problems when looking into * work->lockdep_map, make a copy and use that here. */ - struct lockdep_map lockdep_map = work->lockdep_map; + struct lockdep_map lockdep_map; + + lockdep_copy_map(&lockdep_map, &work->lockdep_map); #endif /* * A single work shouldn't be executed concurrently by