aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kvm
diff options
context:
space:
mode:
authorChristian Borntraeger <borntraeger@de.ibm.com>2015-04-14 06:17:34 -0400
committerChristian Borntraeger <borntraeger@de.ibm.com>2015-05-08 09:51:15 -0400
commit27406cd50cf6653196eea8ebbb15a75596da01ca (patch)
tree371f3d79b9a1958a5714cd823b5e3b6f24397cd2 /arch/s390/kvm
parent8e23654687c97df1c0e4b1def245a05001eaf640 (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.c10
-rw-r--r--arch/s390/kvm/kvm-s390.h23
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
1417void s390_vcpu_block(struct kvm_vcpu *vcpu) 1417void 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
1422void s390_vcpu_unblock(struct kvm_vcpu *vcpu) 1422void 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);
211int kvm_s390_vcpu_store_adtl_status(struct kvm_vcpu *vcpu, unsigned long addr); 211int kvm_s390_vcpu_store_adtl_status(struct kvm_vcpu *vcpu, unsigned long addr);
212void kvm_s390_vcpu_start(struct kvm_vcpu *vcpu); 212void kvm_s390_vcpu_start(struct kvm_vcpu *vcpu);
213void kvm_s390_vcpu_stop(struct kvm_vcpu *vcpu); 213void kvm_s390_vcpu_stop(struct kvm_vcpu *vcpu);
214void s390_vcpu_block(struct kvm_vcpu *vcpu); 214void kvm_s390_vcpu_block(struct kvm_vcpu *vcpu);
215void s390_vcpu_unblock(struct kvm_vcpu *vcpu); 215void kvm_s390_vcpu_unblock(struct kvm_vcpu *vcpu);
216void exit_sie(struct kvm_vcpu *vcpu); 216void exit_sie(struct kvm_vcpu *vcpu);
217void kvm_s390_sync_request(int req, struct kvm_vcpu *vcpu); 217void kvm_s390_sync_request(int req, struct kvm_vcpu *vcpu);
218int kvm_s390_vcpu_setup_cmma(struct kvm_vcpu *vcpu); 218int kvm_s390_vcpu_setup_cmma(struct kvm_vcpu *vcpu);
@@ -228,6 +228,25 @@ int kvm_s390_handle_diag(struct kvm_vcpu *vcpu);
228int kvm_s390_inject_prog_irq(struct kvm_vcpu *vcpu, 228int 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
231static 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
241static 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