@@ -26,6 +26,8 @@ struct cpuacct_usage {
26
26
struct prev_cputime prev_cputime2 ; /* user and nice */
27
27
struct prev_cputime prev_cputime3 ; /* sys and irq + softirq */
28
28
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 */
29
31
} ____cacheline_aligned ;
30
32
31
33
#ifdef CONFIG_SCHED_SLI
@@ -411,6 +413,8 @@ static void cpuacct_init(struct cpuacct *ca)
411
413
prev_cputime_init (& per_cpu_ptr (ca -> cpuusage , i )-> prev_cputime2 );
412
414
prev_cputime_init (& per_cpu_ptr (ca -> cpuusage , i )-> prev_cputime3 );
413
415
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 );
414
418
}
415
419
416
420
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,
960
964
struct cpuacct_usage * cpuusage ;
961
965
struct task_cputime cputime ;
962
966
u64 tick_user , tick_nice , tick_sys , tick_irq , tick_softirq ;
967
+ u64 tick_guest , tick_guest_nice ;
963
968
u64 left , right , left2 , right2 ;
964
969
struct sched_entity * se ;
965
970
@@ -976,6 +981,8 @@ static void __cpuacct_get_usage_result(struct cpuacct *ca, int cpu,
976
981
tick_sys = kcpustat -> cpustat [CPUTIME_SYSTEM ];
977
982
tick_irq = kcpustat -> cpustat [CPUTIME_IRQ ];
978
983
tick_softirq = kcpustat -> cpustat [CPUTIME_SOFTIRQ ];
984
+ tick_guest = kcpustat -> cpustat [CPUTIME_GUEST ];
985
+ tick_guest_nice = kcpustat -> cpustat [CPUTIME_GUEST_NICE ];
979
986
980
987
/* Calculate system run time */
981
988
cputime .sum_exec_runtime = cpuusage -> usages [CPUACCT_STAT_USER ] +
@@ -1007,6 +1014,20 @@ static void __cpuacct_get_usage_result(struct cpuacct *ca, int cpu,
1007
1014
res -> irq = left ;
1008
1015
res -> softirq = right ;
1009
1016
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
+
1010
1031
if (se && schedstat_enabled ()) {
1011
1032
unsigned int seq ;
1012
1033
unsigned long flags ;
@@ -1045,8 +1066,6 @@ static void __cpuacct_get_usage_result(struct cpuacct *ca, int cpu,
1045
1066
} else {
1046
1067
res -> idle = res -> iowait = res -> steal = 0 ;
1047
1068
}
1048
- res -> guest = kcpustat -> cpustat [CPUTIME_GUEST ];
1049
- res -> guest_nice = kcpustat -> cpustat [CPUTIME_GUEST_NICE ];
1050
1069
}
1051
1070
1052
1071
static int cpuacct_proc_stats_show (struct seq_file * sf , void * v )
0 commit comments