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

Re: [Xen-devel] Prepping a bugfix push



On Fri, 2009-12-04 at 07:46 +0000, Ian Campbell wrote:
> I've been doing regular suspend/resumes not checkpoint ones as Brendan
> is doing, I did try a couple of checkpointed ones yesterday and they
> failed, IIRC with a similar softlockup to this one. 

So what is happening is that the device event channels are getting torn
down by the resume handler and never completely reinstated in the
cancelled suspend (aka checkpoint) case.

Taking blkfront as an example (although I expect netfront has a similar
issue), what see is: blkfront_resume calls blkif_free which calls
unbind_from_irqhandler, which causes EVTCHNOP_close and unbind the IRQ
from that IRQ (my patch "don't leak IRQs over suspend/resume" did not
change this behaviour in the cancelled suspend case). Then
blkfront_resume calls talk_to_backend which calls setup_blkring which
allocates a new event channel and binds it to a new IRQ. So far so good.
However because the domain never really goes away in the checkpoint case
the backend never notices that it needs to rebind to this new event
channel.

so, using lsevtchn on domain 0 I see:
        --- BEFORE.0    2009-12-04 14:47:58.000000000 +0000
        +++ AFTER.0     2009-12-04 14:48:55.000000000 +0000
        @@ -39,5 +39,5 @@
           39: VCPU 0: Virtual IRQ 3
           40: VCPU 0: Interdomain (Connected) - Remote Domain 1, Port 1
           41: VCPU 0: Interdomain (Connected) - Remote Domain 1, Port 2
        -  42: VCPU 0: Interdomain (Connected) - Remote Domain 1, Port 13
        -  43: VCPU 0: Interdomain (Connected) - Remote Domain 1, Port 14
        +  42: VCPU 0: Interdomain (Waiting connection) - Remote Domain 1
        +  43: VCPU 0: Interdomain (Waiting connection) - Remote Domain 1
and on the guest I see:
        --- BEFORE.U    2009-12-04 14:48:02.000000000 +0000
        +++ AFTER.U     2009-12-04 14:48:53.000000000 +0000
        @@ -10,5 +10,4 @@
           10: VCPU 1: IPI
           11: VCPU 1: Virtual IRQ 1
           12: VCPU 1: IPI
        -  13: VCPU 0: Interdomain (Connected) - Remote Domain 0, Port 42
        -  14: VCPU 0: Interdomain (Connected) - Remote Domain 0, Port 43
        +  13: VCPU 0: Interdomain (Waiting connection) - Remote Domain 0
(guest event channel 13 happens to be block front in both cases)

In 2.6.18 there was a separate ->suspend_cancel() callback for each
driver, called instead of the ->resume() callback in exactly these
circumstances. The cancel callback doesn't do any of the teardown, in
fact for blkfront it doesn't even exist.

(As a proof of concept, commenting out the entire contents of
blkfront_resume and netfront_resume makes checkpointing work OK for me,
at the cost of breaking regular resume, of course)

pv-ops uses the generic power management infrastructure which does not
have a concept of cancelling a suspend. Perhaps it should? Otherwise a
different solution will be required, I'm not sure what that might be yet
yet.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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