On Mon, Sep 08, 2025 at 07:48:09PM +0300, Vladimir Sementsov-Ogievskiy wrote: > On 08.09.25 18:42, Peter Xu wrote: > > On Fri, Sep 05, 2025 at 04:50:35PM +0300, Vladimir Sementsov-Ogievskiy > > wrote: > > > +static const VMStateDescription vmstate_tap = { > > > + .name = "virtio-net-device", > > > + .post_load = tap_post_load, > > > + .fields = (const VMStateField[]) { > > > + VMSTATE_FD(fd, TAPState), > > > + VMSTATE_BOOL(using_vnet_hdr, TAPState), > > > + VMSTATE_BOOL(has_ufo, TAPState), > > > + VMSTATE_BOOL(has_uso, TAPState), > > > + VMSTATE_BOOL(enabled, TAPState), > > > + VMSTATE_UINT32(host_vnet_hdr_len, TAPState), > > > + VMSTATE_END_OF_LIST() > > > + } > > > +}; > > > + > > > +int tap_save(NetClientState *nc, QEMUFile *f) > > > +{ > > > + TAPState *s = DO_UPCAST(TAPState, nc, nc); > > > + > > > + return vmstate_save_state(f, &vmstate_tap, s, 0); > > > +} > > > + > > > +int tap_load(NetClientState *nc, QEMUFile *f) > > > +{ > > > + TAPState *s = DO_UPCAST(TAPState, nc, nc); > > > + > > > + return vmstate_load_state(f, &vmstate_tap, s, 0); > > > +} > > > > Instead of hard-coding vmstate_save_state() / vmstate_load_state(), could > > we make tap's VMSD to be a subsection of virtio-net's? > > > > Multifd already doesn't support qemufile, but only iochannels (which is the > > internal impl of qemufiles). We might at some point start to concurrently > > load devices with multifd, then anything with qemufile will be a no-go and > > need to be serialized as legacy code in the main channel, or rewritten. > > > > IMHO it'll be great if we can avoid adding new codes operating on > > qemufiles, and also avoid adding any new custom VMSD fields' put()/get() if > > ever possible. > > > > Subsections are loaded after fields. > > And virtio-net already has fields > > VMSTATE_WITH_TMP(VirtIONet, struct VirtIONetMigTmp, > vmstate_virtio_net_has_vnet), > > and > > VMSTATE_WITH_TMP(VirtIONet, struct VirtIONetMigTmp, > vmstate_virtio_net_has_ufo),
Side note: I'm actually a bit confused on why it needs to use VMSTATE_WITH_TMP(), or say, the get()/put() directly. Taking example of vmstate_virtio_net_has_ufo, afaiu, the only point here is that virtio_net_ufo_post_load() would check peer UFO support. I wonder if that should work too to check that in virtio_net_post_load_device(), and fail there if anything is wrong.. then would has_ufo be able to be migrated as a VMSTATE_U8 field? > > Which do check on virtio-net level some parameters, which should come from > local migration of TAP. > > That's why I made TAP a field, and put it before these two ones. This way > these two checks works. > > > Still, from your comment I understand that hard-coding save/load is worse > problem. So I can just > skip checking in vmstate_virtio_net_has_vnet / vmstate_virtio_net_has_ufo > with enabled "local-tap" > (or "fd-passing") capability (or better migration parameter). This way TAP > may be a subsection. That'll be nice, thanks. Or would a VMSTATE_STRUCT() for TAP to work (so that it can also be put before the two _TMPs, but avoid raw get()/put())? -- Peter Xu