diff options
author | trasz <trasz@FreeBSD.org> | 2012-10-26 16:01:08 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2012-10-26 16:01:08 +0000 |
commit | d97338334a7696793856e52982abcf531ba728cf (patch) | |
tree | 842a8cfc3ef8239e42a28dbb369918bc9a00b13e /sys/kern/sched_4bsd.c | |
parent | 5f08f2efa84de1e44eed353961807024d5b221aa (diff) | |
download | FreeBSD-src-d97338334a7696793856e52982abcf531ba728cf.zip FreeBSD-src-d97338334a7696793856e52982abcf531ba728cf.tar.gz |
Add CPU percentage limit enforcement to RCTL. The resouce name is "pcpu".
It was implemented by Rudolf Tomori during Google Summer of Code 2012.
Diffstat (limited to 'sys/kern/sched_4bsd.c')
-rw-r--r-- | sys/kern/sched_4bsd.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c index 7aaf37c..d1595c7 100644 --- a/sys/kern/sched_4bsd.c +++ b/sys/kern/sched_4bsd.c @@ -1585,6 +1585,40 @@ sched_pctcpu(struct thread *td) return (ts->ts_pctcpu); } +#ifdef RACCT +/* + * Calculates the contribution to the thread cpu usage for the latest + * (unfinished) second. + */ +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); +} +#endif + void sched_tick(int cnt) { |