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


Reply via email to