@@ -26,6 +26,8 @@ struct cpuacct_usage {
2626 struct prev_cputime prev_cputime2 ; /* user and nice */
2727 struct prev_cputime prev_cputime3 ; /* sys and irq + softirq */
2828 struct prev_cputime prev_cputime4 ; /* irq and softirq */
29+ struct prev_cputime prev_cputime5 ; /* (user - guest) and guest */
30+ struct prev_cputime prev_cputime6 ; /* (nice - guest_nice) and guest_nice */
2931} ____cacheline_aligned ;
3032
3133#ifdef CONFIG_SCHED_SLI
@@ -411,6 +413,8 @@ static void cpuacct_init(struct cpuacct *ca)
411413 prev_cputime_init (& per_cpu_ptr (ca -> cpuusage , i )-> prev_cputime2 );
412414 prev_cputime_init (& per_cpu_ptr (ca -> cpuusage , i )-> prev_cputime3 );
413415 prev_cputime_init (& per_cpu_ptr (ca -> cpuusage , i )-> prev_cputime4 );
416+ prev_cputime_init (& per_cpu_ptr (ca -> cpuusage , i )-> prev_cputime5 );
417+ prev_cputime_init (& per_cpu_ptr (ca -> cpuusage , i )-> prev_cputime6 );
414418 }
415419
416420 ca -> avenrun [0 ] = ca -> avenrun [1 ] = ca -> avenrun [2 ] = 0 ;
@@ -960,6 +964,7 @@ static void __cpuacct_get_usage_result(struct cpuacct *ca, int cpu,
960964 struct cpuacct_usage * cpuusage ;
961965 struct task_cputime cputime ;
962966 u64 tick_user , tick_nice , tick_sys , tick_irq , tick_softirq ;
967+ u64 tick_guest , tick_guest_nice ;
963968 u64 left , right , left2 , right2 ;
964969 struct sched_entity * se ;
965970
@@ -976,6 +981,8 @@ static void __cpuacct_get_usage_result(struct cpuacct *ca, int cpu,
976981 tick_sys = kcpustat -> cpustat [CPUTIME_SYSTEM ];
977982 tick_irq = kcpustat -> cpustat [CPUTIME_IRQ ];
978983 tick_softirq = kcpustat -> cpustat [CPUTIME_SOFTIRQ ];
984+ tick_guest = kcpustat -> cpustat [CPUTIME_GUEST ];
985+ tick_guest_nice = kcpustat -> cpustat [CPUTIME_GUEST_NICE ];
979986
980987 /* Calculate system run time */
981988 cputime .sum_exec_runtime = cpuusage -> usages [CPUACCT_STAT_USER ] +
@@ -1007,6 +1014,20 @@ static void __cpuacct_get_usage_result(struct cpuacct *ca, int cpu,
10071014 res -> irq = left ;
10081015 res -> softirq = right ;
10091016
1017+ /* Calculate (user - guest) and guest run time */
1018+ cputime .sum_exec_runtime = res -> user ; /* user */
1019+ cputime .utime = tick_user - tick_guest ;
1020+ cputime .stime = tick_guest ;
1021+ cputime_adjust (& cputime , & cpuusage -> prev_cputime5 , & left , & right );
1022+ res -> guest = right ;
1023+
1024+ /* Calculate (nice - guest_nice) and guest_nice run time */
1025+ cputime .sum_exec_runtime = res -> nice ; /* nice */
1026+ cputime .utime = tick_nice - tick_guest_nice ;
1027+ cputime .stime = tick_guest_nice ;
1028+ cputime_adjust (& cputime , & cpuusage -> prev_cputime6 , & left , & right );
1029+ res -> guest_nice = right ;
1030+
10101031 if (se && schedstat_enabled ()) {
10111032 unsigned int seq ;
10121033 unsigned long flags ;
@@ -1045,8 +1066,6 @@ static void __cpuacct_get_usage_result(struct cpuacct *ca, int cpu,
10451066 } else {
10461067 res -> idle = res -> iowait = res -> steal = 0 ;
10471068 }
1048- res -> guest = kcpustat -> cpustat [CPUTIME_GUEST ];
1049- res -> guest_nice = kcpustat -> cpustat [CPUTIME_GUEST_NICE ];
10501069}
10511070
10521071static int cpuacct_proc_stats_show (struct seq_file * sf , void * v )
0 commit comments