PERFORCE change 181150 for review

Edward Tomasz Napierala trasz at FreeBSD.org
Sun Jul 18 19:20:18 UTC 2010


http://p4web.freebsd.org/@@181150?ac=10

Change 181150 by trasz at trasz_victim on 2010/07/18 19:19:38

	Fix CPU time accounting.  Previous version accounted only for processes
	with CPU time limit set.

Affected files ...

.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_resource.c#42 edit

Differences ...

==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_resource.c#42 (text+ko) ====

@@ -81,6 +81,10 @@
 static struct uidinfo *uilookup(uid_t uid);
 static void	ruxagg_locked(struct rusage_ext *rux, struct thread *td);
 
+#ifdef CONTAINERS
+struct callout rusage_cpu_callout;
+#endif
+
 /*
  * Resource controls and accounting.
  */
@@ -616,16 +620,33 @@
 	return (error);
 }
 
+#ifdef CONTAINERS
+static void
+rusage_cpu_update(void *arg)
+{
+	struct thread *td;
+	struct proc *p;
+
+	FOREACH_PROC_IN_SYSTEM(p) {
+		PROC_SLOCK(p);
+		FOREACH_THREAD_IN_PROC(p, td) {
+			ruxagg(p, td);
+		}
+		PROC_SUNLOCK(p);
+		rusage_set(p, RUSAGE_CPU, p->p_rux.rux_runtime / cpu_tickrate());
+	}
+
+	callout_reset(&rusage_cpu_callout, hz, rusage_cpu_update, NULL);
+}
+#endif
+
+#ifndef CONTAINERS
 static void
 lim_cb(void *arg)
 {
 	struct thread *td;
 	struct proc *p;
-#ifdef CONTAINERS
-	int error;
-#else
 	struct rlimit rlim;
-#endif
 
 	p = arg;
 	PROC_LOCK_ASSERT(p, MA_OWNED);
@@ -640,10 +661,6 @@
 		ruxagg(p, td);
 	}
 	PROC_SUNLOCK(p);
-#ifdef CONTAINERS
-	error = rusage_set(p, RUSAGE_CPU, p->p_rux.rux_runtime / cpu_tickrate());
-	KASSERT(error == 0, ("rusage_set(p, RUSAGE_CPU, ...) returned error"));
-#else
 	if (p->p_rux.rux_runtime > p->p_cpulimit * cpu_tickrate()) {
 		lim_rlimit(p, RLIMIT_CPU, &rlim);
 		if (p->p_rux.rux_runtime >= rlim.rlim_max * cpu_tickrate()) {
@@ -654,10 +671,10 @@
 			psignal(p, SIGXCPU);
 		}
 	}
-#endif
 	if ((p->p_flag & P_WEXIT) == 0)
 		callout_reset(&p->p_limco, hz, lim_cb, p);
 }
+#endif /* !CONTAINERS */
 
 #ifdef HRL
 static void
@@ -810,12 +827,14 @@
 
 	switch (which) {
 
+#ifndef CONTAINERS
 	case RLIMIT_CPU:
 		if (limp->rlim_cur != RLIM_INFINITY &&
 		    p->p_cpulimit == RLIM_INFINITY)
 			callout_reset(&p->p_limco, hz, lim_cb, p);
 		p->p_cpulimit = limp->rlim_cur;
 		break;
+#endif
 	case RLIMIT_DATA:
 		if (limp->rlim_cur > maxdsiz)
 			limp->rlim_cur = maxdsiz;
@@ -1224,8 +1243,10 @@
 {
 	p2->p_limit = lim_hold(p1->p_limit);
 	callout_init_mtx(&p2->p_limco, &p2->p_mtx, 0);
+#ifndef CONTAINERS
 	if (p1->p_cpulimit != RLIM_INFINITY)
 		callout_reset(&p2->p_limco, hz, lim_cb, p2);
+#endif
 }
 
 void
@@ -1304,6 +1325,15 @@
 
 	uihashtbl = hashinit(maxproc / 16, M_UIDINFO, &uihash);
 	rw_init(&uihashtbl_lock, "uidinfo hash");
+
+#ifdef CONTAINERS
+	/*
+	 * XXX: Piggybacked for now; in the future it should have
+	 *      it's own function.
+	 */
+	callout_init(&rusage_cpu_callout, 1);
+	callout_reset(&rusage_cpu_callout, hz, rusage_cpu_update, NULL);
+#endif
 }
 
 /*


More information about the p4-projects mailing list