svn commit: r333339 - in head/sys: kern sys
Mateusz Guzik
mjg at FreeBSD.org
Mon May 7 22:29:33 UTC 2018
Author: mjg
Date: Mon May 7 22:29:32 2018
New Revision: 333339
URL: https://svnweb.freebsd.org/changeset/base/333339
Log:
Avoid calls to syscall_thread_enter/exit for statically defined syscalls
The entire mechanism is rarely used and is quite not performant due to
atomci ops on the syscall table. It also has added overhead for completely
unrelated syscalls.
Reduce it by avoiding the func calls if possible (which consistutes vast
majority of cases).
Provides about 3% syscall rate speed up for getuid on Broadwell.
Modified:
head/sys/kern/kern_syscalls.c
head/sys/sys/sysent.h
Modified: head/sys/kern/kern_syscalls.c
==============================================================================
--- head/sys/kern/kern_syscalls.c Mon May 7 21:42:22 2018 (r333338)
+++ head/sys/kern/kern_syscalls.c Mon May 7 22:29:32 2018 (r333339)
@@ -80,14 +80,12 @@ 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;
do {
oldcnt = se->sy_thrcnt;
- if ((oldcnt & SY_THR_STATIC) != 0)
- return (0);
if ((oldcnt & (SY_THR_DRAINING | SY_THR_ABSENT)) != 0)
return (ENOSYS);
cnt = oldcnt + SY_THR_INCR;
@@ -96,14 +94,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;
do {
oldcnt = se->sy_thrcnt;
- if ((oldcnt & SY_THR_STATIC) != 0)
- return;
cnt = oldcnt - SY_THR_INCR;
} while (atomic_cmpset_rel_32(&se->sy_thrcnt, oldcnt, cnt) == 0);
}
Modified: head/sys/sys/sysent.h
==============================================================================
--- head/sys/sys/sysent.h Mon May 7 21:42:22 2018 (r333338)
+++ head/sys/sys/sysent.h Mon May 7 22:29:32 2018 (r333339)
@@ -289,8 +289,26 @@ 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);
+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 shared_page_alloc(int size, int align);
int shared_page_fill(int size, int align, const void *data);
More information about the svn-src-head
mailing list