summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Ledford <dledford@compaq.xsintricity.com>2003-08-17 05:27:07 -0400
committerDoug Ledford <dledford@compaq.xsintricity.com>2003-08-17 05:27:07 -0400
commit39d2edc443b18d72ad47e2d4aeae8ceebbfefcb1 (patch)
treed38ee2a433a1a776834f9529db6687f71f013a82
parenta1ad3d823549923ee72310496e463ed0081c0f6b (diff)
Add irq and softirq time accounting to the kernel
-rw-r--r--fs/proc/proc_misc.c16
-rw-r--r--include/linux/kernel_stat.h2
-rw-r--r--kernel/sched.c14
3 files changed, 23 insertions, 9 deletions
diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c
index 4ceb4a90a6f2..23a295cf2269 100644
--- a/fs/proc/proc_misc.c
+++ b/fs/proc/proc_misc.c
@@ -362,7 +362,7 @@ static int kstat_read_proc(char *page, char **start, off_t off,
int i, len;
extern unsigned long total_forks;
u64 jif;
- unsigned int sum = 0, user = 0, nice = 0, system = 0, idle = 0, iowait = 0;
+ unsigned int sum = 0, user = 0, nice = 0, system = 0, idle = 0, iowait = 0, irq = 0, softirq = 0;
struct timeval now;
unsigned long seq;
@@ -388,25 +388,31 @@ static int kstat_read_proc(char *page, char **start, off_t off,
system += kstat_cpu(i).cpustat.system;
idle += kstat_cpu(i).cpustat.idle;
iowait += kstat_cpu(i).cpustat.iowait;
+ irq += kstat_cpu(i).cpustat.irq;
+ softirq += kstat_cpu(i).cpustat.softirq;
for (j = 0 ; j < NR_IRQS ; j++)
sum += kstat_cpu(i).irqs[j];
}
- len = sprintf(page, "cpu %u %u %u %u %u\n",
+ len = sprintf(page, "cpu %u %u %u %u %u %u %u\n",
jiffies_to_clock_t(user),
jiffies_to_clock_t(nice),
jiffies_to_clock_t(system),
jiffies_to_clock_t(idle),
- jiffies_to_clock_t(iowait));
+ jiffies_to_clock_t(iowait),
+ jiffies_to_clock_t(irq),
+ jiffies_to_clock_t(softirq));
for (i = 0 ; i < NR_CPUS; i++){
if (!cpu_online(i)) continue;
- len += sprintf(page + len, "cpu%d %u %u %u %u %u\n",
+ len += sprintf(page + len, "cpu%d %u %u %u %u %u %u %u\n",
i,
jiffies_to_clock_t(kstat_cpu(i).cpustat.user),
jiffies_to_clock_t(kstat_cpu(i).cpustat.nice),
jiffies_to_clock_t(kstat_cpu(i).cpustat.system),
jiffies_to_clock_t(kstat_cpu(i).cpustat.idle),
- jiffies_to_clock_t(kstat_cpu(i).cpustat.iowait));
+ jiffies_to_clock_t(kstat_cpu(i).cpustat.iowait),
+ jiffies_to_clock_t(kstat_cpu(i).cpustat.irq),
+ jiffies_to_clock_t(kstat_cpu(i).cpustat.softirq));
}
len += sprintf(page + len, "intr %u", sum);
diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h
index f2449476b088..17a9656a31fb 100644
--- a/include/linux/kernel_stat.h
+++ b/include/linux/kernel_stat.h
@@ -17,6 +17,8 @@ struct cpu_usage_stat {
unsigned int user;
unsigned int nice;
unsigned int system;
+ unsigned int softirq;
+ unsigned int irq;
unsigned int idle;
unsigned int iowait;
};
diff --git a/kernel/sched.c b/kernel/sched.c
index b926c8cd42ae..422de31370b5 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -1201,11 +1201,17 @@ void scheduler_tick(int user_ticks, int sys_ticks)
if (rcu_pending(cpu))
rcu_check_callbacks(cpu, user_ticks);
+ /* note: this timer irq context must be accounted for as well */
+ if (hardirq_count() - HARDIRQ_OFFSET) {
+ cpustat->irq += sys_ticks;
+ sys_ticks = 0;
+ } else if (softirq_count()) {
+ cpustat->softirq += sys_ticks;
+ sys_ticks = 0;
+ }
+
if (p == rq->idle) {
- /* note: this timer irq context must be accounted for as well */
- if (irq_count() - HARDIRQ_OFFSET >= SOFTIRQ_OFFSET)
- cpustat->system += sys_ticks;
- else if (atomic_read(&rq->nr_iowait) > 0)
+ if (atomic_read(&rq->nr_iowait) > 0)
cpustat->iowait += sys_ticks;
else
cpustat->idle += sys_ticks;