* Laurent Vivier (lviv...@redhat.com) wrote: > On 06/03/2017 06:25, Jason Wang wrote: > > From: "Dr. David Alan Gilbert" <dgilb...@redhat.com> > > > > The index's in the Vmxnet3Ring were migrated as 32bit ints > > yet are declared as size_t's. They appear to be derived > > from 32bit values loaded from guest memory, so actually > > store them as that. > > > > Signed-off-by: Dr. David Alan Gilbert <dgilb...@redhat.com> > > Acked-by: Dmitry Fleytman <dmi...@daynix.com> > > Signed-off-by: Jason Wang <jasow...@redhat.com> > > --- > > hw/net/vmxnet3.c | 12 ++++++------ > > 1 file changed, 6 insertions(+), 6 deletions(-) > > > > diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c > > index e13a798..224c109 100644 > > --- a/hw/net/vmxnet3.c > > +++ b/hw/net/vmxnet3.c > > @@ -141,17 +141,17 @@ typedef struct VMXNET3Class { > > /* Cyclic ring abstraction */ > > typedef struct { > > hwaddr pa; > > - size_t size; > > - size_t cell_size; > > - size_t next; > > + uint32_t size; > > + uint32_t cell_size; > > + uint32_t next; > > uint8_t gen; > > } Vmxnet3Ring; > > > > static inline void vmxnet3_ring_init(PCIDevice *d, > > Vmxnet3Ring *ring, > > hwaddr pa, > > - size_t size, > > - size_t cell_size, > > + uint32_t size, > > + uint32_t cell_size, > > bool zero_region) > > { > > ring->pa = pa; > > @@ -166,7 +166,7 @@ static inline void vmxnet3_ring_init(PCIDevice *d, > > } > > > > #define VMXNET3_RING_DUMP(macro, ring_name, ridx, r) > > \ > > - macro("%s#%d: base %" PRIx64 " size %zu cell_size %zu gen %d next > > %zu", \ > > + macro("%s#%d: base %" PRIx64 " size %u cell_size %u gen %d next %u", \ > > (ring_name), (ridx), > > \ > > (r)->pa, (r)->size, (r)->cell_size, (r)->gen, (r)->next) > > > > > > > David, with '-dump-vmstate' with 2.8 machine type and with v2.8 and > master I can see the size of "txq_descr" and "rxq_descr" changes because > of "sizeof(Vmxnet3TxqDescr)" and "sizeof(Vmxnet3RxqDescr)". This changes > because the size of Vmxnet3Ring has changed with the s/size_t/uint32_t/": > > { > "field": "txq_descr", > "version_id": 0, > "field_exists": false, > "size": 176 > }, > { > "field": "rxq_descr", > "version_id": 0, > "field_exists": false, > "size": 216 > }, > > becomes: > > { > "field": "txq_descr", > "version_id": 0, > "field_exists": false, > "size": 144 > }, > { > "field": "rxq_descr", > "version_id": 0, > "field_exists": false, > "size": 168 > },
But the old migration code used to write these fields using qemu_put_be32 (from a11f5cb005f9854f0d78da97fc23adf5bc8c83f3) -static void vmxnet3_put_ring_to_file(QEMUFile *f, Vmxnet3Ring *r) -{ - qemu_put_be64(f, r->pa); - qemu_put_be32(f, r->size); - qemu_put_be32(f, r->cell_size); - qemu_put_be32(f, r->next); - qemu_put_byte(f, r->gen); -} +static const VMStateDescription vmstate_vmxnet3_ring = { + .name = "vmxnet3-ring", + .version_id = 0, + .fields = (VMStateField[]) { + VMSTATE_UINT64(pa, Vmxnet3Ring), + VMSTATE_UINT32(size, Vmxnet3Ring), + VMSTATE_UINT32(cell_size, Vmxnet3Ring), + VMSTATE_UINT32(next, Vmxnet3Ring), + VMSTATE_UINT8(gen, Vmxnet3Ring), + VMSTATE_END_OF_LIST() + } }; so they used to be size_t's written with be32 and now they're uint32_t's written as 32bit - so that should be the same. I'm not sure i understand where the old txq_descr sizes come from - what managed to print the 176 number before it was converted to VMState? > And if I try a migration, I have: > > qemu/migration/vmstate.c:112: vmstate_load_state: Assertion `first_elem > || !n_elems' failed. Interesting; that's Halil's new assert; I need to look. Dave > Laurent -- Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK