diff options
| author | thorpej <thorpej@NetBSD.org> | 2019-12-30 23:32:29 +0000 |
|---|---|---|
| committer | thorpej <thorpej@NetBSD.org> | 2019-12-30 23:32:29 +0000 |
| commit | 77f692572b1cd04f4acd823c87f252bbb3a7671e (patch) | |
| tree | 3ba311570fdccd7d60fbc654089343f8cc159ca1 /sys/dev/dm/dm_dev.c | |
| parent | 38c6ed745d424538d5c5f6389b181ce1dffebe9e (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
