use taskq_del_barrier() instead of taskq_barrier() when flushing work
authorjsg <jsg@openbsd.org>
Sat, 7 Aug 2021 06:23:34 +0000 (06:23 +0000)
committerjsg <jsg@openbsd.org>
Sat, 7 Aug 2021 06:23:34 +0000 (06:23 +0000)
commit2bb569e6635011dfd3c529013e7697994a48b787
treee72705a1cacfa81992615a2b24e18e1ac1499c8f
parent890267c38467536339d2a8e108a0aa0e83e8bdcc
use taskq_del_barrier() instead of taskq_barrier() when flushing work

prompted by jcs@ reporting a protection fault trap in
drm_mode_rmfb_work_fn() while playing a youtube video in firefox on a
kaby lake machine.  He later saw the same trace on tiger lake.

The arguments to drm_mode_rmfb_work_fn() are on the stack in
drm_mode_rmfb() with flush_work() called before return.

taskq_barrier() is only a barrier for running not queued tasks.

I suspect the linux functions expect any previously queued work to
complete not just any currently running work.  I'm not sure if the
difference matters in practice.
sys/dev/pci/drm/drm_linux.c
sys/dev/pci/drm/include/linux/irq_work.h