[Qemu-devel] [PATCH] virtio-pci: fix memory MR cleanup for modern
Each memory_region_add_subregion must be paired with memory_region_del_subregion. Signed-off-by: Michael S. Tsirkin --- hw/virtio/virtio-pci.c | 15 +++ 1 file changed, 15 insertions(+) diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index db8f27c..c024161 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -1414,6 +1414,13 @@ static void virtio_pci_modern_region_map(VirtIOPCIProxy *proxy, virtio_pci_add_mem_cap(proxy, cap); } +static void virtio_pci_modern_region_unmap(VirtIOPCIProxy *proxy, + VirtIOPCIRegion *region) +{ +memory_region_del_subregion(&proxy->modern_bar, +®ion->mr); +} + /* This is called by virtio-bus just after the device is plugged. */ static void virtio_pci_device_plugged(DeviceState *d, Error **errp) { @@ -1520,8 +1527,16 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp) static void virtio_pci_device_unplugged(DeviceState *d) { VirtIOPCIProxy *proxy = VIRTIO_PCI(d); +bool modern = !(proxy->flags & VIRTIO_PCI_FLAG_DISABLE_MODERN); virtio_pci_stop_ioeventfd(proxy); + +if (modern) { +virtio_pci_modern_region_unmap(proxy, &proxy->common); +virtio_pci_modern_region_unmap(proxy, &proxy->isr); +virtio_pci_modern_region_unmap(proxy, &proxy->device); +virtio_pci_modern_region_unmap(proxy, &proxy->notify); +} } static void virtio_pci_realize(PCIDevice *pci_dev, Error **errp) -- MST
Re: [Qemu-devel] [PATCH] virtio-pci: fix memory MR cleanup for modern
On 27/07/2015 15:24, Michael S. Tsirkin wrote: > +static void virtio_pci_modern_region_unmap(VirtIOPCIProxy *proxy, > + VirtIOPCIRegion *region) > +{ > +memory_region_del_subregion(&proxy->modern_bar, > +®ion->mr); > +} > + > /* This is called by virtio-bus just after the device is plugged. */ > static void virtio_pci_device_plugged(DeviceState *d, Error **errp) > { > @@ -1520,8 +1527,16 @@ static void virtio_pci_device_plugged(DeviceState *d, > Error **errp) > static void virtio_pci_device_unplugged(DeviceState *d) > { > VirtIOPCIProxy *proxy = VIRTIO_PCI(d); > +bool modern = !(proxy->flags & VIRTIO_PCI_FLAG_DISABLE_MODERN); > > virtio_pci_stop_ioeventfd(proxy); > + > +if (modern) { > +virtio_pci_modern_region_unmap(proxy, &proxy->common); > +virtio_pci_modern_region_unmap(proxy, &proxy->isr); > +virtio_pci_modern_region_unmap(proxy, &proxy->device); > +virtio_pci_modern_region_unmap(proxy, &proxy->notify); > +} > } Actually this is not necessary. memory_region_del_subregion is only needed inasmuch as it prevents further guest access to the region, so it's enough that the toplevel region (the modern_bar itself) is unmapped. The PCI core does that automatically. That said, it's polite to unmap everything, so if you want this patch: Reviewed-by: Paolo Bonzini Paolo
Re: [Qemu-devel] [PATCH] virtio-pci: fix memory MR cleanup for modern
On 27/07/2015 15:30, Paolo Bonzini wrote: > > > On 27/07/2015 15:24, Michael S. Tsirkin wrote: >> +static void virtio_pci_modern_region_unmap(VirtIOPCIProxy *proxy, >> + VirtIOPCIRegion *region) >> +{ >> +memory_region_del_subregion(&proxy->modern_bar, >> +®ion->mr); >> +} >> + >> /* This is called by virtio-bus just after the device is plugged. */ >> static void virtio_pci_device_plugged(DeviceState *d, Error **errp) >> { >> @@ -1520,8 +1527,16 @@ static void virtio_pci_device_plugged(DeviceState *d, >> Error **errp) >> static void virtio_pci_device_unplugged(DeviceState *d) >> { >> VirtIOPCIProxy *proxy = VIRTIO_PCI(d); >> +bool modern = !(proxy->flags & VIRTIO_PCI_FLAG_DISABLE_MODERN); >> >> virtio_pci_stop_ioeventfd(proxy); >> + >> +if (modern) { >> +virtio_pci_modern_region_unmap(proxy, &proxy->common); >> +virtio_pci_modern_region_unmap(proxy, &proxy->isr); >> +virtio_pci_modern_region_unmap(proxy, &proxy->device); >> +virtio_pci_modern_region_unmap(proxy, &proxy->notify); >> +} >> } > > Actually this is not necessary. memory_region_del_subregion is only > needed inasmuch as it prevents further guest access to the region, so > it's enough that the toplevel region (the modern_bar itself) is > unmapped. The PCI core does that automatically. > > That said, it's polite to unmap everything, so if you want this patch: > > Reviewed-by: Paolo Bonzini After discussing on IRC the problem (which is that memory_region_add_subregion add a reference to the VirtioPCIProxy object, and you want to remove it), this is indeed the correct fix. Paolo