summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_exit.c14
-rw-r--r--sys/kern/kern_thread.c18
2 files changed, 18 insertions, 14 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index 0738e69..9c469f7 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -110,7 +110,6 @@ sys_exit(struct thread *td, struct sys_exit_args *uap)
void
exit1(struct thread *td, int rv)
{
- uint64_t new_switchtime;
struct proc *p, *nq, *q;
struct tty *tp;
struct vnode *ttyvp;
@@ -557,19 +556,6 @@ retry:
p->p_state = PRS_ZOMBIE;
PROC_UNLOCK(p->p_pptr);
- /* Do the same timestamp bookkeeping that mi_switch() would do. */
- new_switchtime = cpu_ticks();
- p->p_rux.rux_runtime += (new_switchtime - PCPU_GET(switchtime));
- p->p_rux.rux_uticks += td->td_uticks;
- p->p_rux.rux_sticks += td->td_sticks;
- p->p_rux.rux_iticks += td->td_iticks;
- PCPU_SET(switchtime, new_switchtime);
- PCPU_SET(switchticks, ticks);
- cnt.v_swtch++;
-
- /* Add our usage into the usage of all our children. */
- ruadd(p->p_ru, &p->p_rux, &p->p_stats->p_cru, &p->p_crux);
-
sched_exit(p->p_pptr, td);
/*
diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c
index 1d68f44..07bf319 100644
--- a/sys/kern/kern_thread.c
+++ b/sys/kern/kern_thread.c
@@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/proc.h>
+#include <sys/resourcevar.h>
#include <sys/smp.h>
#include <sys/sysctl.h>
#include <sys/sched.h>
@@ -454,6 +455,7 @@ thread_free(struct thread *td)
void
thread_exit(void)
{
+ uint64_t new_switchtime;
struct thread *td;
struct proc *p;
struct ksegrp *kg;
@@ -494,9 +496,25 @@ thread_exit(void)
/*
* The thread is exiting. scheduler can release its stuff
* and collect stats etc.
+ * XXX this is not very right, since PROC_UNLOCK may still
+ * need scheduler stuff.
*/
sched_thread_exit(td);
+ /* Do the same timestamp bookkeeping that mi_switch() would do. */
+ new_switchtime = cpu_ticks();
+ p->p_rux.rux_runtime += (new_switchtime - PCPU_GET(switchtime));
+ p->p_rux.rux_uticks += td->td_uticks;
+ p->p_rux.rux_sticks += td->td_sticks;
+ p->p_rux.rux_iticks += td->td_iticks;
+ PCPU_SET(switchtime, new_switchtime);
+ PCPU_SET(switchticks, ticks);
+ cnt.v_swtch++;
+
+ /* Add our usage into the usage of all our children. */
+ if (p->p_numthreads == 1)
+ ruadd(p->p_ru, &p->p_rux, &p->p_stats->p_cru, &p->p_crux);
+
/*
* The last thread is left attached to the process
* So that the whole bundle gets recycled. Skip
OpenPOWER on IntegriCloud