net/mlx5: fix vport index in port action
[dpdk.git] / drivers / net / virtio / virtio_user / virtio_user_dev.c
index fab87eb..a4400e7 100644 (file)
@@ -613,6 +613,10 @@ virtio_user_handle_ctrl_msg(struct virtio_user_dev *dev, struct vring *vring,
 
                queues = *(uint16_t *)(uintptr_t)vring->desc[idx_data].addr;
                status = virtio_user_handle_mq(dev, queues);
+       } else if (hdr->class == VIRTIO_NET_CTRL_RX  ||
+                  hdr->class == VIRTIO_NET_CTRL_MAC ||
+                  hdr->class == VIRTIO_NET_CTRL_VLAN) {
+               status = 0;
        }
 
        /* Update status */
@@ -624,7 +628,7 @@ virtio_user_handle_ctrl_msg(struct virtio_user_dev *dev, struct vring *vring,
 static inline int
 desc_is_avail(struct vring_packed_desc *desc, bool wrap_counter)
 {
-       uint16_t flags = desc->flags;
+       uint16_t flags = __atomic_load_n(&desc->flags, __ATOMIC_ACQUIRE);
 
        return wrap_counter == !!(flags & VRING_PACKED_DESC_F_AVAIL) &&
                wrap_counter != !!(flags & VRING_PACKED_DESC_F_USED);
@@ -664,6 +668,10 @@ virtio_user_handle_ctrl_msg_packed(struct virtio_user_dev *dev,
                queues = *(uint16_t *)(uintptr_t)
                                vring->desc[idx_data].addr;
                status = virtio_user_handle_mq(dev, queues);
+       } else if (hdr->class == VIRTIO_NET_CTRL_RX  ||
+                  hdr->class == VIRTIO_NET_CTRL_MAC ||
+                  hdr->class == VIRTIO_NET_CTRL_VLAN) {
+               status = 0;
        }
 
        /* Update status */
@@ -684,6 +692,10 @@ virtio_user_handle_cq_packed(struct virtio_user_dev *dev, uint16_t queue_idx)
        struct vring_packed *vring = &dev->packed_vrings[queue_idx];
        uint16_t n_descs, flags;
 
+       /* Perform a load-acquire barrier in desc_is_avail to
+        * enforce the ordering between desc flags and desc
+        * content.
+        */
        while (desc_is_avail(&vring->desc[vq->used_idx],
                             vq->used_wrap_counter)) {
 
@@ -694,8 +706,8 @@ virtio_user_handle_cq_packed(struct virtio_user_dev *dev, uint16_t queue_idx)
                if (vq->used_wrap_counter)
                        flags |= VRING_PACKED_DESC_F_AVAIL_USED;
 
-               rte_smp_wmb();
-               vring->desc[vq->used_idx].flags = flags;
+               __atomic_store_n(&vring->desc[vq->used_idx].flags, flags,
+                                __ATOMIC_RELEASE);
 
                vq->used_idx += n_descs;
                if (vq->used_idx >= dev->queue_size) {