The branch stable/13 has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=c43e14590772d8043048d7c9acf333764d21a1cf

commit c43e14590772d8043048d7c9acf333764d21a1cf
Author:     Konstantin Belousov <[email protected]>
AuthorDate: 2021-09-06 11:43:06 +0000
Commit:     Konstantin Belousov <[email protected]>
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. */
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to