git: c43e14590772 - stable/13 - kqueue: drain kqueue taskqueue if syscall tickled it
Konstantin Belousov
kib at FreeBSD.org
Sun Sep 12 12:18:23 UTC 2021
The branch stable/13 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=c43e14590772d8043048d7c9acf333764d21a1cf
commit c43e14590772d8043048d7c9acf333764d21a1cf
Author: Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2021-09-06 11:43:06 +0000
Commit: Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2021-09-12 12:17:27 +0000
kqueue: drain kqueue taskqueue if syscall tickled it
PR: 258310
(cherry picked from commit 98168a6e6c12dab8f608f6b5f5b0b175d2b87ef0)
---
sys/kern/kern_event.c | 11 +++++++++++
sys/kern/subr_trap.c | 7 ++++++-
sys/sys/event.h | 1 +
sys/sys/proc.h | 2 +-
4 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index 47aec4d12e9e..91895d341184 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -1768,9 +1768,16 @@ kqueue_release(struct kqueue *kq, int locked)
KQ_UNLOCK(kq);
}
+void
+kqueue_drain_schedtask(void)
+{
+ taskqueue_quiesce(taskqueue_kqueue_ctx);
+}
+
static void
kqueue_schedtask(struct kqueue *kq)
{
+ struct thread *td;
KQ_OWNED(kq);
KASSERT(((kq->kq_state & KQ_TASKDRAIN) != KQ_TASKDRAIN),
@@ -1779,6 +1786,10 @@ kqueue_schedtask(struct kqueue *kq)
if ((kq->kq_state & KQ_TASKSCHED) != KQ_TASKSCHED) {
taskqueue_enqueue(taskqueue_kqueue_ctx, &kq->kq_task);
kq->kq_state |= KQ_TASKSCHED;
+ td = curthread;
+ thread_lock(td);
+ td->td_flags |= TDF_ASTPENDING | TDF_KQTICKLED;
+ thread_unlock(td);
}
}
diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c
index d0f616d037c5..c2c27a4d40cb 100644
--- a/sys/kern/subr_trap.c
+++ b/sys/kern/subr_trap.c
@@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/capsicum.h>
+#include <sys/event.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/mutex.h>
@@ -238,7 +239,8 @@ ast(struct trapframe *framep)
thread_lock(td);
flags = td->td_flags;
td->td_flags &= ~(TDF_ASTPENDING | TDF_NEEDSIGCHK | TDF_NEEDSUSPCHK |
- TDF_NEEDRESCHED | TDF_ALRMPEND | TDF_PROFPEND | TDF_MACPEND);
+ TDF_NEEDRESCHED | TDF_ALRMPEND | TDF_PROFPEND | TDF_MACPEND |
+ TDF_KQTICKLED);
thread_unlock(td);
VM_CNT_INC(v_trap);
@@ -340,6 +342,9 @@ ast(struct trapframe *framep)
resched_sigs = false;
}
+ if ((flags & TDF_KQTICKLED) != 0)
+ kqueue_drain_schedtask();
+
/*
* Handle deferred update of the fast sigblock value, after
* the postsig() loop was performed.
diff --git a/sys/sys/event.h b/sys/sys/event.h
index b3106e6fa874..833292c989b7 100644
--- a/sys/sys/event.h
+++ b/sys/sys/event.h
@@ -348,6 +348,7 @@ int kqfd_register(int fd, struct kevent *kev, struct thread *p,
int mflag);
int kqueue_add_filteropts(int filt, struct filterops *filtops);
int kqueue_del_filteropts(int filt);
+void kqueue_drain_schedtask(void);
#else /* !_KERNEL */
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index 373e62bd266d..138e763f2f11 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -449,7 +449,7 @@ do { \
#define TDF_ALLPROCSUSP 0x00000200 /* suspended by SINGLE_ALLPROC */
#define TDF_BOUNDARY 0x00000400 /* Thread suspended at user boundary */
#define TDF_ASTPENDING 0x00000800 /* Thread has some asynchronous events. */
-#define TDF_UNUSED12 0x00001000 /* --available-- */
+#define TDF_KQTICKLED 0x00001000 /* AST drain kqueue taskqueue */
#define TDF_SBDRY 0x00002000 /* Stop only on usermode boundary. */
#define TDF_UPIBLOCKED 0x00004000 /* Thread blocked on user PI mutex. */
#define TDF_NEEDSUSPCHK 0x00008000 /* Thread may need to suspend. */
More information about the dev-commits-src-all
mailing list