On 17/09/2015 15:09, David Gibson wrote:
> If a DMA mapping operation fails in vfio_listener_region_add() it
> checks to see if we've already completed initial setup of the
> container. If so it reports an error so the setup code can fail
> gracefully, otherwise throws a hw_error().
>
> There are other potential failure cases in vfio_listener_region_add()
> which could benefit from the same logic, so move it to its own
> fail: block. Later patches can use this to extend other failure cases
> to fail as gracefully as possible under the circumstances.
>
> Signed-off-by: David Gibson <da...@gibson.dropbear.id.au>
> ---
> hw/vfio/common.c | 26 +++++++++++++++-----------
> 1 file changed, 15 insertions(+), 11 deletions(-)
>
> diff --git a/hw/vfio/common.c b/hw/vfio/common.c
> index e3152f6..9953b9c 100644
> --- a/hw/vfio/common.c
> +++ b/hw/vfio/common.c
> @@ -400,19 +400,23 @@ static void vfio_listener_region_add(MemoryListener
> *listener,
> error_report("vfio_dma_map(%p, 0x%"HWADDR_PRIx", "
> "0x%"HWADDR_PRIx", %p) = %d (%m)",
> container, iova, end - iova, vaddr, ret);
> + goto fail;
> + }
>
> - /*
> - * On the initfn path, store the first error in the container so we
> - * can gracefully fail. Runtime, there's not much we can do other
> - * than throw a hardware error.
> - */
> - if (!container->iommu_data.initialized) {
> - if (!container->iommu_data.error) {
> - container->iommu_data.error = ret;
> - }
> - } else {
> - hw_error("vfio: DMA mapping failed, unable to continue");
> + return;
> +
> +fail:
> + /*
> + * On the initfn path, store the first error in the container so we
> + * can gracefully fail. Runtime, there's not much we can do other
> + * than throw a hardware error.
> + */
> + if (!container->iommu_data.initialized) {
> + if (!container->iommu_data.error) {
> + container->iommu_data.error = ret;
> }
> + } else {
> + hw_error("vfio: DMA mapping failed, unable to continue");
> }
> }
>
>
Reviewed-by: Laurent Vivier <lviv...@redhat.com>