Blame SOURCES/kvm-virtio-net-failover-add-missing-remove_migration_sta.patch

a83cc2
From 21027e308bf410293a745d4358a848e9aa037df1 Mon Sep 17 00:00:00 2001
a83cc2
From: Laurent Vivier <lvivier@redhat.com>
a83cc2
Date: Mon, 10 May 2021 13:08:20 -0400
a83cc2
Subject: [PATCH 09/15] virtio-net: failover: add missing
a83cc2
 remove_migration_state_change_notifier()
a83cc2
a83cc2
RH-Author: Miroslav Rezanina <mrezanin@redhat.com>
a83cc2
RH-MergeRequest: 5: Synchronize RHEL-AV 8.5 release 18 to RHEL 9 Beta
a83cc2
RH-Commit: [4/12] 884f0f99fbbba4312663ec6232b1d8c9576df84e (mrezanin/centos-src-qemu-kvm)
a83cc2
RH-Bugzilla: 1957194
a83cc2
RH-Acked-by: Danilo Cesar Lemes de Paula <ddepaula@redhat.com>
a83cc2
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
a83cc2
RH-Acked-by: Greg Kurz <gkurz@redhat.com>
a83cc2
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
a83cc2
a83cc2
In the failover case configuration, virtio_net_device_realize() uses an
a83cc2
add_migration_state_change_notifier() to add a state notifier, but this
a83cc2
notifier is not removed by the unrealize function when the virtio-net
a83cc2
card is unplugged.
a83cc2
a83cc2
If the card is unplugged and a migration is started, the notifier is
a83cc2
called and as it is not valid anymore QEMU crashes.
a83cc2
a83cc2
This patch fixes the problem by adding the
a83cc2
remove_migration_state_change_notifier() in virtio_net_device_unrealize().
a83cc2
a83cc2
The problem can be reproduced with:
a83cc2
a83cc2
  $ qemu-system-x86_64 -enable-kvm -m 1g -M q35 \
a83cc2
    -device pcie-root-port,slot=4,id=root1 \
a83cc2
    -device pcie-root-port,slot=5,id=root2 \
a83cc2
    -device virtio-net-pci,id=net1,mac=52:54:00:6f:55:cc,failover=on,bus=root1 \
a83cc2
    -monitor stdio disk.qcow2
a83cc2
  (qemu) device_del net1
a83cc2
  (qemu) migrate "exec:gzip -c > STATEFILE.gz"
a83cc2
a83cc2
  Thread 1 "qemu-system-x86" received signal SIGSEGV, Segmentation fault.
a83cc2
  0x0000000000000000 in ?? ()
a83cc2
  (gdb) bt
a83cc2
  #0  0x0000000000000000 in  ()
a83cc2
  #1  0x0000555555d726d7 in notifier_list_notify (...)
a83cc2
      at .../util/notify.c:39
a83cc2
  #2  0x0000555555842c1a in migrate_fd_connect (...)
a83cc2
      at .../migration/migration.c:3975
a83cc2
  #3  0x0000555555950f7d in migration_channel_connect (...)
a83cc2
      error@entry=0x0) at .../migration/channel.c:107
a83cc2
  #4  0x0000555555910922 in exec_start_outgoing_migration (...)
a83cc2
      at .../migration/exec.c:42
a83cc2
a83cc2
Reported-by: Igor Mammedov <imammedo@redhat.com>
a83cc2
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
a83cc2
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
a83cc2
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
a83cc2
Signed-off-by: Jason Wang <jasowang@redhat.com>
a83cc2
(cherry picked from commit a7eca58380f9589bb1bb6333ccfb58869734edb6)
a83cc2
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
a83cc2
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
a83cc2
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
a83cc2
---
a83cc2
 hw/net/virtio-net.c | 1 +
a83cc2
 1 file changed, 1 insertion(+)
a83cc2
a83cc2
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
a83cc2
index 66b9ff4511..914051feb7 100644
a83cc2
--- a/hw/net/virtio-net.c
a83cc2
+++ b/hw/net/virtio-net.c
a83cc2
@@ -3373,6 +3373,7 @@ static void virtio_net_device_unrealize(DeviceState *dev)
a83cc2
 
a83cc2
     if (n->failover) {
a83cc2
         device_listener_unregister(&n->primary_listener);
a83cc2
+        remove_migration_state_change_notifier(&n->migration_state);
a83cc2
     }
a83cc2
 
a83cc2
     max_queues = n->multiqueue ? n->max_queues : 1;
a83cc2
-- 
a83cc2
2.27.0
a83cc2