Re: [PATCH 1/2] KVM: s390: add vcpu stat counters for many instruction

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 24.01.2018 12:32, Christian Borntraeger wrote:
> The overall instruction counter is larger than the sum of the
> single counters. We should try to catch all instruction handlers
> to make this match the summary counter.
> Let us add sck,tb,sske,iske,rrbe,tb,tpi,tsch,lpsw,pswe.....
> 
> Signed-off-by: Christian Borntraeger <borntraeger@xxxxxxxxxx>
> ---
>  arch/s390/include/asm/kvm_host.h | 18 ++++++++++++++++--
>  arch/s390/kvm/kvm-s390.c         | 18 ++++++++++++++++--
>  arch/s390/kvm/priv.c             | 33 +++++++++++++++++++++++++++++++--
>  3 files changed, 63 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
> index 2aee050..5d47991 100644
> --- a/arch/s390/include/asm/kvm_host.h
> +++ b/arch/s390/include/asm/kvm_host.h
> @@ -1,7 +1,7 @@
>  /*
>   * definition for kernel virtual machines on s390
>   *
> - * Copyright IBM Corp. 2008, 2009
> + * Copyright IBM Corp. 2008, 2018
>   *
>   * This program is free software; you can redistribute it and/or modify
>   * it under the terms of the GNU General Public License (version 2 only)
> @@ -323,18 +323,32 @@ struct kvm_vcpu_stat {
>  	u64 deliver_program_int;
>  	u64 deliver_io_int;
>  	u64 exit_wait_state;
> +	u64 instruction_epsw;
> +	u64 instruction_gs;
> +	u64 instruction_io;
> +	u64 instruction_lpsw;
> +	u64 instruction_lpswe;
>  	u64 instruction_pfmf;
> +	u64 instruction_ptff;
> +	u64 instruction_sck;
> +	u64 instruction_sckpf;
>  	u64 instruction_stidp;
>  	u64 instruction_spx;
>  	u64 instruction_stpx;
>  	u64 instruction_stap;
> -	u64 instruction_storage_key;
> +	u64 instruction_iske;
> +	u64 instruction_ri;
> +	u64 instruction_rrbe;
> +	u64 instruction_sske;
>  	u64 instruction_ipte_interlock;
>  	u64 instruction_stsch;
>  	u64 instruction_chsc;
>  	u64 instruction_stsi;
>  	u64 instruction_stfl;
> +	u64 instruction_tb;
> +	u64 instruction_tpi;
>  	u64 instruction_tprot;
> +	u64 instruction_tsch;
>  	u64 instruction_sie;
>  	u64 instruction_essa;
>  	u64 instruction_sthyi;
> diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
> index 7926c3c..3abe177 100644
> --- a/arch/s390/kvm/kvm-s390.c
> +++ b/arch/s390/kvm/kvm-s390.c
> @@ -2,7 +2,7 @@
>  /*
>   * hosting IBM Z kernel virtual machines (s390x)
>   *
> - * Copyright IBM Corp. 2008, 2017
> + * Copyright IBM Corp. 2008, 2018
>   *
>   *    Author(s): Carsten Otte <cotte@xxxxxxxxxx>
>   *               Christian Borntraeger <borntraeger@xxxxxxxxxx>
> @@ -87,19 +87,33 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {
>  	{ "deliver_restart_signal", VCPU_STAT(deliver_restart_signal) },
>  	{ "deliver_program_interruption", VCPU_STAT(deliver_program_int) },
>  	{ "exit_wait_state", VCPU_STAT(exit_wait_state) },
> +	{ "instruction_epsw", VCPU_STAT(instruction_epsw) },
> +	{ "instruction_gs", VCPU_STAT(instruction_gs) },
> +	{ "instruction_io", VCPU_STAT(instruction_io) },
> +	{ "instruction_lpsw", VCPU_STAT(instruction_lpsw) },
> +	{ "instruction_lpswe", VCPU_STAT(instruction_lpswe) },
>  	{ "instruction_pfmf", VCPU_STAT(instruction_pfmf) },
> +	{ "instruction_ptff", VCPU_STAT(instruction_ptff) },
>  	{ "instruction_stidp", VCPU_STAT(instruction_stidp) },
> +	{ "instruction_sck", VCPU_STAT(instruction_sck) },
> +	{ "instruction_sckpf", VCPU_STAT(instruction_sckpf) },
>  	{ "instruction_spx", VCPU_STAT(instruction_spx) },
>  	{ "instruction_stpx", VCPU_STAT(instruction_stpx) },
>  	{ "instruction_stap", VCPU_STAT(instruction_stap) },
> -	{ "instruction_storage_key", VCPU_STAT(instruction_storage_key) },
> +	{ "instruction_iske", VCPU_STAT(instruction_iske) },
> +	{ "instruction_ri", VCPU_STAT(instruction_ri) },
> +	{ "instruction_rrbe", VCPU_STAT(instruction_rrbe) },
> +	{ "instruction_sske", VCPU_STAT(instruction_sske) },
>  	{ "instruction_ipte_interlock", VCPU_STAT(instruction_ipte_interlock) },
>  	{ "instruction_stsch", VCPU_STAT(instruction_stsch) },
>  	{ "instruction_chsc", VCPU_STAT(instruction_chsc) },
>  	{ "instruction_essa", VCPU_STAT(instruction_essa) },
>  	{ "instruction_stsi", VCPU_STAT(instruction_stsi) },
>  	{ "instruction_stfl", VCPU_STAT(instruction_stfl) },
> +	{ "instruction_tb", VCPU_STAT(instruction_tb) },
> +	{ "instruction_tpi", VCPU_STAT(instruction_tpi) },
>  	{ "instruction_tprot", VCPU_STAT(instruction_tprot) },
> +	{ "instruction_tsch", VCPU_STAT(instruction_tsch) },
>  	{ "instruction_sthyi", VCPU_STAT(instruction_sthyi) },
>  	{ "instruction_sie", VCPU_STAT(instruction_sie) },
>  	{ "instruction_sigp_sense", VCPU_STAT(instruction_sigp_sense) },
> diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
> index 572496c..7523bc8 100644
> --- a/arch/s390/kvm/priv.c
> +++ b/arch/s390/kvm/priv.c
> @@ -2,7 +2,7 @@
>  /*
>   * handling privileged instructions
>   *
> - * Copyright IBM Corp. 2008, 2013
> + * Copyright IBM Corp. 2008, 2018
>   *
>   *    Author(s): Carsten Otte <cotte@xxxxxxxxxx>
>   *               Christian Borntraeger <borntraeger@xxxxxxxxxx>
> @@ -34,6 +34,8 @@
>  
>  static int handle_ri(struct kvm_vcpu *vcpu)
>  {
> +	vcpu->stat.instruction_ri++;
> +
>  	if (test_kvm_facility(vcpu->kvm, 64)) {
>  		VCPU_EVENT(vcpu, 3, "%s", "ENABLE: RI (lazy)");
>  		vcpu->arch.sie_block->ecb3 |= ECB3_RI;
> @@ -53,6 +55,8 @@ int kvm_s390_handle_aa(struct kvm_vcpu *vcpu)
>  
>  static int handle_gs(struct kvm_vcpu *vcpu)
>  {
> +	vcpu->stat.instruction_gs++;
> +
>  	if (test_kvm_facility(vcpu->kvm, 133)) {
>  		VCPU_EVENT(vcpu, 3, "%s", "ENABLE: GS (lazy)");
>  		preempt_disable();
> @@ -85,6 +89,8 @@ static int handle_set_clock(struct kvm_vcpu *vcpu)
>  	u8 ar;
>  	u64 op2, val;
>  
> +	vcpu->stat.instruction_sck++;
> +
>  	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
>  		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
>  
> @@ -222,7 +228,6 @@ static int try_handle_skey(struct kvm_vcpu *vcpu)
>  {
>  	int rc;
>  
> -	vcpu->stat.instruction_storage_key++;
>  	rc = kvm_s390_skey_check_enable(vcpu);
>  	if (rc)
>  		return rc;
> @@ -242,6 +247,8 @@ static int handle_iske(struct kvm_vcpu *vcpu)
>  	int reg1, reg2;
>  	int rc;
>  
> +	vcpu->stat.instruction_iske++;
> +
>  	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
>  		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
>  
> @@ -274,6 +281,8 @@ static int handle_rrbe(struct kvm_vcpu *vcpu)
>  	int reg1, reg2;
>  	int rc;
>  
> +	vcpu->stat.instruction_rrbe++;
> +
>  	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
>  		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
>  
> @@ -312,6 +321,8 @@ static int handle_sske(struct kvm_vcpu *vcpu)
>  	int reg1, reg2;
>  	int rc;
>  
> +	vcpu->stat.instruction_sske++;
> +
>  	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
>  		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
>  
> @@ -392,6 +403,8 @@ static int handle_test_block(struct kvm_vcpu *vcpu)
>  	gpa_t addr;
>  	int reg2;
>  
> +	vcpu->stat.instruction_tb++;
> +
>  	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
>  		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
>  
> @@ -424,6 +437,8 @@ static int handle_tpi(struct kvm_vcpu *vcpu)
>  	u64 addr;
>  	u8 ar;
>  
> +	vcpu->stat.instruction_tpi++;
> +
>  	addr = kvm_s390_get_base_disp_s(vcpu, &ar);
>  	if (addr & 3)
>  		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
> @@ -484,6 +499,8 @@ static int handle_tsch(struct kvm_vcpu *vcpu)
>  	struct kvm_s390_interrupt_info *inti = NULL;
>  	const u64 isc_mask = 0xffUL << 24; /* all iscs set */
>  
> +	vcpu->stat.instruction_tsch++;
> +
>  	/* a valid schid has at least one bit set */
>  	if (vcpu->run->s.regs.gprs[1])
>  		inti = kvm_s390_get_io_int(vcpu->kvm, isc_mask,
> @@ -512,6 +529,7 @@ static int handle_tsch(struct kvm_vcpu *vcpu)
>  
>  static int handle_io_inst(struct kvm_vcpu *vcpu)
>  {
> +
>  	VCPU_EVENT(vcpu, 4, "%s", "I/O instruction");
>  
>  	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
> @@ -527,6 +545,7 @@ static int handle_io_inst(struct kvm_vcpu *vcpu)
>  		if (vcpu->arch.sie_block->ipa == 0xb235)
>  			return handle_tsch(vcpu);
>  		/* Handle in userspace. */
> +		vcpu->stat.instruction_io++;
>  		return -EOPNOTSUPP;
>  	} else {
>  		/*
> @@ -592,6 +611,8 @@ int kvm_s390_handle_lpsw(struct kvm_vcpu *vcpu)
>  	int rc;
>  	u8 ar;
>  
> +	vcpu->stat.instruction_lpsw++;
> +
>  	if (gpsw->mask & PSW_MASK_PSTATE)
>  		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
>  
> @@ -619,6 +640,8 @@ static int handle_lpswe(struct kvm_vcpu *vcpu)
>  	int rc;
>  	u8 ar;
>  
> +	vcpu->stat.instruction_lpswe++;
> +
>  	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
>  		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
>  
> @@ -828,6 +851,8 @@ static int handle_epsw(struct kvm_vcpu *vcpu)
>  {
>  	int reg1, reg2;
>  
> +	vcpu->stat.instruction_epsw++;
> +
>  	kvm_s390_get_regs_rre(vcpu, &reg1, &reg2);
>  
>  	/* This basically extracts the mask half of the psw. */
> @@ -1332,6 +1357,8 @@ static int handle_sckpf(struct kvm_vcpu *vcpu)
>  {
>  	u32 value;
>  
> +	vcpu->stat.instruction_sckpf++;
> +
>  	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
>  		return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
>  
> @@ -1347,6 +1374,8 @@ static int handle_sckpf(struct kvm_vcpu *vcpu)
>  
>  static int handle_ptff(struct kvm_vcpu *vcpu)
>  {
> +	vcpu->stat.instruction_ptff++;
> +
>  	/* we don't emulate any control instructions yet */
>  	kvm_s390_set_psw_cc(vcpu, 3);
>  	return 0;
> 

Reviewed-by: David Hildenbrand <david@xxxxxxxxxx>

-- 

Thanks,

David / dhildenb



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux