diff options
Diffstat (limited to 'arch/powerpc/kvm/timing.c')
| -rw-r--r-- | arch/powerpc/kvm/timing.c | 31 | 
1 files changed, 24 insertions, 7 deletions
diff --git a/arch/powerpc/kvm/timing.c b/arch/powerpc/kvm/timing.c index a021f5827a3..319177df958 100644 --- a/arch/powerpc/kvm/timing.c +++ b/arch/powerpc/kvm/timing.c @@ -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;  }  |