From patchwork Thu Oct 22 15:36:38 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Ryota Ozaki X-Patchwork-Id: 55384 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n9MFbJoP006791 for ; Thu, 22 Oct 2009 15:37:20 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756523AbZJVPgg (ORCPT ); Thu, 22 Oct 2009 11:36:36 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1756508AbZJVPgg (ORCPT ); Thu, 22 Oct 2009 11:36:36 -0400 Received: from mail-qy0-f194.google.com ([209.85.221.194]:34015 "EHLO mail-qy0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756261AbZJVPge (ORCPT ); Thu, 22 Oct 2009 11:36:34 -0400 Received: by qyk32 with SMTP id 32so5336476qyk.4 for ; Thu, 22 Oct 2009 08:36:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type; bh=Lki6zrTIHS6DWYo2N84cahtYgeQIAaLFPGKdflfeNgw=; b=nBv8ju1S3OwtnCqyTWXq1qXKzS9/sPEniN0JvtkdcaL8eDJ4YIoV03qc3EKQHzcwj1 arzbbuT+Xv1snEx24WxkIjZmlRpA54w0AT0G44K2f56xwEuJk8/dYnazVtWjm/J1kCAc hGnwz8pF4Udfkho5DoOag8KuGo1wkfi7pLxPI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=N/qi/RYssPvYyFRjIhJJF2vGOW6eTmIdogZVGlQ1kLQN/+afV+M5uusrFk1f7ZVATp oEm8O+kxAzwReWXkNSqj/nS3C2ZE9c9lpeLVbq+CokPN3IRnI6SWumz0OK8qbLeLDUTi WeWmh4PQAaCOIh1ytu7e+yR0pl5LHpX9cNv9U= MIME-Version: 1.0 Received: by 10.216.90.208 with SMTP id e58mr3472783wef.57.1256225798617; Thu, 22 Oct 2009 08:36:38 -0700 (PDT) In-Reply-To: <5e93dcec0910220512x50788f59u56e6493778093c7@mail.gmail.com> References: <5e93dcec0910200800q2e156fd3v324632efcf136f5e@mail.gmail.com> <4AE02A1B.6020700@redhat.com> <5e93dcec0910220512x50788f59u56e6493778093c7@mail.gmail.com> Date: Fri, 23 Oct 2009 00:36:38 +0900 Message-ID: <5e93dcec0910220836x7f798d45w299129e0c80ed5d1@mail.gmail.com> Subject: [PATCH -tip] sched, cpuacct: fix niced guest time accounting From: Ryota Ozaki To: Linux Kernel Mailing List Cc: Ingo Molnar , Avi Kivity , KVM ML , Ryota OZAKI Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index 2c48f94..4af0018 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt @@ -1072,7 +1072,8 @@ second). The meanings of the columns are as follows, from left to right: - irq: servicing interrupts - softirq: servicing softirqs - steal: involuntary wait -- guest: running a guest +- guest: running a normal guest +- guest_nice: running a niced guest The "intr" line gives counts of interrupts serviced since boot time, for each of the possible system interrupts. The first column is the total of all diff --git a/fs/proc/stat.c b/fs/proc/stat.c index 7cc726c..67c30a7 100644 --- a/fs/proc/stat.c +++ b/fs/proc/stat.c @@ -27,7 +27,7 @@ static int show_stat(struct seq_file *p, void *v) int i, j; unsigned long jif; cputime64_t user, nice, system, idle, iowait, irq, softirq, steal; - cputime64_t guest; + cputime64_t guest, guest_nice; u64 sum = 0; u64 sum_softirq = 0; unsigned int per_softirq_sums[NR_SOFTIRQS] = {0}; @@ -36,7 +36,7 @@ static int show_stat(struct seq_file *p, void *v) user = nice = system = idle = iowait = irq = softirq = steal = cputime64_zero; - guest = cputime64_zero; + guest = guest_nice = cputime64_zero; getboottime(&boottime); jif = boottime.tv_sec; @@ -51,6 +51,8 @@ static int show_stat(struct seq_file *p, void *v) softirq = cputime64_add(softirq, kstat_cpu(i).cpustat.softirq); steal = cputime64_add(steal, kstat_cpu(i).cpustat.steal); guest = cputime64_add(guest, kstat_cpu(i).cpustat.guest); + guest_nice = cputime64_add(guest_nice, + kstat_cpu(i).cpustat.guest_nice); for_each_irq_nr(j) { sum += kstat_irqs_cpu(j, i); } @@ -65,7 +67,7 @@ static int show_stat(struct seq_file *p, void *v) } sum += arch_irq_stat(); - seq_printf(p, "cpu %llu %llu %llu %llu %llu %llu %llu %llu %llu¥n", + seq_printf(p, "cpu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu¥n", (unsigned long long)cputime64_to_clock_t(user), (unsigned long long)cputime64_to_clock_t(nice), (unsigned long long)cputime64_to_clock_t(system), @@ -74,7 +76,8 @@ static int show_stat(struct seq_file *p, void *v) (unsigned long long)cputime64_to_clock_t(irq), (unsigned long long)cputime64_to_clock_t(softirq), (unsigned long long)cputime64_to_clock_t(steal), - (unsigned long long)cputime64_to_clock_t(guest)); + (unsigned long long)cputime64_to_clock_t(guest), + (unsigned long long)cputime64_to_clock_t(guest_nice)); for_each_online_cpu(i) { /* Copy values here to work around gcc-2.95.3, gcc-2.96 */ @@ -88,8 +91,9 @@ static int show_stat(struct seq_file *p, void *v) softirq = kstat_cpu(i).cpustat.softirq; steal = kstat_cpu(i).cpustat.steal; guest = kstat_cpu(i).cpustat.guest; + guest_nice = kstat_cpu(i).cpustat.guest_nice; seq_printf(p, - "cpu%d %llu %llu %llu %llu %llu %llu %llu %llu %llu¥n", + "cpu%d %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu¥n", i, (unsigned long long)cputime64_to_clock_t(user), (unsigned long long)cputime64_to_clock_t(nice), @@ -99,7 +103,8 @@ static int show_stat(struct seq_file *p, void *v) (unsigned long long)cputime64_to_clock_t(irq), (unsigned long long)cputime64_to_clock_t(softirq), (unsigned long long)cputime64_to_clock_t(steal), - (unsigned long long)cputime64_to_clock_t(guest)); + (unsigned long long)cputime64_to_clock_t(guest), + (unsigned long long)cputime64_to_clock_t(guest_nice)); } seq_printf(p, "intr %llu", (unsigned long long)sum); diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h index 348fa88..c059044 100644 --- a/include/linux/kernel_stat.h +++ b/include/linux/kernel_stat.h @@ -25,6 +25,7 @@ struct cpu_usage_stat { cputime64_t iowait; cputime64_t steal; cputime64_t guest; + cputime64_t guest_nice; }; struct kernel_stat { diff --git a/kernel/sched.c b/kernel/sched.c index 00f9e71..8dd285e 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -5017,8 +5017,13 @@ static void account_guest_time(struct task_struct *p, cputime_t cputime, p->gtime = cputime_add(p->gtime, cputime); /* Add guest time to cpustat. */ - cpustat->user = cputime64_add(cpustat->user, tmp); - cpustat->guest = cputime64_add(cpustat->guest, tmp); + if (TASK_NICE(p) > 0) { + cpustat->nice = cputime64_add(cpustat->nice, tmp); + cpustat->guest_nice = cputime64_add(cpustat->guest_nice, tmp); + } else { + cpustat->user = cputime64_add(cpustat->user, tmp); + cpustat->guest = cputime64_add(cpustat->guest, tmp); + } }