Message ID | 1419411417-23354-1-git-send-email-liang.z.li@intel.com |
---|---|
State | New |
Headers | show |
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.li@intel.com> > Reported-by: Longtao Pang <longtaox.pang@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 >
> From: Stefano Stabellini > Sent: Monday, January 12, 2015 7:36 PM > > 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? > agree. Liang, could you elaborate how the patch is associated with above explanation? :-) > > > Signed-off-by: Liang Li <liang.z.li@intel.com> > > Reported-by: Longtao Pang <longtaox.pang@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 > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel
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 = {
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. Signed-off-by: Liang Li <liang.z.li@intel.com> Reported-by: Longtao Pang <longtaox.pang@intel.com> --- hw/xen/xen_pt.c | 4 ---- 1 file changed, 4 deletions(-)