Merge branch 'sh-latest' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal...
[pandora-kernel.git] / arch / powerpc / kvm / timing.c
index a021f58..319177d 100644 (file)
@@ -34,8 +34,8 @@ void kvmppc_init_timing_stats(struct kvm_vcpu *vcpu)
 {
        int i;
 
-       /* pause guest execution to avoid concurrent updates */
-       mutex_lock(&vcpu->mutex);
+       /* Take a lock to avoid concurrent updates */
+       mutex_lock(&vcpu->arch.exit_timing_lock);
 
        vcpu->arch.last_exit_type = 0xDEAD;
        for (i = 0; i < __NUMBER_OF_KVM_EXIT_TYPES; i++) {
@@ -49,7 +49,7 @@ void kvmppc_init_timing_stats(struct kvm_vcpu *vcpu)
        vcpu->arch.timing_exit.tv64 = 0;
        vcpu->arch.timing_last_enter.tv64 = 0;
 
-       mutex_unlock(&vcpu->mutex);
+       mutex_unlock(&vcpu->arch.exit_timing_lock);
 }
 
 static void add_exit_timing(struct kvm_vcpu *vcpu, u64 duration, int type)
@@ -65,6 +65,8 @@ static void add_exit_timing(struct kvm_vcpu *vcpu, u64 duration, int type)
                return;
        }
 
+       mutex_lock(&vcpu->arch.exit_timing_lock);
+
        vcpu->arch.timing_count_type[type]++;
 
        /* sum */
@@ -93,6 +95,8 @@ static void add_exit_timing(struct kvm_vcpu *vcpu, u64 duration, int type)
                vcpu->arch.timing_min_duration[type] = duration;
        if (unlikely(duration > vcpu->arch.timing_max_duration[type]))
                vcpu->arch.timing_max_duration[type] = duration;
+
+       mutex_unlock(&vcpu->arch.exit_timing_lock);
 }
 
 void kvmppc_update_timing_stats(struct kvm_vcpu *vcpu)
@@ -147,17 +151,30 @@ static int kvmppc_exit_timing_show(struct seq_file *m, void *private)
 {
        struct kvm_vcpu *vcpu = m->private;
        int i;
+       u64 min, max, sum, sum_quad;
 
        seq_printf(m, "%s", "type       count   min     max     sum     sum_squared\n");
 
+
        for (i = 0; i < __NUMBER_OF_KVM_EXIT_TYPES; i++) {
+
+               min = vcpu->arch.timing_min_duration[i];
+               do_div(min, tb_ticks_per_usec);
+               max = vcpu->arch.timing_max_duration[i];
+               do_div(max, tb_ticks_per_usec);
+               sum = vcpu->arch.timing_sum_duration[i];
+               do_div(sum, tb_ticks_per_usec);
+               sum_quad = vcpu->arch.timing_sum_quad_duration[i];
+               do_div(sum_quad, tb_ticks_per_usec);
+
                seq_printf(m, "%12s     %10d    %10lld  %10lld  %20lld  %20lld\n",
                        kvm_exit_names[i],
                        vcpu->arch.timing_count_type[i],
-                       vcpu->arch.timing_min_duration[i],
-                       vcpu->arch.timing_max_duration[i],
-                       vcpu->arch.timing_sum_duration[i],
-                       vcpu->arch.timing_sum_quad_duration[i]);
+                       min,
+                       max,
+                       sum,
+                       sum_quad);
+
        }
        return 0;
 }