Author: trasz
Date: Sun Nov  8 15:54:59 2020
New Revision: 367488
URL: https://svnweb.freebsd.org/changeset/base/367488

Log:
  Move syscall_thread_{enter,exit}() into the slow path.  This is only
  needed for syscalls from unloadable modules.
  
  Reviewed by:  kib
  MFC after:    2 weeks
  Sponsored by: EPSRC
  Differential Revision:        https://reviews.freebsd.org/D26988

Modified:
  head/sys/kern/kern_syscalls.c
  head/sys/kern/subr_syscall.c
  head/sys/sys/sysent.h

Modified: head/sys/kern/kern_syscalls.c
==============================================================================
--- head/sys/kern/kern_syscalls.c       Sun Nov  8 14:08:00 2020        
(r367487)
+++ head/sys/kern/kern_syscalls.c       Sun Nov  8 15:54:59 2020        
(r367488)
@@ -80,10 +80,13 @@ syscall_thread_drain(struct sysent *se)
 }
 
 int
-_syscall_thread_enter(struct thread *td, struct sysent *se)
+syscall_thread_enter(struct thread *td, struct sysent *se)
 {
        u_int32_t cnt, oldcnt;
 
+       KASSERT((se->sy_thrcnt & SY_THR_STATIC) == 0,
+           ("%s: not a static syscall", __func__));
+
        do {
                oldcnt = se->sy_thrcnt;
                if ((oldcnt & (SY_THR_DRAINING | SY_THR_ABSENT)) != 0)
@@ -94,9 +97,12 @@ _syscall_thread_enter(struct thread *td, struct sysent
 }
 
 void
-_syscall_thread_exit(struct thread *td, struct sysent *se)
+syscall_thread_exit(struct thread *td, struct sysent *se)
 {
        u_int32_t cnt, oldcnt;
+
+       KASSERT((se->sy_thrcnt & SY_THR_STATIC) == 0,
+           ("%s: not a static syscall", __func__));
 
        do {
                oldcnt = se->sy_thrcnt;

Modified: head/sys/kern/subr_syscall.c
==============================================================================
--- head/sys/kern/subr_syscall.c        Sun Nov  8 14:08:00 2020        
(r367487)
+++ head/sys/kern/subr_syscall.c        Sun Nov  8 15:54:59 2020        
(r367488)
@@ -61,6 +61,7 @@ syscallenter(struct thread *td)
        struct syscall_args *sa;
        struct sysent *se;
        int error, traced;
+       bool sy_thr_static;
 
        VM_CNT_INC(v_syscall);
        p = td->td_proc;
@@ -128,12 +129,6 @@ syscallenter(struct thread *td)
        }
 #endif
 
-       error = syscall_thread_enter(td, se);
-       if (error != 0) {
-               td->td_errno = error;
-               goto retval;
-       }
-
        /*
         * Fetch fast sigblock value at the time of syscall entry to
         * handle sleepqueue primitives which might call cursig().
@@ -145,8 +140,19 @@ syscallenter(struct thread *td)
        KASSERT((td->td_pflags & TDP_NERRNO) == 0,
            ("%s: TDP_NERRNO set", __func__));
 
+       sy_thr_static = (se->sy_thrcnt & SY_THR_STATIC) != 0;
+
        if (__predict_false(SYSTRACE_ENABLED() ||
-           AUDIT_SYSCALL_ENTER(sa->code, td))) {
+           AUDIT_SYSCALL_ENTER(sa->code, td) ||
+           !sy_thr_static)) {
+               if (!sy_thr_static) {
+                       error = syscall_thread_enter(td, se);
+                       if (error != 0) {
+                               td->td_errno = error;
+                               goto retval;
+                       }
+               }
+
 #ifdef KDTRACE_HOOKS
                /* Give the syscall:::entry DTrace probe a chance to fire. */
                if (__predict_false(se->sy_entry != 0))
@@ -176,6 +182,9 @@ syscallenter(struct thread *td)
                        (*systrace_probe_func)(sa, SYSTRACE_RETURN,
                            error ? -1 : td->td_retval[0]);
 #endif
+
+               if (!sy_thr_static)
+                       syscall_thread_exit(td, se);
        } else {
                error = (se->sy_call)(td, sa->args);
                /* Save the latest error return value. */
@@ -184,7 +193,6 @@ syscallenter(struct thread *td)
                else
                        td->td_errno = error;
        }
-       syscall_thread_exit(td, se);
 
  retval:
        KTR_STOP4(KTR_SYSC, "syscall", syscallname(p, sa->code),

Modified: head/sys/sys/sysent.h
==============================================================================
--- head/sys/sys/sysent.h       Sun Nov  8 14:08:00 2020        (r367487)
+++ head/sys/sys/sysent.h       Sun Nov  8 15:54:59 2020        (r367488)
@@ -294,26 +294,8 @@ struct nosys_args;
 int    lkmnosys(struct thread *, struct nosys_args *);
 int    lkmressys(struct thread *, struct nosys_args *);
 
-int    _syscall_thread_enter(struct thread *td, struct sysent *se);
-void   _syscall_thread_exit(struct thread *td, struct sysent *se);
-
-static inline int
-syscall_thread_enter(struct thread *td, struct sysent *se)
-{
-
-       if (__predict_true((se->sy_thrcnt & SY_THR_STATIC) != 0))
-               return (0);
-       return (_syscall_thread_enter(td, se));
-}
-
-static inline void
-syscall_thread_exit(struct thread *td, struct sysent *se)
-{
-
-       if (__predict_true((se->sy_thrcnt & SY_THR_STATIC) != 0))
-               return;
-       _syscall_thread_exit(td, se);
-}
+int    syscall_thread_enter(struct thread *td, struct sysent *se);
+void   syscall_thread_exit(struct thread *td, struct sysent *se);
 
 int shared_page_alloc(int size, int align);
 int shared_page_fill(int size, int align, const void *data);
_______________________________________________
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