On 15 Mar 2017, at 15:45, John Baldwin wrote:
You are ignoring interrupts and preemption. Suppose you get an
interrupt
after 'wakeup_one(pf_purge_thread)' and before 'tsleep(..., 0)' in
pf_unload(). If the interrupt preempts and results in the purge
thread
running and issuing its wakeup before the thread executing pf_unload()
resumes, then eventually when pf_unload() resumes it will do a
tsleep() with
no timeout that will never be awoken.
Thank you for the thorough explanation. I’ll work on a fix and post it
for
review as soon as I can.
You obviously didn't test this in a debug kernel since there is a
KASSERT
explicitly to catch obvious tsleep races in _sleep():
KASSERT(sbt != 0 || mtx_owned(&Giant) || lock != NULL,
("sleeping without a lock"));
I’m sure I did test this with both INVARIANTS and WITNESS enabled.
Is Giant held during module load/unload?
Regards,
Kristof
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"