block/nvme: Let nvme_create_queue_pair() fail gracefully
As nvme_create_queue_pair() is allowed to fail, replace the alloc() calls by try_alloc() to avoid aborting QEMU. Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Stefano Garzarella <sgarzare@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-Id: <20200821195359.1285345-4-philmd@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
e266f52cfb
commit
0ea45f76eb
12
block/nvme.c
12
block/nvme.c
@ -213,14 +213,22 @@ static NVMeQueuePair *nvme_create_queue_pair(BlockDriverState *bs,
|
|||||||
int i, r;
|
int i, r;
|
||||||
BDRVNVMeState *s = bs->opaque;
|
BDRVNVMeState *s = bs->opaque;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
NVMeQueuePair *q = g_new0(NVMeQueuePair, 1);
|
NVMeQueuePair *q;
|
||||||
uint64_t prp_list_iova;
|
uint64_t prp_list_iova;
|
||||||
|
|
||||||
|
q = g_try_new0(NVMeQueuePair, 1);
|
||||||
|
if (!q) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
q->prp_list_pages = qemu_try_blockalign0(bs,
|
||||||
|
s->page_size * NVME_NUM_REQS);
|
||||||
|
if (!q->prp_list_pages) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
qemu_mutex_init(&q->lock);
|
qemu_mutex_init(&q->lock);
|
||||||
q->s = s;
|
q->s = s;
|
||||||
q->index = idx;
|
q->index = idx;
|
||||||
qemu_co_queue_init(&q->free_req_queue);
|
qemu_co_queue_init(&q->free_req_queue);
|
||||||
q->prp_list_pages = qemu_blockalign0(bs, s->page_size * NVME_NUM_REQS);
|
|
||||||
q->completion_bh = aio_bh_new(bdrv_get_aio_context(bs),
|
q->completion_bh = aio_bh_new(bdrv_get_aio_context(bs),
|
||||||
nvme_process_completion_bh, q);
|
nvme_process_completion_bh, q);
|
||||||
r = qemu_vfio_dma_map(s->vfio, q->prp_list_pages,
|
r = qemu_vfio_dma_map(s->vfio, q->prp_list_pages,
|
||||||
|
Loading…
Reference in New Issue
Block a user