From 04b569dc09426679837f25121a6c9edc524d80fa Mon Sep 17 00:00:00 2001 From: Mark McLoughlin <markmc@redhat.com> Date: Wed, 1 Jul 2009 23:13:15 +0100 Subject: [PATCH 2/4] Fix rtl8139 segfault during live migrate after NIC hot-unplug https://bugzilla.redhat.com/500978 rtl8139 registers a savevm handler which is not removed when the NIC is hot-unplugged. This patch just cherry-picks rtl8139 bits from: http://git.kernel.org/?p=virt/kvm/qemu-kvm.git;a=commitdiff;h=a34b6eb776 Signed-off-by: Mark McLoughlin <markmc@redhat.com> Message-Id: <1246486395.598.94.camel@blaa> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Bugzilla: 500978 RH-Upstream-status: applied Acked-by: Juan Quintela <quintela@redhat.com> Acked-by: Don Dutile <ddutile@redhat.com> Acked-by: Marcelo Tosatti <mtosatti@redhat.com> --- qemu/hw/rtl8139.c | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+), 0 deletions(-) diff --git a/qemu/hw/rtl8139.c b/qemu/hw/rtl8139.c index ac5b3cf..297d1b7 100644 --- a/qemu/hw/rtl8139.c +++ b/qemu/hw/rtl8139.c @@ -3415,6 +3415,33 @@ static void rtl8139_timer(void *opaque) } #endif /* RTL8139_ONBOARD_TIMER */ +static void rtl8139_cleanup(VLANClientState *vc) +{ + RTL8139State *s = vc->opaque; + + if (s->cplus_txbuffer) { + qemu_free(s->cplus_txbuffer); + s->cplus_txbuffer = NULL; + } + +#ifdef RTL8139_ONBOARD_TIMER + qemu_del_timer(s->timer); + qemu_free_timer(s->timer); +#endif + + unregister_savevm("rtl8139", s); +} + +static int pci_rtl8139_uninit(PCIDevice *dev) +{ + PCIRTL8139State *d = (PCIRTL8139State *)dev; + RTL8139State *s = &d->rtl8139; + + cpu_unregister_io_memory(s->rtl8139_mmio_io_addr); + + return 0; +} + PCIDevice *pci_rtl8139_init(PCIBus *bus, NICInfo *nd, int devfn) { PCIRTL8139State *d; @@ -3428,6 +3455,7 @@ PCIDevice *pci_rtl8139_init(PCIBus *bus, NICInfo *nd, int devfn) if (!d) return NULL; + d->dev.unregister = pci_rtl8139_uninit; pci_conf = d->dev.config; pci_conf[0x00] = 0xec; /* Realtek 8139 */ pci_conf[0x01] = 0x10; @@ -3460,6 +3488,7 @@ PCIDevice *pci_rtl8139_init(PCIBus *bus, NICInfo *nd, int devfn) s->vc = qemu_new_vlan_client(nd->vlan, nd->model, nd->name, rtl8139_receive, rtl8139_can_receive, s); nd->vc = s->vc; + s->vc->cleanup = rtl8139_cleanup; qemu_format_nic_info_str(s->vc, s->macaddr); -- 1.6.3.rc4.29.g8146