aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2014-10-23 19:06:08 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2014-10-23 19:06:08 +0000
commitffc5ce7b7523a46ce1b05a533483024d7c246910 (patch)
treef65f889ac11420ac3776e180915debd7cb27f105 /sys
parent2735a91d938ad112c1aa2396e9f411d0128bc729 (diff)
downloadsrc-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.c3
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);