diff options
author | David Hildenbrand <dahi@linux.vnet.ibm.com> | 2015-05-12 02:41:40 -0400 |
---|---|---|
committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2015-06-02 03:38:01 -0400 |
commit | 61a6df54b64913defc64c87a05d5d258a2020fb5 (patch) | |
tree | 7ea9c20fc83b663729d8427924df48e4064aa81a /arch/s390/kvm | |
parent | 06b36753a6466239fc945b6756e12d635621ae5f (diff) |
KVM: s390: call exit_sie() directly on vcpu block/request
Thinking about it, I can't find a real use case where we want
to block a VCPU and not kick it out of SIE. (except if we want
to do the same in batch for multiple VCPUs - but that's a micro
optimization)
So let's simply perform the exit_sie() calls directly when setting
the other magic block bits in the SIE.
Otherwise e.g. kvm_s390_set_tod_low() still has other VCPUs running
after that call, working with a wrong epoch.
Fixes: 27406cd50c ("KVM: s390: provide functions for blocking all CPUs")
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
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/kvm-s390.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 6bc69ab5b5b4..f37557bc2512 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -1417,6 +1417,7 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) | |||
1417 | void kvm_s390_vcpu_block(struct kvm_vcpu *vcpu) | 1417 | void kvm_s390_vcpu_block(struct kvm_vcpu *vcpu) |
1418 | { | 1418 | { |
1419 | atomic_set_mask(PROG_BLOCK_SIE, &vcpu->arch.sie_block->prog20); | 1419 | atomic_set_mask(PROG_BLOCK_SIE, &vcpu->arch.sie_block->prog20); |
1420 | exit_sie(vcpu); | ||
1420 | } | 1421 | } |
1421 | 1422 | ||
1422 | void kvm_s390_vcpu_unblock(struct kvm_vcpu *vcpu) | 1423 | void kvm_s390_vcpu_unblock(struct kvm_vcpu *vcpu) |
@@ -1427,6 +1428,7 @@ void kvm_s390_vcpu_unblock(struct kvm_vcpu *vcpu) | |||
1427 | static void kvm_s390_vcpu_request(struct kvm_vcpu *vcpu) | 1428 | static void kvm_s390_vcpu_request(struct kvm_vcpu *vcpu) |
1428 | { | 1429 | { |
1429 | atomic_set_mask(PROG_REQUEST, &vcpu->arch.sie_block->prog20); | 1430 | atomic_set_mask(PROG_REQUEST, &vcpu->arch.sie_block->prog20); |
1431 | exit_sie(vcpu); | ||
1430 | } | 1432 | } |
1431 | 1433 | ||
1432 | static void kvm_s390_vcpu_request_handled(struct kvm_vcpu *vcpu) | 1434 | static void kvm_s390_vcpu_request_handled(struct kvm_vcpu *vcpu) |
@@ -1450,7 +1452,6 @@ void kvm_s390_sync_request(int req, struct kvm_vcpu *vcpu) | |||
1450 | { | 1452 | { |
1451 | kvm_make_request(req, vcpu); | 1453 | kvm_make_request(req, vcpu); |
1452 | kvm_s390_vcpu_request(vcpu); | 1454 | kvm_s390_vcpu_request(vcpu); |
1453 | exit_sie(vcpu); | ||
1454 | } | 1455 | } |
1455 | 1456 | ||
1456 | static void kvm_gmap_notifier(struct gmap *gmap, unsigned long address) | 1457 | static void kvm_gmap_notifier(struct gmap *gmap, unsigned long address) |