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,
> +                                &region->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 <pbonz...@redhat.com>

Paolo

Reply via email to