git.droids-corp.org
/
dpdk.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
net/virtio: fix kernel set features for multi-queue device
[dpdk.git]
/
examples
/
vhost
/
virtio_net.c
diff --git
a/examples/vhost/virtio_net.c
b/examples/vhost/virtio_net.c
index
8ea6b36
..
9064fc3
100644
(file)
--- a/
examples/vhost/virtio_net.c
+++ b/
examples/vhost/virtio_net.c
@@
-23,6
+23,7
@@
vs_vhost_net_setup(struct vhost_dev *dev)
uint16_t i;
int vid = dev->vid;
struct vhost_queue *queue;
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");
RTE_LOG(INFO, VHOST_CONFIG,
"setting builtin vhost-user net driver\n");
@@
-33,7
+34,12
@@
vs_vhost_net_setup(struct vhost_dev *dev)
else
dev->hdr_len = sizeof(struct virtio_net_hdr);
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++) {
dev->nr_vrings = rte_vhost_get_vring_num(vid);
for (i = 0; i < dev->nr_vrings; i++) {
@@
-191,7
+197,7
@@
vs_enqueue_pkts(struct vhost_dev *dev, uint16_t queue_id,
queue = &dev->queues[queue_id];
vr = &queue->vr;
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);
start_idx = queue->last_used_idx;
free_entries = avail_idx - start_idx;
count = RTE_MIN(count, free_entries);
@@
-224,9
+230,7
@@
vs_enqueue_pkts(struct vhost_dev *dev, uint16_t queue_id,
rte_prefetch0(&vr->desc[desc_indexes[i+1]]);
}
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->last_used_idx += count;
rte_vhost_vring_call(dev->vid, queue_id);
@@
-374,7
+378,7
@@
vs_dequeue_pkts(struct vhost_dev *dev, uint16_t queue_id,
queue = &dev->queues[queue_id];
vr = &queue->vr;
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;
if (free_entries == 0)
return 0;
@@
-429,10
+433,8
@@
vs_dequeue_pkts(struct vhost_dev *dev, uint16_t queue_id,
queue->last_avail_idx += i;
queue->last_used_idx += i;
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);
rte_vhost_vring_call(dev->vid, queue_id);