On Tue, Aug 25, 2009 at 08:24:07AM -0500, Anthony Liguori wrote: > Avi Kivity wrote: >> My preference is ring proxying. Not we'll need ring proxying (or at >> least event proxying) for non-MSI guests. > > Thinking about this more... > > How does the hand off work? Assuming you normally don't proxy ring > entries and switch to proxying them when you want to migration, do you > have a set of ioctl()s that changes the semantics of the ring to be host > virtual addresses instead of guest physical? If so, what do you do with > in flight requests? Does qemu have to buffer new requests and wait for > old ones to complete? > > Unless you always do ring proxying. If that's the case, we don't need > any of the slot management code in vhost. > > Regards, > > Anthony Liguori Here's how it works. It relies on the fact that in virtio, guest can not assume that descriptors have been used unless they appeared in used buffers. When migration starts, we do this: 1. stop kernel (disable socket) 2. call VHOST_SET_VRING_USED: note it gets virtual address, bot guest physical. We point it at buffer in qemu memory 3. call VHOST_SET_VRING_CALL, pass eventfd created by qemu 5. copy over existing used buffer 4. unstop kernel (reenable socket) Now when migration is in progress, we do this: A. poll eventfd in 3 above B. When event is seen, look at used buffer that we gave to kernel C. Parse descriptors and mark pages that kernel wrote to as dirty D. update used buffer that guest looks at E. signal eventfd for guest -- MST -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html