On 13.12.21 22:09, Eric Farman wrote:
> Let's wait to mark the VCPU STOPPED until the possible
> STORE STATUS operation is completed, so that we know the
> CPU is fully stopped and done doing anything. (When we
> also clear the possible sigp_order field for STOP orders.)
> 
> Suggested-by: David Hildenbrand <da...@redhat.com>
> Signed-off-by: Eric Farman <far...@linux.ibm.com>
> ---
>  target/s390x/sigp.c | 12 ++++++++----
>  1 file changed, 8 insertions(+), 4 deletions(-)
> 
> diff --git a/target/s390x/sigp.c b/target/s390x/sigp.c
> index 51c727834c..9dd977349a 100644
> --- a/target/s390x/sigp.c
> +++ b/target/s390x/sigp.c
> @@ -139,7 +139,7 @@ static void sigp_stop_and_store_status(CPUState *cs, 
> run_on_cpu_data arg)
>      case S390_CPU_STATE_OPERATING:
>          cpu->env.sigp_order = SIGP_STOP_STORE_STATUS;
>          cpu_inject_stop(cpu);
> -        /* store will be performed in do_stop_interrup() */
> +        /* store will be performed in do_stop_interrupt() */
>          break;
>      case S390_CPU_STATE_STOPPED:
>          /* already stopped, just store the status */
> @@ -479,13 +479,17 @@ void do_stop_interrupt(CPUS390XState *env)
>  {
>      S390CPU *cpu = env_archcpu(env);
>  
> -    if (s390_cpu_set_state(S390_CPU_STATE_STOPPED, cpu) == 0) {
> -        qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
> -    }
> +    /*
> +     * Complete the STOP operation before exposing the CPU as
> +     * STOPPED to the system.
> +     */
>      if (cpu->env.sigp_order == SIGP_STOP_STORE_STATUS) {
>          s390_store_status(cpu, S390_STORE_STATUS_DEF_ADDR, true);
>      }
>      env->sigp_order = 0;
> +    if (s390_cpu_set_state(S390_CPU_STATE_STOPPED, cpu) == 0) {
> +        qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
> +    }
>      env->pending_int &= ~INTERRUPT_STOP;
>  }
>  

Reviewed-by: David Hildenbrand <da...@redhat.com>

-- 
Thanks,

David / dhildenb


Reply via email to