DragonFlyBSD Kernel Audit
DF-1978 / fix.diff
← back to finding ↓ download raw
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 {