uint16_t i;
int vid = dev->vid;
struct vhost_queue *queue;
+ int ret;
RTE_LOG(INFO, VHOST_CONFIG,
"setting builtin vhost-user net driver\n");
else
dev->hdr_len = sizeof(struct virtio_net_hdr);
- rte_vhost_get_mem_table(vid, &dev->mem);
+ ret = rte_vhost_get_mem_table(vid, &dev->mem);
+ if (ret < 0) {
+ RTE_LOG(ERR, VHOST_CONFIG, "Failed to get "
+ "VM memory layout for device(%d)\n", vid);
+ return;
+ }
dev->nr_vrings = rte_vhost_get_vring_num(vid);
for (i = 0; i < dev->nr_vrings; i++) {
queue = &dev->queues[queue_id];
vr = &queue->vr;
- avail_idx = *((volatile uint16_t *)&vr->avail->idx);
+ avail_idx = __atomic_load_n(&vr->avail->idx, __ATOMIC_ACQUIRE);
start_idx = queue->last_used_idx;
free_entries = avail_idx - start_idx;
count = RTE_MIN(count, free_entries);
rte_prefetch0(&vr->desc[desc_indexes[i+1]]);
}
- rte_smp_wmb();
-
- *(volatile uint16_t *)&vr->used->idx += count;
+ __atomic_add_fetch(&vr->used->idx, count, __ATOMIC_RELEASE);
queue->last_used_idx += count;
rte_vhost_vring_call(dev->vid, queue_id);
queue = &dev->queues[queue_id];
vr = &queue->vr;
- free_entries = *((volatile uint16_t *)&vr->avail->idx) -
+ free_entries = __atomic_load_n(&vr->avail->idx, __ATOMIC_ACQUIRE) -
queue->last_avail_idx;
if (free_entries == 0)
return 0;
queue->last_avail_idx += i;
queue->last_used_idx += i;
- rte_smp_wmb();
- rte_smp_rmb();
- vr->used->idx += i;
+ __atomic_add_fetch(&vr->used->idx, i, __ATOMIC_ACQ_REL);
rte_vhost_vring_call(dev->vid, queue_id);