svn commit: r367488 - in head/sys: kern sys
Edward Tomasz Napierala
trasz at FreeBSD.org
Sun Nov 8 15:55:00 UTC 2020
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);
More information about the svn-src-all
mailing list