socsvn commit: r236685 - in soc2012/rudot: aux sys/kern
rudot at FreeBSD.org
rudot at FreeBSD.org
Tue May 29 20:51:22 UTC 2012
Author: rudot
Date: Tue May 29 20:51:19 2012
New Revision: 236685
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=236685
Log:
set the pcpu racct resource in the racctd while enumerating all procs. Thus also processes that start sleeping for a longer time have their pcpu resource updated.
Added:
soc2012/rudot/aux/list_changes.sh (contents, props changed)
Modified:
soc2012/rudot/sys/kern/kern_racct.c
soc2012/rudot/sys/kern/sched_4bsd.c
Added: soc2012/rudot/aux/list_changes.sh
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2012/rudot/aux/list_changes.sh Tue May 29 20:51:19 2012 (r236685)
@@ -0,0 +1,40 @@
+usage()
+{
+ echo "Usage: $0 [-v] [-w]"
+}
+
+VERBOSE=
+WRITE=
+
+while getopts "vw" OPTION
+do
+ case $OPTION in
+ v)
+ VERBOSE=1
+ ;;
+ w)
+ WRITE=1
+ ;;
+ ?)
+ usage
+ exit
+ ;;
+ esac
+done
+
+FILES=`find ../sys -name "*.[ch]"`
+
+for file in $FILES
+do
+ tree_file=/usr/src/${file#*/}
+ if [ -n "$WRITE" ]; then
+ if ! diff -q $file $tree_file > /dev/null; then
+ echo "Copying $tree_file to $file"
+ cp "$tree_file" "$file"
+ fi
+ elif [ -z "$VERBOSE" ]; then
+ diff -q "$file" "$tree_file"
+ else
+ diff -u "$file" "$tree_file"
+ fi
+done
Modified: soc2012/rudot/sys/kern/kern_racct.c
==============================================================================
--- soc2012/rudot/sys/kern/kern_racct.c Tue May 29 19:55:07 2012 (r236684)
+++ soc2012/rudot/sys/kern/kern_racct.c Tue May 29 20:51:19 2012 (r236685)
@@ -413,8 +413,8 @@
return (error);
}
-void
-racct_set_force(struct proc *p, int resource, uint64_t amount)
+static void
+racct_set_force_locked(struct proc *p, int resource, uint64_t amount)
{
int64_t diff;
@@ -425,13 +425,19 @@
*/
PROC_LOCK_ASSERT(p, MA_OWNED);
- mtx_lock(&racct_lock);
diff = amount - p->p_racct->r_resources[resource];
racct_alloc_resource(p->p_racct, resource, diff);
if (diff > 0)
racct_add_cred_locked(p->p_ucred, resource, diff);
else if (diff < 0)
racct_sub_cred_locked(p->p_ucred, resource, -diff);
+}
+
+void
+racct_set_force(struct proc *p, int resource, uint64_t amount)
+{
+ mtx_lock(&racct_lock);
+ racct_set_force_locked(p, resource, amount);
mtx_unlock(&racct_lock);
}
@@ -696,6 +702,8 @@
struct proc *p;
struct timeval wallclock;
uint64_t runtime;
+ fixpt_t pctcpu;
+ int pct_human;
for (;;) {
sx_slock(&allproc_lock);
@@ -706,10 +714,15 @@
microuptime(&wallclock);
timevalsub(&wallclock, &p->p_stats->p_start);
+ pctcpu = 0;
PROC_LOCK(p);
PROC_SLOCK(p);
- FOREACH_THREAD_IN_PROC(p, td)
+ FOREACH_THREAD_IN_PROC(p, td) {
ruxagg(p, td);
+ thread_lock(td);
+ pctcpu += sched_pctcpu(td);
+ thread_unlock(td);
+ }
runtime = cputick2usec(p->p_rux.rux_runtime);
PROC_SUNLOCK(p);
#ifdef notyet
@@ -720,7 +733,14 @@
runtime = p->p_prev_runtime;
#endif
p->p_prev_runtime = runtime;
+ pct_human = (100 * pctcpu) / FSCALE;
mtx_lock(&racct_lock);
+ /*
+ * I use _force_ here because we always want to have
+ * the real value in the RACCT_PCTCPU resource
+ * regardless of the limits set.
+ */
+ racct_set_force_locked(p, RACCT_PCTCPU, pct_human);
racct_set_locked(p, RACCT_CPU, runtime);
racct_set_locked(p, RACCT_WALLCLOCK,
(uint64_t)wallclock.tv_sec * 1000000 +
Modified: soc2012/rudot/sys/kern/sched_4bsd.c
==============================================================================
--- soc2012/rudot/sys/kern/sched_4bsd.c Tue May 29 19:55:07 2012 (r236684)
+++ soc2012/rudot/sys/kern/sched_4bsd.c Tue May 29 20:51:19 2012 (r236685)
@@ -694,7 +694,6 @@
struct pcpuidlestat *stat;
struct td_sched *ts;
#ifdef RACCT
- int error;
int pct_human;
fixpt_t pctcpu;
struct thread *tdp;
@@ -732,9 +731,8 @@
thread_unlock(tdp);
}
pct_human = (100 * pctcpu) / FSCALE;
- error = racct_set(td->td_proc, RACCT_PCTCPU, pct_human);
- if ((error != 0) ||
- (pct_human >= racct_get_limit(td->td_proc, RACCT_PCTCPU))) {
+ racct_set_force(td->td_proc, RACCT_PCTCPU, pct_human);
+ if (pct_human >= racct_get_limit(td->td_proc, RACCT_PCTCPU)) {
pause("racct", hz);
}
#endif
More information about the svn-soc-all
mailing list