From c477e5cf4a7bbb2429144dffee5efae5ba6292d2 Mon Sep 17 00:00:00 2001 From: dchagin Date: Sat, 9 Jan 2016 18:24:53 +0000 Subject: [PATCH] MFC r287395 (by trasz): Fixes a panic triggered by threaded Linux applications when running with RACCT/RCTL enabled. git-svn-id: svn://svn.freebsd.org/base/stable/10@293607 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/compat/linux/linux_fork.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/sys/compat/linux/linux_fork.c b/sys/compat/linux/linux_fork.c index 280b40624..e7b2c6202 100644 --- a/sys/compat/linux/linux_fork.c +++ b/sys/compat/linux/linux_fork.c @@ -286,10 +286,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); @@ -370,6 +380,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 -- 2.45.0