aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390')
-rw-r--r--arch/s390/kvm/sigp.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/arch/s390/kvm/sigp.c b/arch/s390/kvm/sigp.c
index eee1402349f2..509547d4fca1 100644
--- a/arch/s390/kvm/sigp.c
+++ b/arch/s390/kvm/sigp.c
@@ -363,7 +363,8 @@ static int __sigp_sense_running(struct kvm_vcpu *vcpu, u16 cpu_addr,
363 return rc; 363 return rc;
364} 364}
365 365
366static int __sigp_restart(struct kvm_vcpu *vcpu, u16 cpu_addr) 366/* Test whether the destination CPU is available and not busy */
367static int sigp_check_callable(struct kvm_vcpu *vcpu, u16 cpu_addr)
367{ 368{
368 struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; 369 struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int;
369 struct kvm_s390_local_interrupt *li; 370 struct kvm_s390_local_interrupt *li;
@@ -382,9 +383,6 @@ static int __sigp_restart(struct kvm_vcpu *vcpu, u16 cpu_addr)
382 spin_lock_bh(&li->lock); 383 spin_lock_bh(&li->lock);
383 if (li->action_bits & ACTION_STOP_ON_STOP) 384 if (li->action_bits & ACTION_STOP_ON_STOP)
384 rc = SIGP_CC_BUSY; 385 rc = SIGP_CC_BUSY;
385 else
386 VCPU_EVENT(vcpu, 4, "sigp restart %x to handle userspace",
387 cpu_addr);
388 spin_unlock_bh(&li->lock); 386 spin_unlock_bh(&li->lock);
389out: 387out:
390 spin_unlock(&fi->lock); 388 spin_unlock(&fi->lock);
@@ -459,10 +457,15 @@ int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu)
459 break; 457 break;
460 case SIGP_RESTART: 458 case SIGP_RESTART:
461 vcpu->stat.instruction_sigp_restart++; 459 vcpu->stat.instruction_sigp_restart++;
462 rc = __sigp_restart(vcpu, cpu_addr); 460 rc = sigp_check_callable(vcpu, cpu_addr);
463 if (rc == SIGP_CC_BUSY) 461 if (rc == SIGP_CC_ORDER_CODE_ACCEPTED) {
464 break; 462 VCPU_EVENT(vcpu, 4,
465 /* user space must know about restart */ 463 "sigp restart %x to handle userspace",
464 cpu_addr);
465 /* user space must know about restart */
466 rc = -EOPNOTSUPP;
467 }
468 break;
466 default: 469 default:
467 return -EOPNOTSUPP; 470 return -EOPNOTSUPP;
468 } 471 }