Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F109935081
D26988.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D26988.diff
View Options
Index: head/sys/kern/kern_syscalls.c
===================================================================
--- head/sys/kern/kern_syscalls.c
+++ head/sys/kern/kern_syscalls.c
@@ -80,10 +80,13 @@
}
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 @@
}
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;
Index: head/sys/kern/subr_syscall.c
===================================================================
--- head/sys/kern/subr_syscall.c
+++ head/sys/kern/subr_syscall.c
@@ -61,6 +61,7 @@
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 @@
}
#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 @@
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 @@
(*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 @@
else
td->td_errno = error;
}
- syscall_thread_exit(td, se);
retval:
KTR_STOP4(KTR_SYSC, "syscall", syscallname(p, sa->code),
Index: head/sys/sys/sysent.h
===================================================================
--- head/sys/sys/sysent.h
+++ head/sys/sys/sysent.h
@@ -294,26 +294,8 @@
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);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Feb 12, 11:09 AM (19 h, 1 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16609698
Default Alt Text
D26988.diff (3 KB)
Attached To
Mode
D26988: Move syscall_thread_{enter,exit}() to the slow path
Attached
Detach File
Event Timeline
Log In to Comment