Best regards,
-Gonglei
> -----Original Message-----
> From: Gerd Hoffmann [mailto:kra...@redhat.com]
> Sent: Wednesday, September 03, 2014 2:25 PM
> To: Gonglei (Arei)
> Cc: Eduardo Habkost; qemu-devel@nongnu.org; aligu...@amazon.com;
> m...@redhat.com; pbonz...@redhat.com; ak...@redhat.com;
> hu...@cn.fujitsu.com; ebl...@redhat.com; afaer...@suse.de;
> arm...@redhat.com; imamm...@redhat.com; a...@ozlabs.ru;
> peter.crosthwa...@xilinx.com; lcapitul...@redhat.com; h...@linux.com;
> stefa...@redhat.com; ag...@suse.de; chenliang (T); Huangweidong (C);
> Luonengjun; Huangpeng (Peter); kw...@redhat.com
> Subject: Re: [PATCH v6 02/27] bootindex: add del_boot_device_path function
> Importance: High
>
>
> Hi,
>
> > 4. When we hotplug the virtio-net-pci device, only pass virtio-net-pci's
> > pointer
> to
> > del_boot_device_path(). But virtio-net-pci != virtio-net-device, so I add a
> function
> > named is_same_fw_dev_path() to handle this situation.
>
> When hot-unplugging virtio-net-pci I'd expect we free both
> virtio-net-pci and virtio-net-device (and therefore call
> del_boot_device_path twice, once for each device). Can you check that?
>
Yes, I can.
The del_boot_device_path() is called only once, just for virtio-net-pci.
For its child, virtio-net-devcie's resource is cleaned by qbus->child
unrealizing
process, will not call device_finalize().
Command line:
# ./qemu-system-x86_64 -enable-kvm -m 4096 -smp 4 -name redhat6.2 -drive
file=/mnt/sdb/gonglei/image/win7_32_2U,if=none,id=drive-ide0-0-0 -device
ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -drive
file=/mnt/sdb/gonglei/iso/rhel-server-7.0-x86_64-dvd.iso,if=none,id=drive-ide0-0-1
-device ide-cd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1,bootindex=4
-vnc 0.0.0.0:10 -netdev type=user,id=net0 -device
virtio-net-pci,netdev=net0,bootindex=3,id=nic1
QEMU 2.1.50 monitor - type 'help' for more information
(qemu) device_del nic1
(qemu)
The below is the backtrace by gdb:
Breakpoint 1, virtio_net_device_unrealize (dev=0x7f1b1ea87d58,
errp=0x7f1b17d8c350)
at /mnt/sdb/gonglei/qemu.git/qemu/hw/net/virtio-net.c:1649
1649 {
(gdb) bt
#0 virtio_net_device_unrealize (dev=0x7f1b1ea87d58, errp=0x7f1b17d8c350)
at /mnt/sdb/gonglei/qemu.git/qemu/hw/net/virtio-net.c:1649
#1 0x00007f1b1dd69b71 in virtio_device_unrealize (dev=0x7f1b1ea87d58,
errp=0x7f1b17d8c3c8)
at /mnt/sdb/gonglei/qemu.git/qemu/hw/virtio/virtio.c:1312
#2 0x00007f1b1de8a1a4 in device_set_realized (obj=0x7f1b1ea87d58, value=false,
errp=0x7f1b17d8c568) at hw/core/qdev.c:885
#3 0x00007f1b1dfa01f7 in property_set_bool (obj=0x7f1b1ea87d58,
v=0x7f1b1eb29de0, opaque=0x7f1b1eaa72c0, name=
0x7f1b1e0c2b69 "realized", errp=0x7f1b17d8c568) at qom/object.c:1467
#4 0x00007f1b1df9e82f in object_property_set (obj=0x7f1b1ea87d58,
v=0x7f1b1eb29de0, name=0x7f1b1e0c2b69 "realized", errp=
0x7f1b17d8c568) at qom/object.c:814
#5 0x00007f1b1dfa0c45 in object_property_set_qobject (obj=0x7f1b1ea87d58,
value=0x7f1b1eb09c80, name=0x7f1b1e0c2b69 "realized",
errp=0x7f1b17d8c568) at qom/qom-qobject.c:24
#6 0x00007f1b1df9ebd7 in object_property_set_bool (obj=0x7f1b1ea87d58,
value=false, name=0x7f1b1e0c2b69 "realized", errp=
0x7f1b17d8c568) at qom/object.c:878
#7 0x00007f1b1de893fa in bus_set_realized (obj=0x7f1b1ea87ce0, value=false,
errp=0x7f1b17d8c718) at hw/core/qdev.c:583
#8 0x00007f1b1dfa01f7 in property_set_bool (obj=0x7f1b1ea87ce0,
v=0x7f1b1ead5a10, opaque=0x7f1b1eaa1640, name=
0x7f1b1e0c2b69 "realized", errp=0x7f1b17d8c718) at qom/object.c:1467
#9 0x00007f1b1df9e82f in object_property_set (obj=0x7f1b1ea87ce0,
v=0x7f1b1ead5a10, name=0x7f1b1e0c2b69 "realized", errp=
0x7f1b17d8c718) at qom/object.c:814
#10 0x00007f1b1dfa0c45 in object_property_set_qobject (obj=0x7f1b1ea87ce0,
value=0x7f1b1eb09c60, name=0x7f1b1e0c2b69 "realized",
errp=0x7f1b17d8c718) at qom/qom-qobject.c:24
#11 0x00007f1b1df9ebd7 in object_property_set_bool (obj=0x7f1b1ea87ce0,
value=false, name=0x7f1b1e0c2b69 "realized", errp=
0x7f1b17d8c718) at qom/object.c:878
#12 0x00007f1b1de8a127 in device_set_realized (obj=0x7f1b1ea87380, value=false,
errp=0x0) at hw/core/qdev.c:875
#13 0x00007f1b1dfa01f7 in property_set_bool (obj=0x7f1b1ea87380,
v=0x7f1b1eacf940, opaque=0x7f1b1ea89f20, name=
0x7f1b1e0c2b69 "realized", errp=0x0) at qom/object.c:1467
#14 0x00007f1b1df9e82f in object_property_set (obj=0x7f1b1ea87380,
v=0x7f1b1eacf940, name=0x7f1b1e0c2b69 "realized", errp=0x0)
at qom/object.c:814
#15 0x00007f1b1dfa0c45 in object_property_set_qobject (obj=0x7f1b1ea87380,
value=0x7f1b1eb085e0, name=0x7f1b1e0c2b69 "realized",
errp=0x0) at qom/qom-qobject.c:24
#16 0x00007f1b1df9ebd7 in object_property_set_bool (obj=0x7f1b1ea87380,
value=false, name=0x7f1b1e0c2b69 "realized", errp=0x0)
at qom/object.c:878
#17 0x00007f1b1de8a7d0 in device_unparent (obj=0x7f1b1ea87380) at
hw/core/qdev.c:1010
#18 0x00007f1b1df9f26b in object_finalize_child_property (obj=0x7f1b1e9f4f30,
name=0x7f1b1eaa7ba0 "nic1", opaque=0x7f1b1ea87380)
at qom/object.c:1036
#19 0x00007f1b1df9e671 in object_property_del (obj=0x7f1b1e9f4f30,
name=0x7f1b1eaa7ba0 "nic1", errp=0x0) at qom/object.c:778
#20 0x00007f1b1df9d692 in object_property_del_child (obj=0x7f1b1e9f4f30,
child=0x7f1b1ea87380, errp=0x0) at qom/object.c:382
#21 0x00007f1b1df9d74b in object_unparent (obj=0x7f1b1ea87380) at
qom/object.c:391
#22 0x00007f1b1de52317 in acpi_pcihp_eject_slot (s=0x7f1b1eaf3438, bsel=0,
slots=8) at hw/acpi/pcihp.c:139
#23 0x00007f1b1de529b5 in pci_write (opaque=0x7f1b1eaf3438, addr=8, data=8,
size=4) at hw/acpi/pcihp.c:277
#24 0x00007f1b1dd1e958 in memory_region_write_accessor (mr=0x7f1b1eaf4048,
addr=8, value=0x7f1b17d8cb38, size=4, shift=0, mask=
4294967295) at /mnt/sdb/gonglei/qemu.git/qemu/memory.c:443
#25 0x00007f1b1dd1ea94 in access_with_adjusted_size (addr=8,
value=0x7f1b17d8cb38, size=4, access_size_min=1, access_size_max=4,
access=0x7f1b1dd1e8cb <memory_region_write_accessor>, mr=0x7f1b1eaf4048) at
/mnt/sdb/gonglei/qemu.git/qemu/memory.c:480
#26 0x00007f1b1dd22061 in memory_region_dispatch_write (mr=0x7f1b1eaf4048,
addr=8, data=8, size=4)
at /mnt/sdb/gonglei/qemu.git/qemu/memory.c:1137
#27 0x00007f1b1dd25c10 in io_mem_write (mr=0x7f1b1eaf4048, addr=8, val=8,
size=4) at /mnt/sdb/gonglei/qemu.git/qemu/memory.c:1973
#28 0x00007f1b1dcd01a9 in address_space_rw (as=0x7f1b1e4ed180
<address_space_io>, addr=44552, buf=0x7f1b1dc1f000 "\b", len=4,
is_write=true) at /mnt/sdb/gonglei/qemu.git/qemu/exec.c:2042
#29 0x00007f1b1dd1b186 in kvm_handle_io (port=44552, data=0x7f1b1dc1f000,
direction=1, size=4, count=1)
at /mnt/sdb/gonglei/qemu.git/qemu/kvm-all.c:1597
#30 0x00007f1b1dd1b7c4 in kvm_cpu_exec (cpu=0x7f1b1e9f85b0) at
/mnt/sdb/gonglei/qemu.git/qemu/kvm-all.c:1748
#31 0x00007f1b1dd02c88 in qemu_kvm_cpu_thread_fn (arg=0x7f1b1e9f85b0) at
/mnt/sdb/gonglei/qemu.git/qemu/cpus.c:940
#32 0x00007f1b1af3b7f6 in start_thread () from /lib64/libpthread.so.0
#33 0x00007f1b1ac9709d in clone () from /lib64/libc.so.6
#34 0x0000000000000000 in ?? ()
(gdb) c
Continuing.
Breakpoint 2, device_finalize (obj=0x7f1b1ea87380) at hw/core/qdev.c:971
971 {
(gdb) bt
#0 device_finalize (obj=0x7f1b1ea87380) at hw/core/qdev.c:971
#1 0x00007f1b1df9d79b in object_deinit (obj=0x7f1b1ea87380,
type=0x7f1b1e99a970) at qom/object.c:398
#2 0x00007f1b1df9d7bd in object_deinit (obj=0x7f1b1ea87380,
type=0x7f1b1e990a40) at qom/object.c:402
#3 0x00007f1b1df9d7bd in object_deinit (obj=0x7f1b1ea87380,
type=0x7f1b1e987700) at qom/object.c:402
#4 0x00007f1b1df9d7bd in object_deinit (obj=0x7f1b1ea87380,
type=0x7f1b1e987fc0) at qom/object.c:402
#5 0x00007f1b1df9d81a in object_finalize (data=0x7f1b1ea87380) at
qom/object.c:412
#6 0x00007f1b1df9e3d9 in object_unref (obj=0x7f1b1ea87380) at qom/object.c:719
#7 0x00007f1b1df9f280 in object_finalize_child_property (obj=0x7f1b1e9f4f30,
name=0x7f1b1eaa7ba0 "nic1", opaque=0x7f1b1ea87380)
at qom/object.c:1039
#8 0x00007f1b1df9e671 in object_property_del (obj=0x7f1b1e9f4f30,
name=0x7f1b1eaa7ba0 "nic1", errp=0x0) at qom/object.c:778
#9 0x00007f1b1df9d692 in object_property_del_child (obj=0x7f1b1e9f4f30,
child=0x7f1b1ea87380, errp=0x0) at qom/object.c:382
#10 0x00007f1b1df9d74b in object_unparent (obj=0x7f1b1ea87380) at
qom/object.c:391
#11 0x00007f1b1de52317 in acpi_pcihp_eject_slot (s=0x7f1b1eaf3438, bsel=0,
slots=8) at hw/acpi/pcihp.c:139
#12 0x00007f1b1de529b5 in pci_write (opaque=0x7f1b1eaf3438, addr=8, data=8,
size=4) at hw/acpi/pcihp.c:277
#13 0x00007f1b1dd1e958 in memory_region_write_accessor (mr=0x7f1b1eaf4048,
addr=8, value=0x7f1b17d8cb38, size=4, shift=0, mask=
4294967295) at /mnt/sdb/gonglei/qemu.git/qemu/memory.c:443
#14 0x00007f1b1dd1ea94 in access_with_adjusted_size (addr=8,
value=0x7f1b17d8cb38, size=4, access_size_min=1, access_size_max=4,
access=0x7f1b1dd1e8cb <memory_region_write_accessor>, mr=0x7f1b1eaf4048) at
/mnt/sdb/gonglei/qemu.git/qemu/memory.c:480
#15 0x00007f1b1dd22061 in memory_region_dispatch_write (mr=0x7f1b1eaf4048,
addr=8, data=8, size=4)
at /mnt/sdb/gonglei/qemu.git/qemu/memory.c:1137
#16 0x00007f1b1dd25c10 in io_mem_write (mr=0x7f1b1eaf4048, addr=8, val=8,
size=4) at /mnt/sdb/gonglei/qemu.git/qemu/memory.c:1973
#17 0x00007f1b1dcd01a9 in address_space_rw (as=0x7f1b1e4ed180
<address_space_io>, addr=44552, buf=0x7f1b1dc1f000 "\b", len=4,
is_write=true) at /mnt/sdb/gonglei/qemu.git/qemu/exec.c:2042
#18 0x00007f1b1dd1b186 in kvm_handle_io (port=44552, data=0x7f1b1dc1f000,
direction=1, size=4, count=1)
at /mnt/sdb/gonglei/qemu.git/qemu/kvm-all.c:1597
#19 0x00007f1b1dd1b7c4 in kvm_cpu_exec (cpu=0x7f1b1e9f85b0) at
/mnt/sdb/gonglei/qemu.git/qemu/kvm-all.c:1748
#20 0x00007f1b1dd02c88 in qemu_kvm_cpu_thread_fn (arg=0x7f1b1e9f85b0) at
/mnt/sdb/gonglei/qemu.git/qemu/cpus.c:940
#21 0x00007f1b1af3b7f6 in start_thread () from /lib64/libpthread.so.0
#22 0x00007f1b1ac9709d in clone () from /lib64/libc.so.6
#23 0x0000000000000000 in ?? ()
(gdb) n
974 DeviceState *dev = DEVICE(obj);
(gdb)
977 del_boot_device_path(dev);
(gdb) p *dev
$1 = {parent_obj = {class = 0x7f1b1e9b7270, free = 0x7f1b1caf1a30 <g_free>,
properties = {tqh_first = 0x0, tqh_last =
0x7f1b1ea87390}, ref = 0, parent = 0x0}, id = 0x7f1b1e9cbb30 "nic1",
realized = false, pending_deleted_event = true, opts =
0x7f1b1e9cb2f0, hotplugged = 0, parent_bus = 0x0, gpios = {lh_first = 0x0},
child_bus = {lh_first = 0x0}, num_child_bus = 0,
instance_id_alias = -1, alias_required_for_version = 0}
(gdb) n
[Thread 0x7f1b18770700 (LWP 13982) exited]
979 if (dev->opts) {
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x00007f1b1dd5def2 in
virtio_net_device_unrealize
at
/mnt/sdb/gonglei/qemu.git/qemu/hw/net/virtio-net.c:1649
breakpoint already hit 1 time
2 breakpoint keep y 0x00007f1b1de8a608 in device_finalize at
hw/core/qdev.c:971
breakpoint already hit 1 time
(gdb) c
Continuing.
[New Thread 0x7f1b18770700 (LWP 15096)]
[Thread 0x7f1b18770700 (LWP 15096) exited]
[New Thread 0x7f1b18770700 (LWP 16434)]
[Thread 0x7f1b18770700 (LWP 16434) exited]