Page MenuHomeFreeBSD

D56226.id175166.diff
No OneTemporary

D56226.id175166.diff

diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -2792,31 +2792,39 @@
KNL_ASSERT_LOCKED(knl);
else {
KNL_ASSERT_UNLOCKED(knl);
-again: /* need to reacquire lock since we have dropped it */
knl->kl_lock(knl->kl_lockarg);
}
- SLIST_FOREACH_SAFE(kn, &knl->kl_list, kn_selnext, kn2) {
- kq = kn->kn_kq;
- KQ_LOCK(kq);
- if (kn_in_flux(kn)) {
- KQ_UNLOCK(kq);
- continue;
- }
- knlist_remove_kq(knl, kn, 1, 1);
- if (killkn) {
- kn_enter_flux(kn);
- KQ_UNLOCK(kq);
- knote_drop_detached(kn, td);
- } else {
- /* Make sure cleared knotes disappear soon */
- kn->kn_flags |= EV_EOF | EV_ONESHOT;
- KQ_UNLOCK(kq);
+ for (;;) {
+ /*
+ * Each pass removes as many knotes as we can before dropping
+ * into FLUXWAIT. Active knotes are simply detached and either
+ * freed or converted to one-shot, as the attached subject is
+ * essentially disappearing.
+ */
+ SLIST_FOREACH_SAFE(kn, &knl->kl_list, kn_selnext, kn2) {
+ kq = kn->kn_kq;
+ KQ_LOCK(kq);
+ if (kn_in_flux(kn)) {
+ KQ_UNLOCK(kq);
+ continue;
+ }
+ knlist_remove_kq(knl, kn, 1, 1);
+ if (killkn) {
+ kn_enter_flux(kn);
+ KQ_UNLOCK(kq);
+ knote_drop_detached(kn, td);
+ } else {
+ /* Make sure cleared knotes disappear soon */
+ kn->kn_flags |= EV_EOF | EV_ONESHOT;
+ KQ_UNLOCK(kq);
+ }
+ kq = NULL;
}
- kq = NULL;
- }
- if (!SLIST_EMPTY(&knl->kl_list)) {
+ if (SLIST_EMPTY(&knl->kl_list))
+ break;
+
/* there are still in flux knotes remaining */
kn = SLIST_FIRST(&knl->kl_list);
kq = kn->kn_kq;
@@ -2826,7 +2834,7 @@
kq->kq_state |= KQ_FLUXWAIT;
msleep(kq, &kq->kq_lock, PSOCK | PDROP, "kqkclr", 0);
kq = NULL;
- goto again;
+ knl->kl_lock(knl->kl_lockarg);
}
if (islocked)

File Metadata

Mime Type
text/plain
Expires
Sun, Apr 19, 9:46 PM (10 h, 19 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31191546
Default Alt Text
D56226.id175166.diff (1 KB)

Event Timeline