On Wed, Jan 28, 2026 at 10:57 AM Jason Wang <[email protected]> wrote:
>
> On Wed, Jan 28, 2026 at 10:55 AM Jason Wang <[email protected]> wrote:
> >
> > On Tue, Jan 27, 2026 at 10:04 PM Juraj Marcin <[email protected]> wrote:
> > >
> > > From: Juraj Marcin <[email protected]>
> > >
> > > During migration switchover both the source and the destination machines
> > > are paused (compute downtime). During this period network still routes
> > > network packets to the source machine, as this is the last place where
> > > the recipient MAC address has been seen. Once the destination side
> > > starts and sends network announcement, all subsequent frames are routed
> > > correctly. However, frames delivered to the source machine are never
> > > processed and lost. This causes also a network downtime with roughly the
> > > same duration as compute downtime.
> > >
> > > This can cause problems not only for protocols that cannot handle packet
> > > loss, but can also introduce delays in protocols that can handle them.
> > >
> > > To resolve this, this feature instantiates a network filter for each
> > > network backend present during migration setup on both migration sides.
> > > On the source side, this filter caches all packets received from the
> > > backend during switchover. Once the destination machine starts, all
> > > cached packets are sent through the migration channel and the respective
> > > filter object on the destination side injects them to the NIC attached
> > > to the backend.
> > >
> > > Signed-off-by: Juraj Marcin <[email protected]>
> > > ---
> > > include/migration/vmstate.h | 6 +
> > > include/net/net.h | 5 +
> > > migration/meson.build | 1 +
> > > migration/migration.c | 49 ++++++-
> > > migration/migration.h | 2 +
> > > migration/netpass.c | 246 ++++++++++++++++++++++++++++++++++++
> > > migration/netpass.h | 14 ++
> > > migration/options.c | 21 +++
> > > migration/options.h | 1 +
> > > migration/savevm.c | 37 ++++++
> > > migration/savevm.h | 2 +
> > > migration/trace-events | 9 ++
> > > net/net.c | 11 ++
> > > net/tap.c | 11 +-
> > > qapi/migration.json | 7 +-
> > > 15 files changed, 418 insertions(+), 4 deletions(-)
> > > create mode 100644 migration/netpass.c
> > > create mode 100644 migration/netpass.h
> > >
> > > diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
> > > index 62d7e9fe38..7987e6c85a 100644
> > > --- a/include/migration/vmstate.h
> > > +++ b/include/migration/vmstate.h
> > > @@ -200,6 +200,12 @@ typedef enum {
> > > * save_setup() in VMSD structures.
> > > */
> > > VMS_PHASE_EARLY_SETUP,
> > > + /*
> > > + * Specifies a netpass VMSD, these devices are copied right after the
> > > + * destination is started regardless of precopy/postcopy. Failure in
> > > this
> > > + * phase does not fail the migration in case of precopy.
> > > + */
> > > + VMS_PHASE_NETPASS,
> > > } VMStateSavePhase;
> > >
> > > struct VMStateDescription {
> > > diff --git a/include/net/net.h b/include/net/net.h
> > > index 45bc86fc86..510908845b 100644
> > > --- a/include/net/net.h
> > > +++ b/include/net/net.h
> > > @@ -82,6 +82,7 @@ typedef void (NetAnnounce)(NetClientState *);
> > > typedef bool (SetSteeringEBPF)(NetClientState *, int);
> > > typedef bool (NetCheckPeerType)(NetClientState *, ObjectClass *, Error
> > > **);
> > > typedef struct vhost_net *(GetVHostNet)(NetClientState *nc);
> > > +typedef void (NetpassEnabledNotify)(NetClientState *nc, void *opaque);
> > >
> > > typedef struct NetClientInfo {
> > > NetClientDriver type;
> > > @@ -130,6 +131,9 @@ struct NetClientState {
> > > bool is_netdev;
> > > bool do_not_pad; /* do not pad to the minimum ethernet frame length
> > > */
> > > bool is_datapath;
> > > + bool netpass_enabled;
> > > + NetpassEnabledNotify *netpass_enabled_notify;
> > > + void *netpass_enabled_notify_opaque;
> > > QTAILQ_HEAD(, NetFilterState) filters;
> > > };
> > >
> >
> > Adding Cindy, Eugenio can Chen.
> >
> > I think we can simple reuse the existing filters:
> >
> > redirector: which can redirect traffic from the source to the
> > destination via chardev
> > buffer: which can hold the packets until the destination is released
> >
> > And let the libvirt install/uninstall those filters at the correct time.
> >
> > Which means:
> >
> > On the source: there would be a redirector that can be enabled when vm
> > is paused, and it redirect the traffic to a socket/chardev
> > On the destination: there would be a redirector as well as the buffer,
> > redirector receives packets from the socket and send it to buffer,
> > buffer will hold those packets until VM in the destination is resumed.
> >
> > The current filters need some tweaks (e.g letting filters (redirector)
> > work when VM is paused). The advantages of this are:
> >
> > 1) reuse the existing filters
> > 2) don't need to care about the vhost support on the source as vhost
> > is disabled, for vDPA we can reuse shadow virtqueue
> > 3) for the destination we can install a redirector to packet socket to
> > let vhost works like socket -> redirector -> buffer -> redirector ->
> > packet socket.
Actually, I've already started working on this to support vhost. there
would be based on filter working as this explain and coding is on
going , hope we can have a draft for this soon
Thanks
Cindy
>
> and 4) there's no need to touch migration code in Qemu.
>
> Thanks
>
> >
> > Thanks
>