[dpdk-dev,v2,1/2] net/virtio: make control queue thread-safe
Checks
Commit Message
The virtio_send_command function may be called from app's configuration
routine, but also from an interrupt handler called when live migration is
done on the backup side. So this patch makes control queue thread-safe
first.
Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>
---
v2:
- Use spaces instead of tabs between the code and comments.
- Remove unnecessary parentheses.
---
drivers/net/virtio/virtio_ethdev.c | 7 ++++++-
drivers/net/virtio/virtio_rxtx.c | 1 +
drivers/net/virtio/virtio_rxtx.h | 1 +
3 files changed, 8 insertions(+), 1 deletion(-)
@@ -177,6 +177,8 @@ struct rte_virtio_xstats_name_off {
PMD_INIT_LOG(ERR, "Control queue is not supported.");
return -1;
}
+
+ rte_spinlock_lock(&cvq->sl);
vq = cvq->vq;
head = vq->vq_desc_head_idx;
@@ -184,8 +186,10 @@ struct rte_virtio_xstats_name_off {
"vq->hw->cvq = %p vq = %p",
vq->vq_desc_head_idx, status, vq->hw->cvq, vq);
- if ((vq->vq_free_cnt < ((uint32_t)pkt_num + 2)) || (pkt_num < 1))
+ if (vq->vq_free_cnt < pkt_num + 2 || pkt_num < 1) {
+ rte_spinlock_unlock(&cvq->sl);
return -1;
+ }
memcpy(cvq->virtio_net_hdr_mz->addr, ctrl,
sizeof(struct virtio_pmd_ctrl));
@@ -261,6 +265,7 @@ struct rte_virtio_xstats_name_off {
result = cvq->virtio_net_hdr_mz->addr;
+ rte_spinlock_unlock(&cvq->sl);
return result->status;
}
@@ -407,6 +407,7 @@
struct virtio_hw *hw = dev->data->dev_private;
if (hw->cvq && hw->cvq->vq) {
+ rte_spinlock_init(&hw->cvq->sl);
VIRTQUEUE_DUMP((struct virtqueue *)hw->cvq->vq);
}
}
@@ -84,6 +84,7 @@ struct virtnet_ctl {
rte_iova_t virtio_net_hdr_mem; /**< hdr for each xmit packet */
uint16_t port_id; /**< Device port identifier. */
const struct rte_memzone *mz; /**< mem zone to populate CTL ring. */
+ rte_spinlock_t sl; /**< spinlock for control queue. */
};
int virtio_rxq_vec_setup(struct virtnet_rx *rxvq);