aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kvm
diff options
context:
space:
mode:
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>2016-05-10 03:40:09 -0400
committerChristian Borntraeger <borntraeger@de.ibm.com>2016-06-10 06:07:31 -0400
commit11ddcd41bce5c2394b0390584236afdd13656998 (patch)
treeae0609d00e7420bf8fd6c2f286de98dcd6e84ab3 /arch/s390/kvm
parent238614515287c9400727e4cd7aa958649dcbf05f (diff)
KVM: s390: trace and count all skey intercepts
Let's trace and count all skey handling operations, even if lazy skey handling was already activated. Also, don't enable lazy skey handling if anything went wrong while enabling skey handling for the SIE. Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'arch/s390/kvm')
-rw-r--r--arch/s390/kvm/priv.c13
-rw-r--r--arch/s390/kvm/trace.h2
2 files changed, 9 insertions, 6 deletions
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
index b8327b8fdb8f..6745c2a602c3 100644
--- a/arch/s390/kvm/priv.c
+++ b/arch/s390/kvm/priv.c
@@ -152,24 +152,27 @@ static int handle_store_cpu_address(struct kvm_vcpu *vcpu)
152static int __skey_check_enable(struct kvm_vcpu *vcpu) 152static int __skey_check_enable(struct kvm_vcpu *vcpu)
153{ 153{
154 int rc = 0; 154 int rc = 0;
155
156 trace_kvm_s390_skey_related_inst(vcpu);
155 if (!(vcpu->arch.sie_block->ictl & (ICTL_ISKE | ICTL_SSKE | ICTL_RRBE))) 157 if (!(vcpu->arch.sie_block->ictl & (ICTL_ISKE | ICTL_SSKE | ICTL_RRBE)))
156 return rc; 158 return rc;
157 159
158 rc = s390_enable_skey(); 160 rc = s390_enable_skey();
159 VCPU_EVENT(vcpu, 3, "%s", "enabling storage keys for guest"); 161 VCPU_EVENT(vcpu, 3, "enabling storage keys for guest: %d", rc);
160 trace_kvm_s390_skey_related_inst(vcpu); 162 if (!rc)
161 vcpu->arch.sie_block->ictl &= ~(ICTL_ISKE | ICTL_SSKE | ICTL_RRBE); 163 vcpu->arch.sie_block->ictl &= ~(ICTL_ISKE | ICTL_SSKE | ICTL_RRBE);
162 return rc; 164 return rc;
163} 165}
164 166
165 167
166static int handle_skey(struct kvm_vcpu *vcpu) 168static int handle_skey(struct kvm_vcpu *vcpu)
167{ 169{
168 int rc = __skey_check_enable(vcpu); 170 int rc;
169 171
172 vcpu->stat.instruction_storage_key++;
173 rc = __skey_check_enable(vcpu);
170 if (rc) 174 if (rc)
171 return rc; 175 return rc;
172 vcpu->stat.instruction_storage_key++;
173 176
174 if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE) 177 if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
175 return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP); 178 return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
diff --git a/arch/s390/kvm/trace.h b/arch/s390/kvm/trace.h
index 1c4586b367a4..4fc9d4e5be89 100644
--- a/arch/s390/kvm/trace.h
+++ b/arch/s390/kvm/trace.h
@@ -41,7 +41,7 @@ TRACE_EVENT(kvm_s390_skey_related_inst,
41 TP_fast_assign( 41 TP_fast_assign(
42 VCPU_ASSIGN_COMMON 42 VCPU_ASSIGN_COMMON
43 ), 43 ),
44 VCPU_TP_PRINTK("%s", "first instruction related to skeys on vcpu") 44 VCPU_TP_PRINTK("%s", "storage key related instruction")
45 ); 45 );
46 46
47TRACE_EVENT(kvm_s390_major_guest_pfault, 47TRACE_EVENT(kvm_s390_major_guest_pfault,