Message ID | 1421116853-10244-1-git-send-email-liang.z.li@intel.com |
---|---|
State | New |
Headers | show |
On Tue, 13 Jan 2015, Liang Li wrote: > Use the 'xl pci-attach $DomU $BDF' command to attach more than > one PCI devices to the guest, then detach the devices with > 'xl pci-detach $DomU $BDF', after that, re-attach these PCI > devices again, an error message will be reported like following: > > libxl: error: libxl_qmp.c:287:qmp_handle_error_response: receive > an error message from QMP server: Duplicate ID 'pci-pt-03_10.1' > for device. > > If using the 'address_space_memory' as the parameter of > 'memory_listener_register', 'xen_pt_region_del' will not be called > if the memory region's name is not 'xen-pci-pt-*' when the devices > is detached. This will cause the device's related QemuOpts object > not be released properly. > > Using the device's address space can avoid such issue, because the > calling count of 'xen_pt_region_add' when attaching and the calling > count of 'xen_pt_region_del' when detaching is the same, so all the > memory region ref and unref by the 'xen_pt_region_add' and > 'xen_pt_region_del' can be released properly. > > Signed-off-by: Liang Li <liang.z.li@intel.com> > Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> > Reported-by: Longtao Pang <longtaox.pang@intel.com> Added to my queue > hw/xen/xen_pt.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/xen/xen_pt.c b/hw/xen/xen_pt.c > index c1bf357..f2893b2 100644 > --- a/hw/xen/xen_pt.c > +++ b/hw/xen/xen_pt.c > @@ -736,7 +736,7 @@ static int xen_pt_initfn(PCIDevice *d) > } > > out: > - memory_listener_register(&s->memory_listener, &address_space_memory); > + memory_listener_register(&s->memory_listener, &s->dev.bus_master_as); > memory_listener_register(&s->io_listener, &address_space_io); > XEN_PT_LOG(d, > "Real physical device %02x:%02x.%d registered successfully!\n", > -- > 1.9.1 >
diff --git a/hw/xen/xen_pt.c b/hw/xen/xen_pt.c index c1bf357..f2893b2 100644 --- a/hw/xen/xen_pt.c +++ b/hw/xen/xen_pt.c @@ -736,7 +736,7 @@ static int xen_pt_initfn(PCIDevice *d) } out: - memory_listener_register(&s->memory_listener, &address_space_memory); + memory_listener_register(&s->memory_listener, &s->dev.bus_master_as); memory_listener_register(&s->io_listener, &address_space_io); XEN_PT_LOG(d, "Real physical device %02x:%02x.%d registered successfully!\n",