qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] hw: scsi: dc390: add device unrealize function


From: Li Qiang
Subject: [Qemu-devel] [PATCH] hw: scsi: dc390: add device unrealize function
Date: Thu, 29 Nov 2018 07:25:52 -0800

Currently the dc390 device has no unrealize function. This
can cause memory leak when hotplug/unplug device. Also more
serious, it will trigger an assert when rehotplug. 
The backtrack is following:

qemu-system-x86_64: migration/savevm.c:734: vmstate_register_with_alias_id: 
Assertion `!se->compat || se->instance_id == 0' failed.

Thread 1 "qemu-system-x86" received signal SIGABRT, Aborted.
[Switching to Thread 0x7ffff7fce280 (LWP 5721)]
__GI_raise (address@hidden) at ../sysdeps/unix/sysv/linux/raise.c:51
51      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
0  __GI_raise (address@hidden) at ../sysdeps/unix/sysv/linux/raise.c:51
1  0x00007ffff5a10801 in __GI_abort () at abort.c:79
2  0x00007ffff5a0039a in __assert_fail_base (fmt=0x7ffff5b877d8 "%s%s%s:%u: 
%s%sAssertion `%s' failed.\n%n",
    address@hidden "!se->compat || se->instance_id == 0",
    address@hidden "migration/savevm.c", address@hidden,
    address@hidden <__PRETTY_FUNCTION__.32111> "vmstate_register_with_alias_id")
    at assert.c:92
3  0x00007ffff5a00412 in __GI___assert_fail (assertion=0x555555f67f68 
"!se->compat || se->instance_id == 0",
    file=0x555555f67d07 "migration/savevm.c", line=734,
    function=0x555555f68e50 <__PRETTY_FUNCTION__.32111> 
"vmstate_register_with_alias_id") at assert.c:101
4  0x0000555555bfc1d2 in vmstate_register_with_alias_id (dev=0x5555577fff60, 
instance_id=-1,
    vmsd=0x555556533840 <vmstate_eeprom>, opaque=0x555556e82ad0, alias_id=-1, 
required_for_version=0, errp=0x0)
    at migration/savevm.c:734
5  0x0000555555b3ab79 in vmstate_register (dev=0x5555577fff60, instance_id=0, 
vmsd=0x555556533840 <vmstate_eeprom>,
    opaque=0x555556e82ad0) at /home/test/qemu/include/migration/vmstate.h:1067
6  0x0000555555b3b106 in eeprom93xx_new (dev=0x5555577fff60, nwords=64) at 
hw/nvram/eeprom93xx.c:323
7  0x0000555555b8b587 in dc390_scsi_realize (dev=0x5555577fff60, 
errp=0x7fffffffd9f8) at hw/scsi/esp-pci.c:482
8  0x0000555555b4b62e in pci_qdev_realize (qdev=0x5555577fff60, 
errp=0x7fffffffda70) at hw/pci/pci.c:2038
9  0x0000555555a89cb2 in device_set_realized (obj=0x5555577fff60, value=true, 
errp=0x7fffffffdc40)
    at hw/core/qdev.c:826
10 0x0000555555c7fbe8 in property_set_bool (obj=0x5555577fff60, 
v=0x5555567d9c50, name=0x555555edda12 "realized",
    opaque=0x5555575a6170, errp=0x7fffffffdc40) at qom/object.c:1991
11 0x0000555555c7de64 in object_property_set (obj=0x5555577fff60, 
v=0x5555567d9c50, name=0x555555edda12 "realized",
    errp=0x7fffffffdc40) at qom/object.c:1183
12 0x0000555555c80f2a in object_property_set_qobject (obj=0x5555577fff60, 
value=0x555556e84be0,
    name=0x555555edda12 "realized", errp=0x7fffffffdc40) at qom/qom-qobject.c:27
13 0x0000555555c7e149 in object_property_set_bool (obj=0x5555577fff60, 
value=true, name=0x555555edda12 "realized",
    errp=0x7fffffffdc40) at qom/object.c:1249
14 0x00005555559d3207 in qdev_device_add (opts=0x5555573aab00, 
errp=0x7fffffffdcb0) at qdev-monitor.c:642
15 0x00005555559d39f0 in qmp_device_add (qdict=0x555556a15000, ret_data=0x0, 
errp=0x7fffffffdcf0)
---Type <return> to continue, or q <return> to quit---
    at qdev-monitor.c:822
16 0x0000555555a01e2a in hmp_device_add (mon=0x5555568b8000, 
qdict=0x555556a15000) at hmp.c:2067

Signed-off-by: Li Qiang <address@hidden>
---
 hw/scsi/esp-pci.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c
index 419fc668ac..09d1331395 100644
--- a/hw/scsi/esp-pci.c
+++ b/hw/scsi/esp-pci.c
@@ -463,6 +463,14 @@ static void dc390_write_config(PCIDevice *dev,
     }
 }
 
+static void dc390_scsi_uninit(PCIDevice *dev)
+{
+    DC390State *pci = DC390(dev);
+
+    eeprom93xx_free(&dev->qdev, pci->eeprom);
+    esp_pci_scsi_uninit(dev);
+}
+
 static void dc390_scsi_realize(PCIDevice *dev, Error **errp)
 {
     DC390State *pci = DC390(dev);
@@ -510,6 +518,7 @@ static void dc390_class_init(ObjectClass *klass, void *data)
     PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
 
     k->realize = dc390_scsi_realize;
+    k->exit = dc390_scsi_uninit;
     k->config_read = dc390_read_config;
     k->config_write = dc390_write_config;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
-- 
2.17.1





reply via email to

[Prev in Thread] Current Thread [Next in Thread]