Do not let the iwx init task run in parallel to wakeup code during resume.
authorstsp <stsp@openbsd.org>
Sun, 19 Feb 2023 12:23:27 +0000 (12:23 +0000)
committerstsp <stsp@openbsd.org>
Sun, 19 Feb 2023 12:23:27 +0000 (12:23 +0000)
commita6809b13b2a4451f1701e009ce7f541601477ae6
tree21e28449780a59f7fed1aa2f61202f039aa36efe
parenta94014fa4850eb28d648ace9514fcdbb4208e4de
Do not let the iwx init task run in parallel to wakeup code during resume.

The driver will resume in the ACPI thread and run code to wake the device.
If a firmware error occurs then the init task will be scheduled and could
then run in parallel to the wakeup code. This would lead to panics as the
init task ran while we were not yet done with device initialization.

To prevent this problem we now grab the rwlock during wakeup, the same
lock which is used to prevent races between the init task and ioctls.
Problem found by mvs@, who also suggested the fix implemented here and
tested the changes.

ok mvs@
sys/dev/pci/if_iwx.c