summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2016-12-26 09:52:19 +0000
committerkib <kib@FreeBSD.org>2016-12-26 09:52:19 +0000
commita23ff62742978f29a5c7087c93a9998b6406cc7b (patch)
treee3816107264541038923aa0573ab0047d4b56908 /sys/kern
parent07f1e61a12d229d80df3469fc35331b20f90eefd (diff)
downloadFreeBSD-src-a23ff62742978f29a5c7087c93a9998b6406cc7b.zip
FreeBSD-src-a23ff62742978f29a5c7087c93a9998b6406cc7b.tar.gz
MFC r310302:
Do not clear KN_INFLUX when not owning influx state. PR: 214923
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_event.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index b734cf2..e832120 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -2006,6 +2006,7 @@ knote(struct knlist *list, long hint, int lockflags)
struct kqueue *kq;
struct knote *kn, *tkn;
int error;
+ bool own_influx;
if (list == NULL)
return;
@@ -2036,11 +2037,14 @@ knote(struct knlist *list, long hint, int lockflags)
*/
KQ_UNLOCK(kq);
} else if ((lockflags & KNF_NOKQLOCK) != 0) {
- kn->kn_status |= KN_INFLUX;
+ own_influx = (kn->kn_status & KN_INFLUX) == 0;
+ if (own_influx)
+ kn->kn_status |= KN_INFLUX;
KQ_UNLOCK(kq);
error = kn->kn_fop->f_event(kn, hint);
KQ_LOCK(kq);
- kn->kn_status &= ~KN_INFLUX;
+ if (own_influx)
+ kn->kn_status &= ~KN_INFLUX;
if (error)
KNOTE_ACTIVATE(kn, 1);
KQ_UNLOCK_FLUX(kq);
OpenPOWER on IntegriCloud