aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>2014-07-29 02:53:36 -0400
committerChristian Borntraeger <borntraeger@de.ibm.com>2014-08-25 08:35:55 -0400
commitd3d692c82e4ed79ae7c85f8825ccfdb7d11819da (patch)
treeb731597f4d65bb4a379db9f2b74a4c2e2ec74022
parentb028ee3edd54d338dd811aeafd670a2c682be558 (diff)
KVM: s390: implement KVM_REQ_TLB_FLUSH and make use of it
Use the KVM_REQ_TLB_FLUSH request in order to trigger tlb flushes instead of manipulating the SIE control block whenever we need it. Also trigger it for a control register sync directly instead of (ab)using kvm_s390_set_prefix(). Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
-rw-r--r--arch/s390/kvm/kvm-s390.c10
-rw-r--r--arch/s390/kvm/kvm-s390.h2
2 files changed, 9 insertions, 3 deletions
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index ab7cd645c127..56193becdca5 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1051,6 +1051,11 @@ retry:
1051 goto retry; 1051 goto retry;
1052 } 1052 }
1053 1053
1054 if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu)) {
1055 vcpu->arch.sie_block->ihcpu = 0xffff;
1056 goto retry;
1057 }
1058
1054 if (kvm_check_request(KVM_REQ_ENABLE_IBS, vcpu)) { 1059 if (kvm_check_request(KVM_REQ_ENABLE_IBS, vcpu)) {
1055 if (!ibs_enabled(vcpu)) { 1060 if (!ibs_enabled(vcpu)) {
1056 trace_kvm_s390_enable_disable_ibs(vcpu->vcpu_id, 1); 1061 trace_kvm_s390_enable_disable_ibs(vcpu->vcpu_id, 1);
@@ -1306,7 +1311,8 @@ static void sync_regs(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
1306 kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix); 1311 kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix);
1307 if (kvm_run->kvm_dirty_regs & KVM_SYNC_CRS) { 1312 if (kvm_run->kvm_dirty_regs & KVM_SYNC_CRS) {
1308 memcpy(&vcpu->arch.sie_block->gcr, &kvm_run->s.regs.crs, 128); 1313 memcpy(&vcpu->arch.sie_block->gcr, &kvm_run->s.regs.crs, 128);
1309 kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix); 1314 /* some control register changes require a tlb flush */
1315 kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
1310 } 1316 }
1311 if (kvm_run->kvm_dirty_regs & KVM_SYNC_ARCH0) { 1317 if (kvm_run->kvm_dirty_regs & KVM_SYNC_ARCH0) {
1312 vcpu->arch.sie_block->cputm = kvm_run->s.regs.cputm; 1318 vcpu->arch.sie_block->cputm = kvm_run->s.regs.cputm;
@@ -1519,7 +1525,7 @@ void kvm_s390_vcpu_start(struct kvm_vcpu *vcpu)
1519 * Another VCPU might have used IBS while we were offline. 1525 * Another VCPU might have used IBS while we were offline.
1520 * Let's play safe and flush the VCPU at startup. 1526 * Let's play safe and flush the VCPU at startup.
1521 */ 1527 */
1522 vcpu->arch.sie_block->ihcpu = 0xffff; 1528 kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
1523 spin_unlock(&vcpu->kvm->arch.start_stop_lock); 1529 spin_unlock(&vcpu->kvm->arch.start_stop_lock);
1524 return; 1530 return;
1525} 1531}
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h
index 894fa4653dfb..54c25fd5bed6 100644
--- a/arch/s390/kvm/kvm-s390.h
+++ b/arch/s390/kvm/kvm-s390.h
@@ -70,7 +70,7 @@ static inline u32 kvm_s390_get_prefix(struct kvm_vcpu *vcpu)
70static inline void kvm_s390_set_prefix(struct kvm_vcpu *vcpu, u32 prefix) 70static inline void kvm_s390_set_prefix(struct kvm_vcpu *vcpu, u32 prefix)
71{ 71{
72 vcpu->arch.sie_block->prefix = prefix >> GUEST_PREFIX_SHIFT; 72 vcpu->arch.sie_block->prefix = prefix >> GUEST_PREFIX_SHIFT;
73 vcpu->arch.sie_block->ihcpu = 0xffff; 73 kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
74 kvm_make_request(KVM_REQ_MMU_RELOAD, vcpu); 74 kvm_make_request(KVM_REQ_MMU_RELOAD, vcpu);
75} 75}
76 76