CVSROOT: /cvs Module name: src Changes by: v...@cvs.openbsd.org 2022/06/12 04:36:04
Modified files: sys/kern : kern_synch.c Log message: Allow sleeping while clearing a sleep timeout Since sys/kern/kern_timeout.c r1.84, timeout_barrier() has used sleeping with soft-interrupt-driven timeouts. Adjust the sleep machinery so that the timeout clearing can block in sleep_finish(). This adds one step of recursion inside sleep_finish(). However, the sleep queue handling does not recurse because sleep_finish() completes it before calling timeout_del_barrier(). This fixes the following panic: panic: kernel diagnostic assertion "(p->p_flag & P_TIMEOUT) == 0" failed: file "sys/kern/kern_synch.c", line 373 Stopped at db_enter+0x10: popq %rbp db_enter() at db_enter+0x10 panic() at panic+0xbf __assert() at __assert+0x25 sleep_setup() at sleep_setup+0x1d8 cond_wait() at cond_wait+0x46 timeout_barrier() at timeout_barrier+0x109 timeout_del_barrier() at timeout_del_barrier+0xa2 sleep_finish() at sleep_finish+0x16d tsleep() at tsleep+0xb2 sys_nanosleep() at sys_nanosleep+0x12d syscall() at syscall+0x374 OK mpi@ dlg@