change irq work from interrupt context back to process context like
authorjsg <jsg@openbsd.org>
Mon, 17 Jan 2022 12:42:30 +0000 (12:42 +0000)
committerjsg <jsg@openbsd.org>
Mon, 17 Jan 2022 12:42:30 +0000 (12:42 +0000)
our 5.10 drm used (via a task) by changing from timeout_set() to
timeout_set_proc()

irq work is supposed to be in interrupt context but some path used on
inteldrm with gen 9 graphics sleeps.

Reported by Agnosto Dvonik on kaby lake and jcs@ and aja@ on comet lake.
For Agnosto Dvonik this occured when running firefox or mpv, for jcs@
when playing a video in firefox, for aja@ after 5 min of running gnome.
aja@ has run gnome for many hours with this change without problem.

sys/dev/pci/drm/include/linux/irq_work.h

index 3b8fd73..5360ad9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: irq_work.h,v 1.6 2022/01/14 06:53:14 jsg Exp $        */
+/*     $OpenBSD: irq_work.h,v 1.7 2022/01/17 12:42:30 jsg Exp $        */
 /*
  * Copyright (c) 2015 Mark Kettenis
  *
@@ -32,7 +32,8 @@ typedef void (*irq_work_func_t)(struct irq_work *);
 static inline void
 init_irq_work(struct irq_work *work, irq_work_func_t func)
 {
-       timeout_set(&work->to, (void (*)(void *))func, work);
+       /* process context as intel gen 9 sleeps in irq work */
+       timeout_set_proc(&work->to, (void (*)(void *))func, work);
 }
 
 static inline bool