diff --git a/sys/dev/drm/include/linux/workqueue.h b/sys/dev/drm/include/linux/workqueue.h --- a/sys/dev/drm/include/linux/workqueue.h +++ b/sys/dev/drm/include/linux/workqueue.h @@ -66,6 +66,7 @@ struct delayed_work { struct work_struct work; struct callout timer; + struct workqueue_struct *wq; /* owning wq, for callout callback */ }; static inline struct delayed_work * --- a/sys/dev/drm/linux_workqueue.c +++ b/sys/dev/drm/linux_workqueue.c @@ -153,7 +153,7 @@ { struct delayed_work *dw = arg; - queue_work(system_wq, &dw->work); + queue_work(dw->wq ? dw->wq : system_wq, &dw->work); } int @@ -161,6 +161,7 @@ unsigned long delay) { int pending = work->work.on_queue; // XXX: running too ? + work->wq = wq; if (delay != 0) { callout_reset(&work->timer, delay, _delayed_work_fn, work); } else {