On Fri, Mar 08, 2013 at 07:36:28AM -0600, Anthony Liguori wrote: > Markus Armbruster <armbru@xxxxxxxxxx> writes: > > > "Michael S. Tsirkin" <mst@xxxxxxxxxx> writes: > > > >> On Thu, Mar 07, 2013 at 08:57:52PM +0100, Markus Armbruster wrote: > >>> "Michael S. Tsirkin" <mst@xxxxxxxxxx> writes: > >>> > >>> > libvirt has a long-standing bug: when removing the device, > >>> > it can request removal but does not know when the > >>> > removal completes. Add an event so we can fix this in a robust way. > >>> > > >>> > Signed-off-by: Michael S. Tsirkin <mst@xxxxxxxxxx> > >>> > >>> Speaking as the acting QMP maintainer, just to avoid misunderstandings: > >>> there's disagreement on the event's design, namely when it should fire, > >>> and how it should name the device. I don't want the discussion > >>> preempted by a commit. > >> > >> Yes, you are asking for more functionality, but can I add this in a > >> follow-up commit please? I prefer this patch as is, as it can be > >> backported to stable branches and downstreams. Upstream a follow up > >> patch can add fields and more triggers which won't apply to any > >> downstreams. > > > > If you want to address my review comments in a separate patch, go right > > ahead. Please post both together as a series, for coherent review and > > to simplify patch tracking. > > > > I'm asking for two things: > > > > 1. Event member path. Fair to call this "more functionality". I agree > > that backporting it to pre-QOM versions isn't practical. > > > > 2. Sane event trigger condition: on any device deletion, not just when > > the device happens to have a qdev ID. This isn't "more", it's > > "different". > > Ack. > > Regards, > > Anthony Liguori So how does one get the path that you require? ERROR:qom/object.c:1011:object_get_canonical_path: assertion failed: (prop != NULL) Program received signal SIGABRT, Aborted. [Switching to Thread 0x7fffeffff700 (LWP 29475)] 0x00007ffff587d8a5 in raise () from /lib64/libc.so.6 Missing separate debuginfos, use: debuginfo-install SDL-1.2.14-2.el6.x86_64 glib2-2.22.5-6.el6.x86_64 glibc-2.12-1.80.el6_3.3.x86_64 libX11-1.3-2.el6.x86_64 libXau-1.0.5-1.el6.x86_64 libpng-1.2.48-1.el6_2.x86_64 libxcb-1.5-1.el6.x86_64 ncurses-libs-5.7-3.20090208.el6.x86_64 pixman-0.18.4-1.el6_0.1.x86_64 zlib-1.2.3-27.el6.x86_64 (gdb) where #0 0x00007ffff587d8a5 in raise () from /lib64/libc.so.6 #1 0x00007ffff587f085 in abort () from /lib64/libc.so.6 #2 0x00007ffff737ca7f in g_assertion_message () from /lib64/libglib-2.0.so.0 #3 0x00007ffff737d020 in g_assertion_message_expr () from /lib64/libglib-2.0.so.0 #4 0x00007ffff7deef76 in object_get_canonical_path (obj=0x7ffff8f1a010) at qom/object.c:1011 #5 0x00007ffff7d7abcd in device_unparent (obj=0x7ffff8f1a010) at hw/qdev.c:785 #6 0x00007ffff7dee30f in object_unparent (obj=0x7ffff8f1a010) at qom/object.c:370 #7 0x00007ffff7d093b0 in acpi_piix_eject_slot (s=0x7ffff8ed6bd0, slots=<value optimized out>) at hw/acpi_piix4.c:306 #8 0x00007ffff7e7ae20 in access_with_adjusted_size (addr=8, value=0x7fffefffec88, size=4, access_size_min=<value optimized out>, access_size_max=<value optimized out>, access= 0x7ffff7e7c590 <memory_region_write_accessor>, opaque=0x7ffff8ed73d8) at /home/mst/scm/qemu/memory.c:364 #9 0x00007ffff7e7b44b in memory_region_iorange_write (iorange=<value optimized out>, offset=<value optimized out>, width=<value optimized out>, data=128) at /home/mst/scm/qemu/memory.c:439 #10 0x00007ffff7e7a39c in kvm_handle_io (env=0x7ffff8d27a80) at /home/mst/scm/qemu/kvm-all.c:1432 #11 kvm_cpu_exec (env=0x7ffff8d27a80) at /home/mst/scm/qemu/kvm-all.c:1581 #12 0x00007ffff7e28971 in qemu_kvm_cpu_thread_fn (arg=0x7ffff8d27a80) at /home/mst/scm/qemu/cpus.c:759 #13 0x00007ffff681f851 in start_thread () from /lib64/libpthread.so.0 #14 0x00007ffff59326dd in clone () from /lib64/libc.so.6 (gdb) frame 4 #4 0x00007ffff7deef76 in object_get_canonical_path (obj=0x7ffff8f1a010) at qom/object.c:1011 1011 g_assert(prop != NULL); (gdb) p obj $1 = (Object *) 0x7ffff8f1a010 (gdb) p (DeviceState*)obj $2 = (DeviceState *) 0x7ffff8f1a010 (gdb) p $2 $3 = (DeviceState *) 0x7ffff8f1a010 (gdb) p *$2 $4 = {parent_obj = {class = 0x7ffff8ede8f0, free = 0x7ffff735f5b0 <g_free>, properties = { tqh_first = 0x7ffff8eec8a0, tqh_last = 0x7ffff8f1dc00}, ref = 1, parent = 0x7ffff8c81d00}, id = 0x7ffff8ba6710 "bah", realized = true, opts = 0x7ffff8ba66c0, hotplugged = 0, parent_bus = 0x0, num_gpio_out = 0, gpio_out = 0x0, num_gpio_in = 0, gpio_in = 0x0, child_bus = {lh_first = 0x0}, num_child_bus = 0, instance_id_alias = -1, alias_required_for_version = 0} (gdb) $5 = {parent_obj = {class = 0x7ffff8ede8f0, free = 0x7ffff735f5b0 <g_free>, properties = { tqh_first = 0x7ffff8eec8a0, tqh_last = 0x7ffff8f1dc00}, ref = 1, parent = 0x7ffff8c81d00}, id = 0x7ffff8ba6710 "bah", realized = true, opts = 0x7ffff8ba66c0, hotplugged = 0, parent_bus = 0x0, num_gpio_out = 0, gpio_out = 0x0, num_gpio_in = 0, gpio_in = 0x0, child_bus = {lh_first = 0x0}, num_child_bus = 0, instance_id_alias = -1, alias_required_for_version = 0} (gdb) $6 = {parent_obj = {class = 0x7ffff8ede8f0, free = 0x7ffff735f5b0 <g_free>, properties = { tqh_first = 0x7ffff8eec8a0, tqh_last = 0x7ffff8f1dc00}, ref = 1, parent = 0x7ffff8c81d00}, id = 0x7ffff8ba6710 "bah", realized = true, opts = 0x7ffff8ba66c0, hotplugged = 0, parent_bus = 0x0, num_gpio_out = 0, gpio_out = 0x0, num_gpio_in = 0, gpio_in = 0x0, child_bus = {lh_first = 0x0}, num_child_bus = 0, instance_id_alias = -1, alias_required_for_version = 0} -- MST -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list