On Wed, 24 Dec 2014, Liang Li wrote: > Use the 'xl pci-attach $DomU $BDF' command to attach more then > 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. > > The count of calling xen_pt_region_add and xen_pt_region_del are > not the same will cause the XenPCIPassthroughState and it's related > QemuOpts object not be released properly.
Thanks for the patch! >From this description, I don't quite understand why the memory_region_ref and memory_region_unref calls are wrong. What do you mean by "The count of calling xen_pt_region_add and xen_pt_region_del are not the same"? On unplug xen_pt_region_del does not get called? Or the memory region argument is not exactly the same as the one initially passed to xen_pt_region_add? > Signed-off-by: Liang Li <liang.z...@intel.com> > Reported-by: Longtao Pang <longtaox.p...@intel.com> > --- > hw/xen/xen_pt.c | 4 ---- > 1 file changed, 4 deletions(-) > > diff --git a/hw/xen/xen_pt.c b/hw/xen/xen_pt.c > index c1bf357..523b8a2 100644 > --- a/hw/xen/xen_pt.c > +++ b/hw/xen/xen_pt.c > @@ -588,7 +588,6 @@ static void xen_pt_region_add(MemoryListener *l, > MemoryRegionSection *sec) > XenPCIPassthroughState *s = container_of(l, XenPCIPassthroughState, > memory_listener); > > - memory_region_ref(sec->mr); > xen_pt_region_update(s, sec, true); > } > > @@ -598,7 +597,6 @@ static void xen_pt_region_del(MemoryListener *l, > MemoryRegionSection *sec) > memory_listener); > > xen_pt_region_update(s, sec, false); > - memory_region_unref(sec->mr); > } > > static void xen_pt_io_region_add(MemoryListener *l, MemoryRegionSection *sec) > @@ -606,7 +604,6 @@ static void xen_pt_io_region_add(MemoryListener *l, > MemoryRegionSection *sec) > XenPCIPassthroughState *s = container_of(l, XenPCIPassthroughState, > io_listener); > > - memory_region_ref(sec->mr); > xen_pt_region_update(s, sec, true); > } > > @@ -616,7 +613,6 @@ static void xen_pt_io_region_del(MemoryListener *l, > MemoryRegionSection *sec) > io_listener); > > xen_pt_region_update(s, sec, false); > - memory_region_unref(sec->mr); > } > > static const MemoryListener xen_pt_memory_listener = { > -- > 1.9.1 >