Author: mjg
Date: Sat Dec  8 06:34:12 2018
New Revision: 341722
URL: https://svnweb.freebsd.org/changeset/base/341722

Log:
  proc: postpone proc unlock until after reporting with kqueue
  
  kqueue would always relock immediately afterwards.
  
  While here drop the NULL check for list itself. The list is
  always allocated.
  
  Sponsored by: The FreeBSD Foundation

Modified:
  head/sys/kern/kern_event.c
  head/sys/kern/kern_fork.c

Modified: head/sys/kern/kern_event.c
==============================================================================
--- head/sys/kern/kern_event.c  Sat Dec  8 06:31:43 2018        (r341721)
+++ head/sys/kern/kern_event.c  Sat Dec  8 06:34:12 2018        (r341722)
@@ -533,11 +533,12 @@ knote_fork(struct knlist *list, int pid)
        struct kevent kev;
        int error;
 
-       if (list == NULL)
+       MPASS(list != NULL);
+       KNL_ASSERT_LOCKED(list);
+       if (SLIST_EMPTY(&list->kl_list))
                return;
 
        memset(&kev, 0, sizeof(kev));
-       list->kl_lock(list->kl_lockarg);
        SLIST_FOREACH(kn, &list->kl_list, kn_selnext) {
                kq = kn->kn_kq;
                KQ_LOCK(kq);
@@ -606,7 +607,6 @@ knote_fork(struct knlist *list, int pid)
                kn_leave_flux(kn);
                KQ_UNLOCK_FLUX(kq);
        }
-       list->kl_unlock(list->kl_lockarg);
 }
 
 /*

Modified: head/sys/kern/kern_fork.c
==============================================================================
--- head/sys/kern/kern_fork.c   Sat Dec  8 06:31:43 2018        (r341721)
+++ head/sys/kern/kern_fork.c   Sat Dec  8 06:34:12 2018        (r341722)
@@ -686,15 +686,15 @@ do_fork(struct thread *td, struct fork_req *fr, struct
        PROC_UNLOCK(p2);
 
        /*
-        * Now can be swapped.
+        * Tell any interested parties about the new process.
         */
-       _PRELE(p1);
-       PROC_UNLOCK(p1);
+       knote_fork(p1->p_klist, p2->p_pid);
 
        /*
-        * Tell any interested parties about the new process.
+        * Now can be swapped.
         */
-       knote_fork(p1->p_klist, p2->p_pid);
+       _PRELE(p1);
+       PROC_UNLOCK(p1);
        SDT_PROBE3(proc, , , create, p2, p1, fr->fr_flags);
 
        if (fr->fr_flags & RFPROCDESC) {
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to