diff options
author | Laszlo Ersek <lersek@redhat.com> | 2011-10-18 16:42:59 -0400 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2013-06-28 12:11:39 -0400 |
commit | 0b0c002c340e78173789f8afaa508070d838cf3d (patch) | |
tree | b1c81cd6ed7a3da85075ace0f525e3010825d2c6 /arch/x86/xen | |
parent | 283c0972d53769ee44750cad4c27e3f5fa26ec1f (diff) |
xen/time: remove blocked time accounting from xen "clockchip"
... because the "clock_event_device framework" already accounts for idle
time through the "event_handler" function pointer in
xen_timer_interrupt().
The patch is intended as the completion of [1]. It should fix the double
idle times seen in PV guests' /proc/stat [2]. It should be orthogonal to
stolen time accounting (the removed code seems to be isolated).
The approach may be completely misguided.
[1] https://lkml.org/lkml/2011/10/6/10
[2] http://lists.xensource.com/archives/html/xen-devel/2010-08/msg01068.html
John took the time to retest this patch on top of v3.10 and reported:
"idle time is correctly incremented for pv and hvm for the normal
case, nohz=off and nohz=idle." so lets put this patch in.
CC: stable@vger.kernel.org
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: John Haxby <john.haxby@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'arch/x86/xen')
-rw-r--r-- | arch/x86/xen/time.c | 17 |
1 files changed, 2 insertions, 15 deletions
diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index aec0b14b6d76..a690868be837 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c | |||
@@ -37,9 +37,8 @@ static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate); | |||
37 | /* snapshots of runstate info */ | 37 | /* snapshots of runstate info */ |
38 | static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate_snapshot); | 38 | static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate_snapshot); |
39 | 39 | ||
40 | /* unused ns of stolen and blocked time */ | 40 | /* unused ns of stolen time */ |
41 | static DEFINE_PER_CPU(u64, xen_residual_stolen); | 41 | static DEFINE_PER_CPU(u64, xen_residual_stolen); |
42 | static DEFINE_PER_CPU(u64, xen_residual_blocked); | ||
43 | 42 | ||
44 | /* return an consistent snapshot of 64-bit time/counter value */ | 43 | /* return an consistent snapshot of 64-bit time/counter value */ |
45 | static u64 get64(const u64 *p) | 44 | static u64 get64(const u64 *p) |
@@ -116,7 +115,7 @@ static void do_stolen_accounting(void) | |||
116 | { | 115 | { |
117 | struct vcpu_runstate_info state; | 116 | struct vcpu_runstate_info state; |
118 | struct vcpu_runstate_info *snap; | 117 | struct vcpu_runstate_info *snap; |
119 | s64 blocked, runnable, offline, stolen; | 118 | s64 runnable, offline, stolen; |
120 | cputime_t ticks; | 119 | cputime_t ticks; |
121 | 120 | ||
122 | get_runstate_snapshot(&state); | 121 | get_runstate_snapshot(&state); |
@@ -126,7 +125,6 @@ static void do_stolen_accounting(void) | |||
126 | snap = &__get_cpu_var(xen_runstate_snapshot); | 125 | snap = &__get_cpu_var(xen_runstate_snapshot); |
127 | 126 | ||
128 | /* work out how much time the VCPU has not been runn*ing* */ | 127 | /* work out how much time the VCPU has not been runn*ing* */ |
129 | blocked = state.time[RUNSTATE_blocked] - snap->time[RUNSTATE_blocked]; | ||
130 | runnable = state.time[RUNSTATE_runnable] - snap->time[RUNSTATE_runnable]; | 128 | runnable = state.time[RUNSTATE_runnable] - snap->time[RUNSTATE_runnable]; |
131 | offline = state.time[RUNSTATE_offline] - snap->time[RUNSTATE_offline]; | 129 | offline = state.time[RUNSTATE_offline] - snap->time[RUNSTATE_offline]; |
132 | 130 | ||
@@ -142,17 +140,6 @@ static void do_stolen_accounting(void) | |||
142 | ticks = iter_div_u64_rem(stolen, NS_PER_TICK, &stolen); | 140 | ticks = iter_div_u64_rem(stolen, NS_PER_TICK, &stolen); |
143 | __this_cpu_write(xen_residual_stolen, stolen); | 141 | __this_cpu_write(xen_residual_stolen, stolen); |
144 | account_steal_ticks(ticks); | 142 | account_steal_ticks(ticks); |
145 | |||
146 | /* Add the appropriate number of ticks of blocked time, | ||
147 | including any left-overs from last time. */ | ||
148 | blocked += __this_cpu_read(xen_residual_blocked); | ||
149 | |||
150 | if (blocked < 0) | ||
151 | blocked = 0; | ||
152 | |||
153 | ticks = iter_div_u64_rem(blocked, NS_PER_TICK, &blocked); | ||
154 | __this_cpu_write(xen_residual_blocked, blocked); | ||
155 | account_idle_ticks(ticks); | ||
156 | } | 143 | } |
157 | 144 | ||
158 | /* Get the TSC speed from Xen */ | 145 | /* Get the TSC speed from Xen */ |