Going over the code, I found a couple of issues. Recording them here since I won't be able to work on them until after the forum.
1. I realized we don't save/restore serialize the following fields in virtio pci: uint32_t dfselect; uint32_t gfselect; uint32_t guest_features[2]; struct { uint16_t num; bool enabled; uint32_t desc[2]; uint32_t avail[2]; uint32_t used[2]; } vqs[VIRTIO_QUEUE_MAX]; This isn't an issue unless VM is migrated during driver initialization. 2. ring resizing is broken - it actually has a comment: /* TODO: need a way to put num back on reset. */ guest that runs out of memory might down-size the ring. Afterwards, ring size won't come back up after reset - not nice. Given that the modern layout is disabled by default, I don't think these are release blockers. -- MST