summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_trap.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2010-06-28 18:06:46 +0000
committerkib <kib@FreeBSD.org>2010-06-28 18:06:46 +0000
commitb6d8416eac525c06902bf03315b88189e10545e3 (patch)
tree2ffebda973ea179d4a39ddccaf5d3e9279811ad0 /sys/kern/subr_trap.c
parent2774f04de78aab6af0f10e1129f45bf8be19aae5 (diff)
downloadFreeBSD-src-b6d8416eac525c06902bf03315b88189e10545e3.zip
FreeBSD-src-b6d8416eac525c06902bf03315b88189e10545e3.tar.gz
Count number of threads that enter and leave dynamically registered
syscalls. On the dynamic syscall deregistration, wait until all threads leave the syscall code. This somewhat increases the safety of the loadable modules unloading. Reviewed by: jhb Tested by: pho MFC after: 1 month
Diffstat (limited to 'sys/kern/subr_trap.c')
-rw-r--r--sys/kern/subr_trap.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c
index 19bd5d4..4298429 100644
--- a/sys/kern/subr_trap.c
+++ b/sys/kern/subr_trap.c
@@ -298,6 +298,9 @@ syscallenter(struct thread *td, struct syscall_args *sa)
if (error != 0)
goto retval;
}
+ error = syscall_thread_enter(td, sa->callp);
+ if (error != 0)
+ goto retval;
#ifdef KDTRACE_HOOKS
/*
@@ -327,6 +330,7 @@ syscallenter(struct thread *td, struct syscall_args *sa)
(*systrace_probe_func)(sa->callp->sy_return, sa->code,
sa->callp, sa->args);
#endif
+ syscall_thread_exit(td, sa->callp);
CTR4(KTR_SYSC, "syscall: p=%p error=%d return %#lx %#lx",
p, error, td->td_retval[0], td->td_retval[1]);
}
OpenPOWER on IntegriCloud