vhost: fix virtqueues metadata allocation
The Vhost-user backend implementation assumes there will be no holes in the device's array of virtqueues metadata pointers. It can happen though, and would cause segmentation faults, memory leaks or undefined behaviour. This patch keep the assumption that there is no holes in this array, and allocate all uninitialized virtqueues metadata up to requested index. Fixes: 160cbc815b41 ("vhost: remove a hack on queue allocation") Cc: stable@dpdk.org Suggested-by: Adrian Moreno <amorenoz@redhat.com> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
This commit is contained in:
parent
d4fbb27459
commit
8acd7c2133
@ -579,22 +579,29 @@ int
|
||||
alloc_vring_queue(struct virtio_net *dev, uint32_t vring_idx)
|
||||
{
|
||||
struct vhost_virtqueue *vq;
|
||||
uint32_t i;
|
||||
|
||||
/* Also allocate holes, if any, up to requested vring index. */
|
||||
for (i = 0; i <= vring_idx; i++) {
|
||||
if (dev->virtqueue[i])
|
||||
continue;
|
||||
|
||||
vq = rte_malloc(NULL, sizeof(struct vhost_virtqueue), 0);
|
||||
if (vq == NULL) {
|
||||
VHOST_LOG_CONFIG(ERR,
|
||||
"Failed to allocate memory for vring:%u.\n", vring_idx);
|
||||
"Failed to allocate memory for vring:%u.\n", i);
|
||||
return -1;
|
||||
}
|
||||
|
||||
dev->virtqueue[vring_idx] = vq;
|
||||
dev->virtqueue[i] = vq;
|
||||
init_vring_queue(dev, vring_idx);
|
||||
rte_spinlock_init(&vq->access_lock);
|
||||
vq->avail_wrap_counter = 1;
|
||||
vq->used_wrap_counter = 1;
|
||||
vq->signalled_used_valid = false;
|
||||
}
|
||||
|
||||
dev->nr_vring += 1;
|
||||
dev->nr_vring = RTE_MAX(dev->nr_vring, vring_idx + 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user