Signed-off-by: Zachary Amsden <zamsden@xxxxxxxxxx> --- arch/x86/kvm/x86.c | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index c66dede..8bd362b 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -914,6 +914,7 @@ static void sync_tsc_helper(int measure_cpu, s64 *delta, atomic_t *ready) /* * Average and trim the samples of any outliers; we use > 2 x sigma */ +static u64 tsc_deviation; static s64 average_samples(s64 *samples, unsigned num_samples) { unsigned i, j; @@ -936,6 +937,11 @@ static s64 average_samples(s64 *samples, unsigned num_samples) stddev = stddev / (num_samples - 1); stddev = int_sqrt(stddev); + /* Accumulate deviation measurement into a moving average */ + tsc_deviation = tsc_deviation ? + ((tsc_deviation << 4) - tsc_deviation + stddev) >> 4 : + stddev; + /* Throw out anything outside 2x stddev */ stddev <<= 1; average = 0, j = 0; @@ -950,10 +956,12 @@ static s64 average_samples(s64 *samples, unsigned num_samples) } if (j > 0) average = average / j; - else + else { printk(KERN_ERR "kvm: TSC samples failed to converge!\n"); - pr_debug("%s: mean = %lld, stddev = %llu, average = %lld\n", - __func__, mean, stddev, average); + average = mean; + } + pr_debug("%s: mean=%lld, stddev=%llu, average=%lld hdev=%llu\n", + __func__, mean, stddev, average, tsc_deviation); return average; } -- 1.6.5.2 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html