From owner-p4-projects@FreeBSD.ORG Wed Aug 16 08:40:32 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 705A416A4E9; Wed, 16 Aug 2006 08:40:32 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 15FC416A4E7 for ; Wed, 16 Aug 2006 08:40:32 +0000 (UTC) (envelope-from cdjones@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 40F5C43D70 for ; Wed, 16 Aug 2006 08:40:29 +0000 (GMT) (envelope-from cdjones@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k7G8eTJN033214 for ; Wed, 16 Aug 2006 08:40:29 GMT (envelope-from cdjones@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k7G8eSsY033211 for perforce@freebsd.org; Wed, 16 Aug 2006 08:40:28 GMT (envelope-from cdjones@FreeBSD.org) Date: Wed, 16 Aug 2006 08:40:28 GMT Message-Id: <200608160840.k7G8eSsY033211@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to cdjones@FreeBSD.org using -f From: Chris Jones To: Perforce Change Reviews Cc: Subject: PERFORCE change 104192 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 16 Aug 2006 08:40:32 -0000 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 */