diff options
author | kib <kib@FreeBSD.org> | 2010-06-28 18:06:46 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2010-06-28 18:06:46 +0000 |
commit | b6d8416eac525c06902bf03315b88189e10545e3 (patch) | |
tree | 2ffebda973ea179d4a39ddccaf5d3e9279811ad0 /sys/kern/subr_trap.c | |
parent | 2774f04de78aab6af0f10e1129f45bf8be19aae5 (diff) | |
download | FreeBSD-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.c | 4 |
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]); } |