]> git.hungrycats.org Git - linux/commitdiff
Add irq and softirq time accounting to the kernel
authorDoug Ledford <dledford@compaq.xsintricity.com>
Sun, 17 Aug 2003 09:27:07 +0000 (05:27 -0400)
committerDoug Ledford <dledford@compaq.xsintricity.com>
Sun, 17 Aug 2003 09:27:07 +0000 (05:27 -0400)
fs/proc/proc_misc.c
include/linux/kernel_stat.h
kernel/sched.c

index 4ceb4a90a6f2595f96e29d61827c7bef489e7a0d..23a295cf2269cd227ef1b40f8f6a497830cb69be 100644 (file)
@@ -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);
 
index f2449476b08826235a0db401954ebe862cf1cea1..17a9656a31fb86d8a08326b7f6157560bb2afa91 100644 (file)
@@ -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;
 };
index b926c8cd42aedd19183bc99f37fc1532e03a3f84..422de31370b5e80ba96e84fdfdbb05f7bb3e0f27 100644 (file)
@@ -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;