[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
- [Qemu-devel] [PATCH] hw: scsi: dc390: add device unrealize function,
Li Qiang <=