I am not comfortable about putting the calculation in the same function
as the load average calculation, but I didn't want to call
count_active_tasks() twice. Comments are welcome.
Lev
--------------------------------------------------------------------------
diff -urN linux-2.5.35.orig/fs/proc/proc_misc.c
linux-2.5.35/fs/proc/proc_misc.c
--- linux-2.5.35.orig/fs/proc/proc_misc.c Sun Sep 15 22:18:21 2002
+++ linux-2.5.35/fs/proc/proc_misc.c Mon Sep 16 13:36:14 2002
@@ -386,7 +386,8 @@
"allocstall %u\n"
"ctxt %lu\n"
"btime %lu\n"
- "processes %lu\n",
+ "processes %lu\n"
+ "runque %u %u\n",
kstat.pgalloc,
kstat.pgfree,
kstat.pgactivate,
@@ -399,7 +400,9 @@
kstat.allocstall,
nr_context_switches(),
xtime.tv_sec - jif / HZ,
- total_forks);
+ total_forks,
+ kstat.runque,
+ kstat.runocc);
return proc_calc_metrics(page, start, off, count, eof, len);
}
diff -urN linux-2.5.35.orig/include/linux/kernel_stat.h
linux-2.5.35/include/linux/kernel_stat.h
--- linux-2.5.35.orig/include/linux/kernel_stat.h Sun Sep 15 22:18:27 2002
+++ linux-2.5.35/include/linux/kernel_stat.h Mon Sep 16 13:35:30 2002
@@ -31,6 +31,7 @@
unsigned int pgfault, pgmajfault;
unsigned int pgscan, pgsteal;
unsigned int pageoutrun, allocstall;
+ unsigned int runque, runocc;
#if !defined(CONFIG_ARCH_S390)
unsigned int irqs[NR_CPUS][NR_IRQS];
#endif
diff -urN linux-2.5.35.orig/kernel/timer.c linux-2.5.35/kernel/timer.c
--- linux-2.5.35.orig/kernel/timer.c Sun Sep 15 22:18:24 2002
+++ linux-2.5.35/kernel/timer.c Mon Sep 16 13:36:31 2002
@@ -592,11 +592,11 @@
}
/*
- * Nr of active tasks - counted in fixed-point numbers
+ * Nr of active tasks
*/
static unsigned long count_active_tasks(void)
{
- return (nr_running() + nr_uninterruptible()) * FIXED_1;
+ return nr_running() + nr_uninterruptible();
}
/*
@@ -615,16 +615,29 @@
*/
static inline void calc_load(unsigned long ticks)
{
- unsigned long active_tasks; /* fixed-point */
- static int count = LOAD_FREQ;
+ unsigned long active_tasks;
+ unsigned long fp_active_tasks; /* fixed-point */
+ static int load_count = LOAD_FREQ;
+ static int runq_count = HZ;
- count -= ticks;
- if (count < 0) {
- count += LOAD_FREQ;
+ load_count -= ticks;
+ runq_count -= ticks;
+ if (load_count < 0 || runq_count < 0) {
active_tasks = count_active_tasks();
- CALC_LOAD(avenrun[0], EXP_1, active_tasks);
- CALC_LOAD(avenrun[1], EXP_5, active_tasks);
- CALC_LOAD(avenrun[2], EXP_15, active_tasks);
+ if (runq_count < 0) {
+ runq_count += HZ;
+ if (active_tasks) {
+ kstat.runque += active_tasks;
+ kstat.runocc ++;
+ }
+ }
+ if (load_count < 0) {
+ load_count += LOAD_FREQ;
+ fp_active_tasks = active_tasks * FIXED_1;
+ CALC_LOAD(avenrun[0], EXP_1, fp_active_tasks);
+ CALC_LOAD(avenrun[1], EXP_5, fp_active_tasks);
+ CALC_LOAD(avenrun[2], EXP_15, fp_active_tasks);
+ }
}
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/