diff options
author | David Hildenbrand <dahi@linux.vnet.ibm.com> | 2014-07-29 02:53:36 -0400 |
---|---|---|
committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2014-08-25 08:35:55 -0400 |
commit | d3d692c82e4ed79ae7c85f8825ccfdb7d11819da (patch) | |
tree | b731597f4d65bb4a379db9f2b74a4c2e2ec74022 | |
parent | b028ee3edd54d338dd811aeafd670a2c682be558 (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.c | 10 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.h | 2 |
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) | |||
70 | static inline void kvm_s390_set_prefix(struct kvm_vcpu *vcpu, u32 prefix) | 70 | static 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 | ||