Commit 0b0c002c340e78173789f8afaa508070d838cf3d

Authored by Laszlo Ersek
Committed by Konrad Rzeszutek Wilk
1 parent 283c0972d5

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>

Showing 1 changed file with 2 additions and 15 deletions Side-by-side Diff

... ... @@ -37,9 +37,8 @@
37 37 /* snapshots of runstate info */
38 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 41 static DEFINE_PER_CPU(u64, xen_residual_stolen);
42   -static DEFINE_PER_CPU(u64, xen_residual_blocked);
43 42  
44 43 /* return an consistent snapshot of 64-bit time/counter value */
45 44 static u64 get64(const u64 *p)
... ... @@ -116,7 +115,7 @@
116 115 {
117 116 struct vcpu_runstate_info state;
118 117 struct vcpu_runstate_info *snap;
119   - s64 blocked, runnable, offline, stolen;
  118 + s64 runnable, offline, stolen;
120 119 cputime_t ticks;
121 120  
122 121 get_runstate_snapshot(&state);
... ... @@ -126,7 +125,6 @@
126 125 snap = &__get_cpu_var(xen_runstate_snapshot);
127 126  
128 127 /* work out how much time the VCPU has not been runn*ing* */
129   - blocked = state.time[RUNSTATE_blocked] - snap->time[RUNSTATE_blocked];
130 128 runnable = state.time[RUNSTATE_runnable] - snap->time[RUNSTATE_runnable];
131 129 offline = state.time[RUNSTATE_offline] - snap->time[RUNSTATE_offline];
132 130  
... ... @@ -142,17 +140,6 @@
142 140 ticks = iter_div_u64_rem(stolen, NS_PER_TICK, &stolen);
143 141 __this_cpu_write(xen_residual_stolen, stolen);
144 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 145 /* Get the TSC speed from Xen */