KVM: arm/arm64: Count guest exit due to various reasons
It would add guest exit statistics to debugfs, this can be helpful while measuring KVM performance. [ Renamed some of the field names - Christoffer ] Signed-off-by: Amit Singh Tomar <amittomer25@gmail.com> Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
This commit is contained in:
		
							parent
							
								
									8cdb654abe
								
							
						
					
					
						commit
						b19e6892a9
					
				| @ -150,6 +150,12 @@ struct kvm_vcpu_stat { | ||||
| 	u32 halt_successful_poll; | ||||
| 	u32 halt_attempted_poll; | ||||
| 	u32 halt_wakeup; | ||||
| 	u32 hvc_exit_stat; | ||||
| 	u64 wfe_exit_stat; | ||||
| 	u64 wfi_exit_stat; | ||||
| 	u64 mmio_exit_user; | ||||
| 	u64 mmio_exit_kernel; | ||||
| 	u64 exits; | ||||
| }; | ||||
| 
 | ||||
| int kvm_vcpu_preferred_target(struct kvm_vcpu_init *init); | ||||
|  | ||||
| @ -603,6 +603,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) | ||||
| 		ret = kvm_call_hyp(__kvm_vcpu_run, vcpu); | ||||
| 
 | ||||
| 		vcpu->mode = OUTSIDE_GUEST_MODE; | ||||
| 		vcpu->stat.exits++; | ||||
| 		/*
 | ||||
| 		 * Back from guest | ||||
| 		 *************************************************************/ | ||||
|  | ||||
| @ -33,6 +33,12 @@ | ||||
| #define VCPU_STAT(x) { #x, offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU } | ||||
| 
 | ||||
| struct kvm_stats_debugfs_item debugfs_entries[] = { | ||||
| 	VCPU_STAT(hvc_exit_stat), | ||||
| 	VCPU_STAT(wfe_exit_stat), | ||||
| 	VCPU_STAT(wfi_exit_stat), | ||||
| 	VCPU_STAT(mmio_exit_user), | ||||
| 	VCPU_STAT(mmio_exit_kernel), | ||||
| 	VCPU_STAT(exits), | ||||
| 	{ NULL } | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -42,6 +42,7 @@ static int handle_hvc(struct kvm_vcpu *vcpu, struct kvm_run *run) | ||||
| 
 | ||||
| 	trace_kvm_hvc(*vcpu_pc(vcpu), *vcpu_reg(vcpu, 0), | ||||
| 		      kvm_vcpu_hvc_get_imm(vcpu)); | ||||
| 	vcpu->stat.hvc_exit_stat++; | ||||
| 
 | ||||
| 	ret = kvm_psci_call(vcpu); | ||||
| 	if (ret < 0) { | ||||
| @ -89,9 +90,11 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run) | ||||
| { | ||||
| 	if (kvm_vcpu_get_hsr(vcpu) & HSR_WFI_IS_WFE) { | ||||
| 		trace_kvm_wfx(*vcpu_pc(vcpu), true); | ||||
| 		vcpu->stat.wfe_exit_stat++; | ||||
| 		kvm_vcpu_on_spin(vcpu); | ||||
| 	} else { | ||||
| 		trace_kvm_wfx(*vcpu_pc(vcpu), false); | ||||
| 		vcpu->stat.wfi_exit_stat++; | ||||
| 		kvm_vcpu_block(vcpu); | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -210,8 +210,11 @@ int io_mem_abort(struct kvm_vcpu *vcpu, struct kvm_run *run, | ||||
| 
 | ||||
| 	if (!ret) { | ||||
| 		/* We handled the access successfully in the kernel. */ | ||||
| 		vcpu->stat.mmio_exit_kernel++; | ||||
| 		kvm_handle_mmio_return(vcpu, run); | ||||
| 		return 1; | ||||
| 	} else { | ||||
| 		vcpu->stat.mmio_exit_user++; | ||||
| 	} | ||||
| 
 | ||||
| 	run->exit_reason	= KVM_EXIT_MMIO; | ||||
|  | ||||
| @ -197,6 +197,12 @@ struct kvm_vcpu_stat { | ||||
| 	u32 halt_successful_poll; | ||||
| 	u32 halt_attempted_poll; | ||||
| 	u32 halt_wakeup; | ||||
| 	u32 hvc_exit_stat; | ||||
| 	u64 wfe_exit_stat; | ||||
| 	u64 wfi_exit_stat; | ||||
| 	u64 mmio_exit_user; | ||||
| 	u64 mmio_exit_kernel; | ||||
| 	u64 exits; | ||||
| }; | ||||
| 
 | ||||
| int kvm_vcpu_preferred_target(struct kvm_vcpu_init *init); | ||||
|  | ||||
| @ -34,7 +34,16 @@ | ||||
| 
 | ||||
| #include "trace.h" | ||||
| 
 | ||||
| #define VM_STAT(x) { #x, offsetof(struct kvm, stat.x), KVM_STAT_VM } | ||||
| #define VCPU_STAT(x) { #x, offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU } | ||||
| 
 | ||||
| struct kvm_stats_debugfs_item debugfs_entries[] = { | ||||
| 	VCPU_STAT(hvc_exit_stat), | ||||
| 	VCPU_STAT(wfe_exit_stat), | ||||
| 	VCPU_STAT(wfi_exit_stat), | ||||
| 	VCPU_STAT(mmio_exit_user), | ||||
| 	VCPU_STAT(mmio_exit_kernel), | ||||
| 	VCPU_STAT(exits), | ||||
| 	{ NULL } | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -39,6 +39,7 @@ static int handle_hvc(struct kvm_vcpu *vcpu, struct kvm_run *run) | ||||
| 
 | ||||
| 	trace_kvm_hvc_arm64(*vcpu_pc(vcpu), vcpu_get_reg(vcpu, 0), | ||||
| 			    kvm_vcpu_hvc_get_imm(vcpu)); | ||||
| 	vcpu->stat.hvc_exit_stat++; | ||||
| 
 | ||||
| 	ret = kvm_psci_call(vcpu); | ||||
| 	if (ret < 0) { | ||||
| @ -71,9 +72,11 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run) | ||||
| { | ||||
| 	if (kvm_vcpu_get_hsr(vcpu) & ESR_ELx_WFx_ISS_WFE) { | ||||
| 		trace_kvm_wfx_arm64(*vcpu_pc(vcpu), true); | ||||
| 		vcpu->stat.wfe_exit_stat++; | ||||
| 		kvm_vcpu_on_spin(vcpu); | ||||
| 	} else { | ||||
| 		trace_kvm_wfx_arm64(*vcpu_pc(vcpu), false); | ||||
| 		vcpu->stat.wfi_exit_stat++; | ||||
| 		kvm_vcpu_block(vcpu); | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user