svn commit: r207916 - in stable/8/sys: kern sys

Konstantin Belousov kib at FreeBSD.org
Tue May 11 13:18:42 UTC 2010


Author: kib
Date: Tue May 11 13:18:41 2010
New Revision: 207916
URL: http://svn.freebsd.org/changeset/base/207916

Log:
  MFC r207468:
  Extract thread_lock()/ruxagg()/thread_unlock() fragment into utility
  function ruxagg_tlock().
  Convert the definition of kern_getrusage() to ANSI C.
  
  MFC r207602:
  Implement RUSAGE_THREAD. Add td_rux to keep extended runtime and ticks
  information for thread to allow calcru1() (re)use.
  
  Rename ruxagg()->ruxagg_locked(), ruxagg_tlock()->ruxagg() [1].
  The ruxagg_locked() function no longer clears thread ticks nor
  td_incruntime.
  
  Not an MFC: the td_rux is added to the end of struct thread to keep
  the KBI. Explicit bzero() of td_rux is added to new thread initialization
  points.

Modified:
  stable/8/sys/kern/kern_fork.c
  stable/8/sys/kern/kern_kthread.c
  stable/8/sys/kern/kern_resource.c
  stable/8/sys/kern/kern_thr.c
  stable/8/sys/kern/kern_thread.c
  stable/8/sys/sys/proc.h
  stable/8/sys/sys/resource.h
  stable/8/sys/sys/resourcevar.h
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)
  stable/8/sys/geom/sched/   (props changed)

Modified: stable/8/sys/kern/kern_fork.c
==============================================================================
--- stable/8/sys/kern/kern_fork.c	Tue May 11 12:07:40 2010	(r207915)
+++ stable/8/sys/kern/kern_fork.c	Tue May 11 13:18:41 2010	(r207916)
@@ -531,6 +531,7 @@ again:
 
 	bzero(&td2->td_startzero,
 	    __rangeof(struct thread, td_startzero, td_endzero));
+	bzero(&td2->td_rux, sizeof(td2->td_rux));
 
 	bcopy(&td->td_startcopy, &td2->td_startcopy,
 	    __rangeof(struct thread, td_startcopy, td_endcopy));

