From owner-svn-soc-all@FreeBSD.ORG Fri Jun 8 15:09:33 2012 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from socsvn.FreeBSD.org (unknown [IPv6:2001:4f8:fff6::2f]) by hub.freebsd.org (Postfix) with SMTP id 4FEF91065670 for ; Fri, 8 Jun 2012 15:09:31 +0000 (UTC) (envelope-from rudot@FreeBSD.org) Received: by socsvn.FreeBSD.org (sSMTP sendmail emulation); Fri, 08 Jun 2012 15:09:31 +0000 Date: Fri, 08 Jun 2012 15:09:31 +0000 From: rudot@FreeBSD.org To: svn-soc-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-Id: <20120608150931.4FEF91065670@hub.freebsd.org> Cc: Subject: socsvn commit: r237311 - soc2012/rudot/sys/kern X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 08 Jun 2012 15:09:33 -0000 Author: rudot Date: Fri Jun 8 15:09:30 2012 New Revision: 237311 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=237311 Log: more precise %cpu accounting - use also data for the yet unfinished second Modified: soc2012/rudot/sys/kern/kern_racct.c soc2012/rudot/sys/kern/sched_4bsd.c Modified: soc2012/rudot/sys/kern/kern_racct.c ============================================================================== --- soc2012/rudot/sys/kern/kern_racct.c Fri Jun 8 14:43:46 2012 (r237310) +++ soc2012/rudot/sys/kern/kern_racct.c Fri Jun 8 15:09:30 2012 (r237311) @@ -55,6 +55,7 @@ #include #include #include +#include #ifdef RCTL #include @@ -272,25 +273,29 @@ racct_getpcpu(struct proc *p) { u_int swtime; - fixpt_t pctcpu; + fixpt_t p_pctcpu, pctcpu, pctcpu_next; struct thread *td; swtime = (ticks - p->p_swtick) / hz; if ((swtime == 0) || ((p->p_flag & P_INMEM) == 0)) return (0); - pctcpu = 0; + p_pctcpu = 0; FOREACH_THREAD_IN_PROC(p, td) { thread_lock(td); - pctcpu += sched_pctcpu(td); + pctcpu = sched_pctcpu(td); + /* Count also the yet unfinished second. */ + pctcpu_next = (pctcpu * ccpu_exp[1]) >> FSHIFT; + pctcpu_next += sched_pctcpu_delta(td); + p_pctcpu += max(pctcpu, pctcpu_next); thread_unlock(td); } if (swtime <= CCPU_EXP_MAX) { - return ((100 * pctcpu) / (FSCALE - ccpu_exp[swtime])); + return ((100 * p_pctcpu) / (FSCALE - ccpu_exp[swtime])); } - return ((100 * pctcpu) / FSCALE); + return ((100 * p_pctcpu) / FSCALE); } static void Modified: soc2012/rudot/sys/kern/sched_4bsd.c ============================================================================== --- soc2012/rudot/sys/kern/sched_4bsd.c Fri Jun 8 14:43:46 2012 (r237310) +++ soc2012/rudot/sys/kern/sched_4bsd.c Fri Jun 8 15:09:30 2012 (r237311) @@ -1545,6 +1545,34 @@ return (ts->ts_pctcpu); } +fixpt_t +sched_pctcpu_delta(struct thread *td) +{ + struct td_sched *ts; + fixpt_t delta; + int realstathz; + + THREAD_LOCK_ASSERT(td, MA_OWNED); + ts = td->td_sched; + delta = 0; + realstathz = stathz ? stathz : hz; + if (ts->ts_cpticks != 0) { +#if (FSHIFT >= CCPU_SHIFT) + delta = (realstathz == 100) + ? ((fixpt_t) ts->ts_cpticks) << + (FSHIFT - CCPU_SHIFT) : + 100 * (((fixpt_t) ts->ts_cpticks) + << (FSHIFT - CCPU_SHIFT)) / realstathz; +#else + delta = ((FSCALE - ccpu) * + (ts->ts_cpticks * + FSCALE / realstathz)) >> FSHIFT; +#endif + } + + return (delta); +} + void sched_tick(int cnt) {