diff options
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/kvm/sigp.c | 19 |
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 | ||
366 | static int __sigp_restart(struct kvm_vcpu *vcpu, u16 cpu_addr) | 366 | /* Test whether the destination CPU is available and not busy */ |
367 | static 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); |
389 | out: | 387 | out: |
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 | } |