Modified: stable/8/sys/kern/kern_kthread.c
==============================================================================
--- stable/8/sys/kern/kern_kthread.c	Tue May 11 12:07:40 2010	(r207915)
+++ stable/8/sys/kern/kern_kthread.c	Tue May 11 13:18:41 2010	(r207916)
@@ -262,6 +262,7 @@ kthread_add(void (*func)(void *), void *
 
 	bzero(&newtd->td_startzero,
 	    __rangeof(struct thread, td_startzero, td_endzero));
+	bzero(&newtd->td_rux, sizeof(newtd->td_rux));
 /* XXX check if we should zero. */
 	bcopy(&oldtd->td_startcopy, &newtd->td_startcopy,
 	    __rangeof(struct thread, td_startcopy, td_endcopy));

Modified: stable/8/sys/kern/kern_resource.c
==============================================================================
--- stable/8/sys/kern/kern_resource.c	Tue May 11 12:07:40 2010	(r207915)
+++ stable/8/sys/kern/kern_resource.c	Tue May 11 13:18:41 2010	(r207916)
@@ -76,6 +76,7 @@ static void	calcru1(struct proc *p, stru
 		    struct timeval *up, struct timeval *sp);
 static int	donice(struct thread *td, struct proc *chgp, int n);
 static struct uidinfo *uilookup(uid_t uid);
+static void	ruxagg(struct proc *p, struct thread *td);
 
 /*
  * Resource controls and accounting.
@@ -629,9 +630,7 @@ lim_cb(void *arg)
 		return;
 	PROC_SLOCK(p);
 	FOREACH_THREAD_IN_PROC(p, td) {
-		thread_lock(td);
-		ruxagg(&p->p_rux, td);
-		thread_unlock(td);
+		ruxagg(p, td);
 	}
 	PROC_SUNLOCK(p);
 	if (p->p_rux.rux_runtime > p->p_cpulimit * cpu_tickrate()) {
@@ -842,9 +841,7 @@ calcru(struct proc *p, struct timeval *u
 	FOREACH_THREAD_IN_PROC(p, td) {
 		if (td->td_incruntime == 0)
 			continue;
-		thread_lock(td);
-		ruxagg(&p->p_rux, td);
-		thread_unlock(td);
+		ruxagg(p, td);
 	}
 	calcru1(p, &p->p_rux, up, sp);
 }
@@ -945,10 +942,7 @@ getrusage(td, uap)
 }
 
 int
-kern_getrusage(td, who, rup)
-	struct thread *td;
-	int who;
-	struct rusage *rup;
+kern_getrusage(struct thread *td, int who, struct rusage *rup)
 {
 	struct proc *p;
 	int error;
@@ -967,6 +961,16 @@ kern_getrusage(td, who, rup)
 		calccru(p, &rup->ru_utime, &rup->ru_stime);
 		break;
 
+	case RUSAGE_THREAD:
+		PROC_SLOCK(p);
+		ruxagg(p, td);
+		PROC_SUNLOCK(p);
+		thread_lock(td);
+		*rup = td->td_ru;
+		calcru1(p, &td->td_rux, &rup->ru_utime, &rup->ru_stime);
+		thread_unlock(td);
+		break;
+
 	default:
 		error = EINVAL;
 	}
@@ -1007,7 +1011,7 @@ ruadd(struct rusage *ru, struct rusage_e
  * Aggregate tick counts into the proc's rusage_ext.
  */
 void
-ruxagg(struct rusage_ext *rux, struct thread *td)
+ruxagg_locked(struct rusage_ext *rux, struct thread *td)
 {
 
 	THREAD_LOCK_ASSERT(td, MA_OWNED);
@@ -1016,10 +1020,20 @@ ruxagg(struct rusage_ext *rux, struct th
 	rux->rux_uticks += td->td_uticks;
 	rux->rux_sticks += td->td_sticks;
 	rux->rux_iticks += td->td_iticks;
+}
+
+static void
+ruxagg(struct proc *p, struct thread *td)
+{
+
+	thread_lock(td);
+	ruxagg_locked(&p->p_rux, td);
+	ruxagg_locked(&td->td_rux, td);
 	td->td_incruntime = 0;
 	td->td_uticks = 0;
 	td->td_iticks = 0;
 	td->td_sticks = 0;
+	thread_unlock(td);
 }
 
 /*
@@ -1036,9 +1050,7 @@ rufetch(struct proc *p, struct rusage *r
 	*ru = p->p_ru;
 	if (p->p_numthreads > 0)  {
 		FOREACH_THREAD_IN_PROC(p, td) {
-			thread_lock(td);
-			ruxagg(&p->p_rux, td);
-			thread_unlock(td);
+			ruxagg(p, td);
 			rucollect(ru, &td->td_ru);
 		}
 	}

Modified: stable/8/sys/kern/kern_thr.c
==============================================================================
--- stable/8/sys/kern/kern_thr.c	Tue May 11 12:07:40 2010	(r207915)
+++ stable/8/sys/kern/kern_thr.c	Tue May 11 13:18:41 2010	(r207916)
@@ -199,6 +199,7 @@ create_thread(struct thread *td, mcontex
 
 	bzero(&newtd->td_startzero,
 	    __rangeof(struct thread, td_startzero, td_endzero));
+	bzero(&newtd->td_rux, sizeof(newtd->td_rux));
 	bcopy(&td->td_startcopy, &newtd->td_startcopy,
 	    __rangeof(struct thread, td_startcopy, td_endcopy));
 	newtd->td_proc = td->td_proc;

Modified: stable/8/sys/kern/kern_thread.c
==============================================================================
--- stable/8/sys/kern/kern_thread.c	Tue May 11 12:07:40 2010	(r207915)
+++ stable/8/sys/kern/kern_thread.c	Tue May 11 13:18:41 2010	(r207916)
@@ -432,7 +432,7 @@ thread_exit(void)
 	PROC_UNLOCK(p);
 	thread_lock(td);
 	/* Save our tick information with both the thread and proc locked */
-	ruxagg(&p->p_rux, td);
+	ruxagg_locked(&p->p_rux, td);
 	PROC_SUNLOCK(p);
 	td->td_state = TDS_INACTIVE;
 #ifdef WITNESS

Modified: stable/8/sys/sys/proc.h
==============================================================================
--- stable/8/sys/sys/proc.h	Tue May 11 12:07:40 2010	(r207915)
+++ stable/8/sys/sys/proc.h	Tue May 11 13:18:41 2010	(r207916)
@@ -239,7 +239,7 @@ struct thread {
 	u_int		td_estcpu;	/* (t) estimated cpu utilization */
 	int		td_slptick;	/* (t) Time at sleep. */
 	int		td_blktick;	/* (t) Time spent blocked. */
-	struct rusage	td_ru;		/* (t) rusage information */
+	struct rusage	td_ru;		/* (t) rusage information. */
 	uint64_t	td_incruntime;	/* (t) Cpu ticks to transfer to proc. */
 	uint64_t	td_runtime;	/* (t) How many cpu ticks we've run. */
 	u_int 		td_pticks;	/* (t) Statclock hits for profiling */
@@ -302,6 +302,7 @@ struct thread {
 	int		td_errno;	/* Error returned by last syscall. */
 	struct vnet	*td_vnet;	/* (k) Effective vnet. */
 	const char	*td_vnet_lpush;	/* (k) Debugging vnet push / pop. */
+	struct rusage_ext td_rux;	/* (t) Internal rusage information. */
 };
 
 struct mtx *thread_lock_block(struct thread *);

Modified: stable/8/sys/sys/resource.h
==============================================================================
--- stable/8/sys/sys/resource.h	Tue May 11 12:07:40 2010	(r207915)
+++ stable/8/sys/sys/resource.h	Tue May 11 13:18:41 2010	(r207916)
@@ -56,6 +56,7 @@
 
 #define	RUSAGE_SELF	0
 #define	RUSAGE_CHILDREN	-1
+#define	RUSAGE_THREAD	1
 
 struct rusage {
 	struct timeval ru_utime;	/* user time used */

Modified: stable/8/sys/sys/resourcevar.h
==============================================================================
--- stable/8/sys/sys/resourcevar.h	Tue May 11 12:07:40 2010	(r207915)
+++ stable/8/sys/sys/resourcevar.h	Tue May 11 13:18:41 2010	(r207916)
@@ -131,7 +131,7 @@ void	 rucollect(struct rusage *ru, struc
 void	 rufetch(struct proc *p, struct rusage *ru);
 void	 rufetchcalc(struct proc *p, struct rusage *ru, struct timeval *up,
 	    struct timeval *sp);
-void	 ruxagg(struct rusage_ext *rux, struct thread *td);
+void	 ruxagg_locked(struct rusage_ext *rux, struct thread *td);
 int	 suswintr(void *base, int word);
 struct uidinfo
 	*uifind(uid_t uid);


More information about the svn-src-stable-8 mailing list