Index: kern/kern_task.c =================================================================== RCS file: /cvs/src/sys/kern/kern_task.c,v retrieving revision 1.30 diff -u -p -r1.30 kern_task.c --- kern/kern_task.c 11 Jun 2020 06:06:55 -0000 1.30 +++ kern/kern_task.c 11 Jun 2020 12:52:20 -0000 @@ -288,7 +288,7 @@ taskq_do_barrier(struct taskq *tq) while (tq->tq_bthreads < tq->tq_nthreads) { /* shove the task into the queue for a worker to pick up */ SET(t.t_flags, TASK_ONQUEUE); - TAILQ_INSERT_TAIL(&tq->tq_worklist, &t, t_entry); + TAILQ_INSERT_HEAD(&tq->tq_worklist, &t, t_entry); wakeup_one(tq); msleep_nsec(&tq->tq_bthreads, &tq->tq_mtx, Index: dev/pci/drm/drm_linux.c =================================================================== RCS file: /cvs/src/sys/dev/pci/drm/drm_linux.c,v retrieving revision 1.59 diff -u -p -r1.59 drm_linux.c --- dev/pci/drm/drm_linux.c 8 Jun 2020 04:47:58 -0000 1.59 +++ dev/pci/drm/drm_linux.c 11 Jun 2020 12:52:20 -0000 @@ -147,13 +147,32 @@ wake_up_process(struct proc *p) return wakeup_proc(p, NULL); } +struct flush_workqueue_state { + struct taskq *tq; + struct cond cv; +}; + +static void +flush_workqueue_task(void *p) +{ + struct flush_workqueue_state *s = p; + + taskq_barrier(s->tq); + cond_signal(&s->cv); +} + void flush_workqueue(struct workqueue_struct *wq) { + struct taskq *tq = (struct taskq *)wq; + struct flush_workqueue_state s = { tq, COND_INITIALIZER() }; + struct task t = TASK_INITIALIZER(flush_workqueue_task, &s); + if (cold) return; - taskq_barrier((struct taskq *)wq); + task_add(tq, &t); + cond_wait(&s.cv, "flushwq"); } bool