block/nvme: Only report VFIO error on failed retry
We expect the first qemu_vfio_dma_map() to fail (indicating
DMA mappings exhaustion, see commit 15a730e7a3
). Do not
report the first failure as error, since we are going to
flush the mappings and retry.
This removes spurious error message displayed on the monitor:
(qemu) c
(qemu) qemu-kvm: VFIO_MAP_DMA failed: No space left on device
(qemu) info status
VM status: running
Reported-by: Tingting Mao <timao@redhat.com>
Reviewed-by: Klaus Jensen <k.jensen@samsung.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-id: 20210902070025.197072-12-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
f38b376d42
commit
9bd2788f49
@ -1019,6 +1019,7 @@ static coroutine_fn int nvme_cmd_map_qiov(BlockDriverState *bs, NvmeCmd *cmd,
|
||||
uint64_t *pagelist = req->prp_list_page;
|
||||
int i, j, r;
|
||||
int entries = 0;
|
||||
Error *local_err = NULL, **errp = NULL;
|
||||
|
||||
assert(qiov->size);
|
||||
assert(QEMU_IS_ALIGNED(qiov->size, s->page_size));
|
||||
@ -1031,7 +1032,7 @@ static coroutine_fn int nvme_cmd_map_qiov(BlockDriverState *bs, NvmeCmd *cmd,
|
||||
try_map:
|
||||
r = qemu_vfio_dma_map(s->vfio,
|
||||
qiov->iov[i].iov_base,
|
||||
len, true, &iova, NULL);
|
||||
len, true, &iova, errp);
|
||||
if (r == -ENOSPC) {
|
||||
/*
|
||||
* In addition to the -ENOMEM error, the VFIO_IOMMU_MAP_DMA
|
||||
@ -1066,6 +1067,8 @@ try_map:
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
errp = &local_err;
|
||||
|
||||
goto try_map;
|
||||
}
|
||||
if (r) {
|
||||
@ -1109,6 +1112,9 @@ fail:
|
||||
* because they are already mapped before calling this function; for
|
||||
* temporary mappings, a later nvme_cmd_(un)map_qiov will reclaim by
|
||||
* calling qemu_vfio_dma_reset_temporary when necessary. */
|
||||
if (local_err) {
|
||||
error_reportf_err(local_err, "Cannot map buffer for DMA: ");
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user