summaryrefslogtreecommitdiff
path: root/sys/dev/dm/dm_dev.c
diff options
context:
space:
mode:
authorthorpej <thorpej@NetBSD.org>2019-12-30 23:32:29 +0000
committerthorpej <thorpej@NetBSD.org>2019-12-30 23:32:29 +0000
commit77f692572b1cd04f4acd823c87f252bbb3a7671e (patch)
tree3ba311570fdccd7d60fbc654089343f8cc159ca1 /sys/dev/dm/dm_dev.c
parent38c6ed745d424538d5c5f6389b181ce1dffebe9e (diff)
Fix a problem with intr_unmask() that can cause a forever-loop:
- When handling the source-is-masked case in the interrupt vector, set the interrupt bit in a new ci_imasked field and ensure the bit is cleared from ci_ipending. - In intr_unmask(), transfer the bit from ci_imasked to ci_ipending for non-level-sensitive interrupts (the PIC does the work for us in the level-sensitive case), and only force pending interrupts to be processed in this case. (In all cases, make sure the now-unmasked bit is cleared from ci_imasked.) Before, the bit was left in ci_ipending so as not to use edge-triggered interrupts while the source is masked, but Xspllower() relies on the pending bits getting cleared. Tested by forcing all wm(4) interrupts on my test system though an intr_mask() / softint / intr_unmask() cycle and exercising the network heavily.
Diffstat (limited to 'sys/dev/dm/dm_dev.c')
0 files changed, 0 insertions, 0 deletions