aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2015-09-02 14:04:13 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2015-09-02 14:04:13 +0000
commit089d32934ad974de5936051de316495514dd9ce8 (patch)
treef9a5793536a77ae2a3d18d60a4973d0fc00c4665
parente56079102882a46c189559d116506b5a2df5401c (diff)
downloadsrc-089d32934ad974de5936051de316495514dd9ce8.tar.gz
src-089d32934ad974de5936051de316495514dd9ce8.zip
Fixes a panic triggered by threaded Linux applications when running
with RACCT/RCTL enabled. Reviewed by: ngie@, ed@ Tested by: Larry Rosenman <ler@lerctr.org> MFC after: 1 month Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D3470
Notes
Notes: svn path=/head/; revision=287395
-rw-r--r--sys/compat/linux/linux_fork.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/sys/compat/linux/linux_fork.c b/sys/compat/linux/linux_fork.c
index a8bf72091393..dd3b8940c086 100644
--- a/sys/compat/linux/linux_fork.c
+++ b/sys/compat/linux/linux_fork.c
@@ -285,10 +285,20 @@ linux_clone_thread(struct thread *td, struct linux_clone_args *args)
p = td->td_proc;
+#ifdef RACCT
+ if (racct_enable) {
+ PROC_LOCK(p);
+ error = racct_add(p, RACCT_NTHR, 1);
+ PROC_UNLOCK(p);
+ if (error != 0)
+ return (EPROCLIM);
+ }
+#endif
+
/* Initialize our td */
error = kern_thr_alloc(p, 0, &newtd);
if (error)
- return (error);
+ goto fail;
cpu_set_upcall(newtd, td);
@@ -369,6 +379,16 @@ linux_clone_thread(struct thread *td, struct linux_clone_args *args)
td->td_retval[0] = newtd->td_tid;
return (0);
+
+fail:
+#ifdef RACCT
+ if (racct_enable) {
+ PROC_LOCK(p);
+ racct_sub(p, RACCT_NTHR, 1);
+ PROC_UNLOCK(p);
+ }
+#endif
+ return (error);
}
int