Date: Wed, 16 Aug 2006 08:40:28 GMT From: Chris Jones <cdjones@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 104192 for review Message-ID: <200608160840.k7G8eSsY033211@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=104192 Change 104192 by cdjones@cdjones-impulse on 2006/08/16 08:39:53 Keep track of CPU usage per jail. NOTE: this crashes hard in schedcpu. Affected files ... .. //depot/projects/soc2006/cdjones_jail/src/sys/kern/sched_hier.c#10 edit .. //depot/projects/soc2006/cdjones_jail/src/sys/sys/jail.h#17 edit Differences ... ==== //depot/projects/soc2006/cdjones_jail/src/sys/kern/sched_hier.c#10 (text+ko) ==== @@ -178,6 +178,8 @@ #endif static uint32_t total_jail_sched_shares; +extern struct mtx allprison_mtx; +extern int prisoncount; static struct kproc_desc sched_kp = { "schedcpu", @@ -438,9 +440,22 @@ struct proc *p; struct kse *ke; struct ksegrp *kg; + struct prison *pr; int awake, realstathz; realstathz = stathz ? stathz : hz; + /* + * Need to acquire each jail's mutex and hold throughout to keep + * everything out while we recalculate per-jail CPU usage. + * TODO: this is excessively icky. + */ + mtx_lock(&allprison_mtx); + if (prisoncount) { + LIST_FOREACH(pr, &allprison, pr_list) { + mtx_lock(&pr->pr_mtx); + pr->pr_estcpu = 0; + } + } sx_slock(&allproc_lock); FOREACH_PROC_IN_SYSTEM(p) { /* @@ -526,6 +541,7 @@ if (kg->kg_slptime > 1) continue; kg->kg_estcpu = decay_cpu(loadfac, kg->kg_estcpu); + kg->kg_proc->p_ucred->cr_prison->pr_estcpu += kg->kg_estcpu; resetpriority(kg); FOREACH_THREAD_IN_GROUP(kg, td) { resetpriority_thread(td, kg); @@ -534,6 +550,12 @@ mtx_unlock_spin(&sched_lock); } /* end of process loop */ sx_sunlock(&allproc_lock); + if (prisoncount) { + LIST_FOREACH(pr, &allprison, pr_list) { + mtx_unlock(&pr->pr_mtx); + } + } + mtx_unlock(&allprison_mtx); } /* @@ -545,6 +567,7 @@ int nowake; struct prison *pr; u_int32_t nShares = 0; + u_int nCpu = 0; for (;;) { /* @@ -558,11 +581,13 @@ * doing it every second. */ nShares = 0; + nCpu = 0; LIST_FOREACH(pr, &allprison, pr_list) { - printf("schedcpu_thread: prison %p\n", &pr); - nShares += pr->pr_sched_shares; + printf("schedcpu_thread: prison %p\n", &pr); + nShares += pr->pr_sched_shares; + nCpu += pr->pr_estcpu; } - printf("schedcpu_thread: %d CPU shares total\n", nShares); + printf("schedcpu_thread: %d CPU shares total, %d CPU est. usage\n", nShares, nCpu); total_jail_sched_shares = nShares; schedcpu(); @@ -616,11 +641,13 @@ * soft limits available. Also, the amount of CPU time * reserved to unjailed processes really should be sysctl'd. */ - printf("resetpriority: reset KSE %p priority\n", &kg); + register unsigned int np = newpriority; newpriority *= pr->pr_sched_shares; KASSERT(0 != total_jail_sched_shares, "no jail sched shares when a jail exists?!"); newpriority /= 2*total_jail_sched_shares; + printf("resetpriority: reset KSE %p from %d to %d\n", + &kg, np, newpriority); } newpriority = min(max(newpriority, PRI_MIN_TIMESHARE), PRI_MAX_TIMESHARE); ==== //depot/projects/soc2006/cdjones_jail/src/sys/sys/jail.h#17 (text+ko) ==== @@ -100,6 +100,7 @@ struct task pr_task; /* (d) destroy task */ struct mtx pr_mtx; u_int32_t pr_sched_shares; /* (p) jail priority */ + u_int pr_estcpu; /* (p) est. cpu of jail */ struct proc *pr_scheduler; /* (c) scheduler pid */ int *pr_scheduler_flags_ptr; /* (p) communication to scheduler */ struct proc *pr_pager; /* (c) pager pid */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200608160840.k7G8eSsY033211>