summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_event.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2009-10-10 14:56:34 +0000
committerkib <kib@FreeBSD.org>2009-10-10 14:56:34 +0000
commit87a472715d25d03a998dbd9388da266a7416f555 (patch)
tree13a6d5c8c523d3316e78f9f4bb16f3944c3390b0 /sys/kern/kern_event.c
parent879da4fe23f267502b5543f60d3d25fc1eccd043 (diff)
downloadFreeBSD-src-87a472715d25d03a998dbd9388da266a7416f555.zip
FreeBSD-src-87a472715d25d03a998dbd9388da266a7416f555.tar.gz
Postpone dropping fp till both kq_global and kqueue mutexes are
unlocked. fdrop() closes file descriptor when reference count goes to zero. Close method for vnodes locks the vnode, resulting in "sleepable after non-sleepable". For pipes, pipe mutex is before kqueue lock, causing LOR. Reported and tested by: pho MFC after: 2 weeks
Diffstat (limited to 'sys/kern/kern_event.c')
-rw-r--r--sys/kern/kern_event.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index 478432e..7c40594 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -1025,13 +1025,13 @@ findkn:
/* knote is in the process of changing, wait for it to stablize. */
if (kn != NULL && (kn->kn_status & KN_INFLUX) == KN_INFLUX) {
+ KQ_GLOBAL_UNLOCK(&kq_global, haskqglobal);
+ kq->kq_state |= KQ_FLUXWAIT;
+ msleep(kq, &kq->kq_lock, PSOCK | PDROP, "kqflxwt", 0);
if (fp != NULL) {
fdrop(fp, td);
fp = NULL;
}
- KQ_GLOBAL_UNLOCK(&kq_global, haskqglobal);
- kq->kq_state |= KQ_FLUXWAIT;
- msleep(kq, &kq->kq_lock, PSOCK | PDROP, "kqflxwt", 0);
goto findkn;
}
OpenPOWER on IntegriCloud