[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Memory ordering question in the shutdown deferral code



(+ Xen-devel)

Sorry I forgot to CC xen-devel.

On 21/09/2020 12:38, Julien Grall wrote:
Hi all,

I have started to look at the deferral code (see vcpu_start_shutdown_deferral()) because we need it for LiveUpdate and Arm will soon use it.

The current implementation is using an smp_mb() to ensure ordering between a write then a read. The code looks roughly (I have slightly adapted it to make my question more obvious):

domain_shutdown()
     d->is_shutting_down = 1;
     smp_mb();
     if ( !vcpu0->defer_shutdown )
     {
       vcpu_pause_nosync(v);
       v->paused_for_shutdown = 1;
     }

vcpu_start_shutdown_deferral()
     vcpu0->defer_shutdown = 1;
     smp_mb();
     if ( unlikely(d->is_shutting_down) )
       vcpu_check_shutdown(v);

     return vcpu0->defer_shutdown;

smp_mb() should only guarantee ordering (this may be stronger on some arch), so I think there is a race between the two functions.

It would be possible to pause the vCPU in domain_shutdown() because vcpu0->defer_shutdown wasn't yet seen.

Equally, vcpu_start_shutdown_deferral() may not see d->is_shutting_down and therefore Xen may continue to send the I/O. Yet the vCPU will be paused so the I/O will never complete.

I am not fully familiar with the IOREQ code, but it sounds to me this is not the behavior that was intended. Can someone more familiar with the code confirm it?

Cheers,


--
Julien Grall



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.