Blob Blame History Raw
From: Farhan Ali <alifm@linux.ibm.com>
Subject: KVM: s390: introduce and use KVM_REQ_VSIE_RESTART
Patch-mainline: v4.20-rc1
Git-commit: 3194cdb71190a74d46ae456efef10ecfc6f1e062
References: FATE#326370, LTC#169186, bsc#1113483

Summary:     kernel: AP Crypto Passthrough 
Description: This adds support for AP crypto passthrough for 
             kvm guests.

Upstream-Description:

             KVM: s390: introduce and use KVM_REQ_VSIE_RESTART

             When we change the crycb (or execution controls), we also have to make sure
             that the vSIE shadow datastructures properly consider the changed
             values before rerunning the vSIE. We can achieve that by simply using a
             VCPU request now.

             This has to be a synchronous request (== handled before entering the
             (v)SIE again).

             The request will make sure that the vSIE handler is left, and that the
             request will be processed (NOP), therefore forcing a reload of all
             vSIE data (including rebuilding the crycb) when re-entering the vSIE
             interception handler the next time.

             Signed-off-by: David Hildenbrand <david@redhat.com>
             Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com>
             Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
             Reviewed-by: Cornelia Huck <cohuck@redhat.com>
             Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
             Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
             Message-Id: <20180925231641.4954-3-akrowiak@linux.vnet.ibm.com>
             Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>

Signed-off-by: Farhan Ali <alifm@linux.ibm.com>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
 arch/s390/include/asm/kvm_host.h |    1 +
 arch/s390/kvm/kvm-s390.c         |    4 ++++
 2 files changed, 5 insertions(+)

--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -47,6 +47,7 @@
 #define KVM_REQ_ICPT_OPEREXC	KVM_ARCH_REQ(2)
 #define KVM_REQ_START_MIGRATION   KVM_ARCH_REQ(3)
 #define KVM_REQ_STOP_MIGRATION    KVM_ARCH_REQ(4)
+#define KVM_REQ_VSIE_RESTART	KVM_ARCH_REQ(5)
 
 #define SIGP_CTRL_C		0x80
 #define SIGP_CTRL_SCN_MASK	0x3f
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -844,8 +844,11 @@ void kvm_s390_vcpu_crypto_reset_all(struct kvm *kvm)
 
 	kvm_s390_vcpu_block_all(kvm);
 
-	kvm_for_each_vcpu(i, vcpu, kvm)
+ 	kvm_for_each_vcpu(i, vcpu, kvm) {
 		kvm_s390_vcpu_crypto_setup(vcpu);
+		/* recreate the shadow crycb by leaving the VSIE handler */
+		kvm_s390_sync_request(KVM_REQ_VSIE_RESTART, vcpu);
+ 	}
 
 	kvm_s390_vcpu_unblock_all(kvm);
 }
@@ -3063,6 +3065,8 @@ retry:
 
 	/* nothing to do, just clear the request */
 	kvm_clear_request(KVM_REQ_UNHALT, vcpu);
+	/* we left the vsie handler, nothing to do, just clear the request */
+	kvm_clear_request(KVM_REQ_VSIE_RESTART, vcpu);
 
 	return 0;
 }