diff options
author | Mateusz Guzik <mjg@FreeBSD.org> | 2014-10-23 19:06:08 +0000 |
---|---|---|
committer | Mateusz Guzik <mjg@FreeBSD.org> | 2014-10-23 19:06:08 +0000 |
commit | ffc5ce7b7523a46ce1b05a533483024d7c246910 (patch) | |
tree | f65f889ac11420ac3776e180915debd7cb27f105 /sys | |
parent | 2735a91d938ad112c1aa2396e9f411d0128bc729 (diff) | |
download | src-ffc5ce7b7523a46ce1b05a533483024d7c246910.tar.gz src-ffc5ce7b7523a46ce1b05a533483024d7c246910.zip |
In selfdfree re-evaulate sf_si after takin the lock.
Otherwise we can race with doselwakeup.
This is a fixup to r273549
Reviewed by: jhb
Reported by: everyone and their dog
Notes
Notes:
svn path=/head/; revision=273555
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/sys_generic.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 5e12b1dd0eb4..23173bed4335 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -1602,7 +1602,8 @@ selfdfree(struct seltd *stp, struct selfd *sfp) STAILQ_REMOVE(&stp->st_selq, sfp, selfd, sf_link); if (sfp->sf_si != NULL) { mtx_lock(sfp->sf_mtx); - TAILQ_REMOVE(&sfp->sf_si->si_tdlist, sfp, sf_threads); + if (sfp->sf_si != NULL) + TAILQ_REMOVE(&sfp->sf_si->si_tdlist, sfp, sf_threads); mtx_unlock(sfp->sf_mtx); } uma_zfree(selfd_zone, sfp); |