diff options
author | Christian Borntraeger <borntraeger@de.ibm.com> | 2015-04-14 06:17:34 -0400 |
---|---|---|
committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2015-05-08 09:51:15 -0400 |
commit | 27406cd50cf6653196eea8ebbb15a75596da01ca (patch) | |
tree | 371f3d79b9a1958a5714cd823b5e3b6f24397cd2 /arch/s390/kvm | |
parent | 8e23654687c97df1c0e4b1def245a05001eaf640 (diff) |
KVM: s390: provide functions for blocking all CPUs
Some updates to the control blocks need to be done in a way that
ensures that no CPU is within SIE. Provide wrappers around the
s390_vcpu_block functions and adopt the TOD migration code to
update in a guaranteed fashion. Also rename these functions to
have the kvm_s390_ prefix as everything else.
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Diffstat (limited to 'arch/s390/kvm')
-rw-r--r-- | arch/s390/kvm/kvm-s390.c | 10 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.h | 23 |
2 files changed, 26 insertions, 7 deletions
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 9bc57afe54ba..6bc69ab5b5b4 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -454,10 +454,10 @@ static int kvm_s390_set_tod_low(struct kvm *kvm, struct kvm_device_attr *attr) | |||
454 | 454 | ||
455 | mutex_lock(&kvm->lock); | 455 | mutex_lock(&kvm->lock); |
456 | kvm->arch.epoch = gtod - host_tod; | 456 | kvm->arch.epoch = gtod - host_tod; |
457 | kvm_for_each_vcpu(vcpu_idx, cur_vcpu, kvm) { | 457 | kvm_s390_vcpu_block_all(kvm); |
458 | kvm_for_each_vcpu(vcpu_idx, cur_vcpu, kvm) | ||
458 | cur_vcpu->arch.sie_block->epoch = kvm->arch.epoch; | 459 | cur_vcpu->arch.sie_block->epoch = kvm->arch.epoch; |
459 | exit_sie(cur_vcpu); | 460 | kvm_s390_vcpu_unblock_all(kvm); |
460 | } | ||
461 | mutex_unlock(&kvm->lock); | 461 | mutex_unlock(&kvm->lock); |
462 | return 0; | 462 | return 0; |
463 | } | 463 | } |
@@ -1414,12 +1414,12 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) | |||
1414 | return kvm_s390_vcpu_has_irq(vcpu, 0); | 1414 | return kvm_s390_vcpu_has_irq(vcpu, 0); |
1415 | } | 1415 | } |
1416 | 1416 | ||
1417 | void 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 | } | 1420 | } |
1421 | 1421 | ||
1422 | void s390_vcpu_unblock(struct kvm_vcpu *vcpu) | 1422 | void kvm_s390_vcpu_unblock(struct kvm_vcpu *vcpu) |
1423 | { | 1423 | { |
1424 | atomic_clear_mask(PROG_BLOCK_SIE, &vcpu->arch.sie_block->prog20); | 1424 | atomic_clear_mask(PROG_BLOCK_SIE, &vcpu->arch.sie_block->prog20); |
1425 | } | 1425 | } |
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h index 8edca85e246e..c5704786e473 100644 --- a/arch/s390/kvm/kvm-s390.h +++ b/arch/s390/kvm/kvm-s390.h | |||
@@ -211,8 +211,8 @@ int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr); | |||
211 | int kvm_s390_vcpu_store_adtl_status(struct kvm_vcpu *vcpu, unsigned long addr); | 211 | int kvm_s390_vcpu_store_adtl_status(struct kvm_vcpu *vcpu, unsigned long addr); |
212 | void kvm_s390_vcpu_start(struct kvm_vcpu *vcpu); | 212 | void kvm_s390_vcpu_start(struct kvm_vcpu *vcpu); |
213 | void kvm_s390_vcpu_stop(struct kvm_vcpu *vcpu); | 213 | void kvm_s390_vcpu_stop(struct kvm_vcpu *vcpu); |
214 | void s390_vcpu_block(struct kvm_vcpu *vcpu); | 214 | void kvm_s390_vcpu_block(struct kvm_vcpu *vcpu); |
215 | void s390_vcpu_unblock(struct kvm_vcpu *vcpu); | 215 | void kvm_s390_vcpu_unblock(struct kvm_vcpu *vcpu); |
216 | void exit_sie(struct kvm_vcpu *vcpu); | 216 | void exit_sie(struct kvm_vcpu *vcpu); |
217 | void kvm_s390_sync_request(int req, struct kvm_vcpu *vcpu); | 217 | void kvm_s390_sync_request(int req, struct kvm_vcpu *vcpu); |
218 | int kvm_s390_vcpu_setup_cmma(struct kvm_vcpu *vcpu); | 218 | int kvm_s390_vcpu_setup_cmma(struct kvm_vcpu *vcpu); |
@@ -228,6 +228,25 @@ int kvm_s390_handle_diag(struct kvm_vcpu *vcpu); | |||
228 | int kvm_s390_inject_prog_irq(struct kvm_vcpu *vcpu, | 228 | int kvm_s390_inject_prog_irq(struct kvm_vcpu *vcpu, |
229 | struct kvm_s390_pgm_info *pgm_info); | 229 | struct kvm_s390_pgm_info *pgm_info); |
230 | 230 | ||
231 | static inline void kvm_s390_vcpu_block_all(struct kvm *kvm) | ||
232 | { | ||
233 | int i; | ||
234 | struct kvm_vcpu *vcpu; | ||
235 | |||
236 | WARN_ON(!mutex_is_locked(&kvm->lock)); | ||
237 | kvm_for_each_vcpu(i, vcpu, kvm) | ||
238 | kvm_s390_vcpu_block(vcpu); | ||
239 | } | ||
240 | |||
241 | static inline void kvm_s390_vcpu_unblock_all(struct kvm *kvm) | ||
242 | { | ||
243 | int i; | ||
244 | struct kvm_vcpu *vcpu; | ||
245 | |||
246 | kvm_for_each_vcpu(i, vcpu, kvm) | ||
247 | kvm_s390_vcpu_unblock(vcpu); | ||
248 | } | ||
249 | |||
231 | /** | 250 | /** |
232 | * kvm_s390_inject_prog_cond - conditionally inject a program check | 251 | * kvm_s390_inject_prog_cond - conditionally inject a program check |
233 | * @vcpu: virtual cpu | 252 | * @vcpu: virtual cpu |