Hi Maxime, > -----Original Message----- > From: Maxime Coquelin <maxime.coque...@redhat.com> > Sent: Tuesday, December 22, 2020 12:15 AM > To: dev@dpdk.org; Xia, Chenbo <chenbo....@intel.com>; amore...@redhat.com; > david.march...@redhat.com; olivier.m...@6wind.com > Cc: Maxime Coquelin <maxime.coque...@redhat.com> > Subject: [PATCH 1/3] net/virtio: remove reference to virtqueue in vrings > > Vrings are part of the virtqueues, so we don't need > to have a pointer to it in Vrings descriptions. > > Instead, let's just substract from its offset to
Subtract? With above fixed: Reviewed-by: Chenbo Xia <chenbo....@intel.com> > calculate virtqueue address. > > Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com> > --- > drivers/net/virtio/virtio_ethdev.c | 36 +++++++++---------- > drivers/net/virtio/virtio_rxtx.c | 28 +++++++-------- > drivers/net/virtio/virtio_rxtx.h | 3 -- > drivers/net/virtio/virtio_rxtx_packed_avx.c | 14 ++++---- > drivers/net/virtio/virtio_rxtx_simple.h | 2 +- > .../net/virtio/virtio_rxtx_simple_altivec.c | 2 +- > drivers/net/virtio/virtio_rxtx_simple_neon.c | 2 +- > drivers/net/virtio/virtio_rxtx_simple_sse.c | 2 +- > .../net/virtio/virtio_user/virtio_user_dev.c | 4 +-- > drivers/net/virtio/virtio_user_ethdev.c | 2 +- > drivers/net/virtio/virtqueue.h | 6 +++- > 11 files changed, 49 insertions(+), 52 deletions(-) > > diff --git a/drivers/net/virtio/virtio_ethdev.c > b/drivers/net/virtio/virtio_ethdev.c > index 96871b7b70..297c01a70d 100644 > --- a/drivers/net/virtio/virtio_ethdev.c > +++ b/drivers/net/virtio/virtio_ethdev.c > @@ -133,7 +133,7 @@ virtio_send_command_packed(struct virtnet_ctl *cvq, > struct virtio_pmd_ctrl *ctrl, > int *dlen, int pkt_num) > { > - struct virtqueue *vq = cvq->vq; > + struct virtqueue *vq = virtnet_cq_to_vq(cvq); > int head; > struct vring_packed_desc *desc = vq->vq_packed.ring.desc; > struct virtio_pmd_ctrl *result; > @@ -229,7 +229,7 @@ virtio_send_command_split(struct virtnet_ctl *cvq, > int *dlen, int pkt_num) > { > struct virtio_pmd_ctrl *result; > - struct virtqueue *vq = cvq->vq; > + struct virtqueue *vq = virtnet_cq_to_vq(cvq); > uint32_t head, i; > int k, sum = 0; > > @@ -316,13 +316,13 @@ virtio_send_command(struct virtnet_ctl *cvq, struct > virtio_pmd_ctrl *ctrl, > > ctrl->status = status; > > - if (!cvq || !cvq->vq) { > + if (!cvq) { > PMD_INIT_LOG(ERR, "Control queue is not supported."); > return -1; > } > > rte_spinlock_lock(&cvq->lock); > - vq = cvq->vq; > + vq = virtnet_cq_to_vq(cvq); > > PMD_INIT_LOG(DEBUG, "vq->vq_desc_head_idx = %d, status = %d, " > "vq->hw->cvq = %p vq = %p", > @@ -552,19 +552,16 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t > queue_idx) > > vq->sw_ring = sw_ring; > rxvq = &vq->rxq; > - rxvq->vq = vq; > rxvq->port_id = dev->data->port_id; > rxvq->mz = mz; > } else if (queue_type == VTNET_TQ) { > txvq = &vq->txq; > - txvq->vq = vq; > txvq->port_id = dev->data->port_id; > txvq->mz = mz; > txvq->virtio_net_hdr_mz = hdr_mz; > txvq->virtio_net_hdr_mem = hdr_mz->iova; > } else if (queue_type == VTNET_CQ) { > cvq = &vq->cq; > - cvq->vq = vq; > cvq->mz = mz; > cvq->virtio_net_hdr_mz = hdr_mz; > cvq->virtio_net_hdr_mem = hdr_mz->iova; > @@ -851,7 +848,7 @@ virtio_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, > uint16_t queue_id) > { > struct virtio_hw *hw = dev->data->dev_private; > struct virtnet_rx *rxvq = dev->data->rx_queues[queue_id]; > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > > virtqueue_enable_intr(vq); > virtio_mb(hw->weak_barriers); > @@ -862,7 +859,7 @@ static int > virtio_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id) > { > struct virtnet_rx *rxvq = dev->data->rx_queues[queue_id]; > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > > virtqueue_disable_intr(vq); > return 0; > @@ -2159,8 +2156,7 @@ static int > virtio_dev_start(struct rte_eth_dev *dev) > { > uint16_t nb_queues, i; > - struct virtnet_rx *rxvq; > - struct virtnet_tx *txvq __rte_unused; > + struct virtqueue *vq; > struct virtio_hw *hw = dev->data->dev_private; > int ret; > > @@ -2217,27 +2213,27 @@ virtio_dev_start(struct rte_eth_dev *dev) > PMD_INIT_LOG(DEBUG, "nb_queues=%d", nb_queues); > > for (i = 0; i < dev->data->nb_rx_queues; i++) { > - rxvq = dev->data->rx_queues[i]; > + vq = virtnet_rxq_to_vq(dev->data->rx_queues[i]); > /* Flush the old packets */ > - virtqueue_rxvq_flush(rxvq->vq); > - virtqueue_notify(rxvq->vq); > + virtqueue_rxvq_flush(vq); > + virtqueue_notify(vq); > } > > for (i = 0; i < dev->data->nb_tx_queues; i++) { > - txvq = dev->data->tx_queues[i]; > - virtqueue_notify(txvq->vq); > + vq = virtnet_txq_to_vq(dev->data->tx_queues[i]); > + virtqueue_notify(vq); > } > > PMD_INIT_LOG(DEBUG, "Notified backend at initialization"); > > for (i = 0; i < dev->data->nb_rx_queues; i++) { > - rxvq = dev->data->rx_queues[i]; > - VIRTQUEUE_DUMP(rxvq->vq); > + vq = virtnet_rxq_to_vq(dev->data->rx_queues[i]); > + VIRTQUEUE_DUMP(vq); > } > > for (i = 0; i < dev->data->nb_tx_queues; i++) { > - txvq = dev->data->tx_queues[i]; > - VIRTQUEUE_DUMP(txvq->vq); > + vq = virtnet_txq_to_vq(dev->data->tx_queues[i]); > + VIRTQUEUE_DUMP(vq); > } > > set_rxtx_funcs(dev); > diff --git a/drivers/net/virtio/virtio_rxtx.c > b/drivers/net/virtio/virtio_rxtx.c > index aca6eb9cd0..1fcce36cbd 100644 > --- a/drivers/net/virtio/virtio_rxtx.c > +++ b/drivers/net/virtio/virtio_rxtx.c > @@ -43,7 +43,7 @@ int > virtio_dev_rx_queue_done(void *rxq, uint16_t offset) > { > struct virtnet_rx *rxvq = rxq; > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > > return virtqueue_nused(vq) >= offset; > } > @@ -424,7 +424,7 @@ virtqueue_enqueue_xmit_inorder(struct virtnet_tx *txvq, > uint16_t num) > { > struct vq_desc_extra *dxp; > - struct virtqueue *vq = txvq->vq; > + struct virtqueue *vq = virtnet_txq_to_vq(txvq); > struct vring_desc *start_dp; > struct virtio_net_hdr *hdr; > uint16_t idx; > @@ -470,7 +470,7 @@ virtqueue_enqueue_xmit_packed_fast(struct virtnet_tx > *txvq, > struct rte_mbuf *cookie, > int in_order) > { > - struct virtqueue *vq = txvq->vq; > + struct virtqueue *vq = virtnet_txq_to_vq(txvq); > struct vring_packed_desc *dp; > struct vq_desc_extra *dxp; > uint16_t idx, id, flags; > @@ -524,7 +524,7 @@ virtqueue_enqueue_xmit(struct virtnet_tx *txvq, struct > rte_mbuf *cookie, > { > struct virtio_tx_region *txr = txvq->virtio_net_hdr_mz->addr; > struct vq_desc_extra *dxp; > - struct virtqueue *vq = txvq->vq; > + struct virtqueue *vq = virtnet_txq_to_vq(txvq); > struct vring_desc *start_dp; > uint16_t seg_num = cookie->nb_segs; > uint16_t head_idx, idx; > @@ -614,9 +614,9 @@ virtio_dev_cq_start(struct rte_eth_dev *dev) > { > struct virtio_hw *hw = dev->data->dev_private; > > - if (hw->cvq && hw->cvq->vq) { > + if (hw->cvq) { > rte_spinlock_init(&hw->cvq->lock); > - VIRTQUEUE_DUMP((struct virtqueue *)hw->cvq->vq); > + VIRTQUEUE_DUMP(virtnet_cq_to_vq(hw->cvq)); > } > } > > @@ -948,7 +948,7 @@ uint16_t > virtio_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) > { > struct virtnet_rx *rxvq = rx_queue; > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > struct virtio_hw *hw = vq->hw; > struct rte_mbuf *rxm; > uint16_t nb_used, num, nb_rx; > @@ -1055,7 +1055,7 @@ virtio_recv_pkts_packed(void *rx_queue, struct rte_mbuf > **rx_pkts, > uint16_t nb_pkts) > { > struct virtnet_rx *rxvq = rx_queue; > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > struct virtio_hw *hw = vq->hw; > struct rte_mbuf *rxm; > uint16_t num, nb_rx; > @@ -1158,7 +1158,7 @@ virtio_recv_pkts_inorder(void *rx_queue, > uint16_t nb_pkts) > { > struct virtnet_rx *rxvq = rx_queue; > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > struct virtio_hw *hw = vq->hw; > struct rte_mbuf *rxm; > struct rte_mbuf *prev = NULL; > @@ -1342,7 +1342,7 @@ virtio_recv_mergeable_pkts(void *rx_queue, > uint16_t nb_pkts) > { > struct virtnet_rx *rxvq = rx_queue; > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > struct virtio_hw *hw = vq->hw; > struct rte_mbuf *rxm; > struct rte_mbuf *prev = NULL; > @@ -1520,7 +1520,7 @@ virtio_recv_mergeable_pkts_packed(void *rx_queue, > uint16_t nb_pkts) > { > struct virtnet_rx *rxvq = rx_queue; > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > struct virtio_hw *hw = vq->hw; > struct rte_mbuf *rxm; > struct rte_mbuf *prev = NULL; > @@ -1731,7 +1731,7 @@ virtio_xmit_pkts_packed(void *tx_queue, struct rte_mbuf > **tx_pkts, > uint16_t nb_pkts) > { > struct virtnet_tx *txvq = tx_queue; > - struct virtqueue *vq = txvq->vq; > + struct virtqueue *vq = virtnet_txq_to_vq(txvq); > struct virtio_hw *hw = vq->hw; > uint16_t hdr_size = hw->vtnet_hdr_size; > uint16_t nb_tx = 0; > @@ -1812,7 +1812,7 @@ uint16_t > virtio_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) > { > struct virtnet_tx *txvq = tx_queue; > - struct virtqueue *vq = txvq->vq; > + struct virtqueue *vq = virtnet_txq_to_vq(txvq); > struct virtio_hw *hw = vq->hw; > uint16_t hdr_size = hw->vtnet_hdr_size; > uint16_t nb_used, nb_tx = 0; > @@ -1912,7 +1912,7 @@ virtio_xmit_pkts_inorder(void *tx_queue, > uint16_t nb_pkts) > { > struct virtnet_tx *txvq = tx_queue; > - struct virtqueue *vq = txvq->vq; > + struct virtqueue *vq = virtnet_txq_to_vq(txvq); > struct virtio_hw *hw = vq->hw; > uint16_t hdr_size = hw->vtnet_hdr_size; > uint16_t nb_used, nb_tx = 0, nb_inorder_pkts = 0; > diff --git a/drivers/net/virtio/virtio_rxtx.h > b/drivers/net/virtio/virtio_rxtx.h > index 1eb8dae227..7f1036be6f 100644 > --- a/drivers/net/virtio/virtio_rxtx.h > +++ b/drivers/net/virtio/virtio_rxtx.h > @@ -18,7 +18,6 @@ struct virtnet_stats { > }; > > struct virtnet_rx { > - struct virtqueue *vq; > /* dummy mbuf, for wraparound when processing RX ring. */ > struct rte_mbuf fake_mbuf; > uint64_t mbuf_initializer; /**< value to init mbufs. */ > @@ -34,7 +33,6 @@ struct virtnet_rx { > }; > > struct virtnet_tx { > - struct virtqueue *vq; > /**< memzone to populate hdr. */ > const struct rte_memzone *virtio_net_hdr_mz; > rte_iova_t virtio_net_hdr_mem; /**< hdr for each xmit packet */ > @@ -49,7 +47,6 @@ struct virtnet_tx { > }; > > struct virtnet_ctl { > - struct virtqueue *vq; > /**< memzone to populate hdr. */ > const struct rte_memzone *virtio_net_hdr_mz; > rte_iova_t virtio_net_hdr_mem; /**< hdr for each xmit packet */ > diff --git a/drivers/net/virtio/virtio_rxtx_packed_avx.c > b/drivers/net/virtio/virtio_rxtx_packed_avx.c > index a3dcc01a43..31f6eac340 100644 > --- a/drivers/net/virtio/virtio_rxtx_packed_avx.c > +++ b/drivers/net/virtio/virtio_rxtx_packed_avx.c > @@ -82,7 +82,7 @@ static inline int > virtqueue_enqueue_batch_packed_vec(struct virtnet_tx *txvq, > struct rte_mbuf **tx_pkts) > { > - struct virtqueue *vq = txvq->vq; > + struct virtqueue *vq = virtnet_txq_to_vq(txvq); > uint16_t head_size = vq->hw->vtnet_hdr_size; > uint16_t idx = vq->vq_avail_idx; > struct virtio_net_hdr *hdr; > @@ -204,7 +204,7 @@ static inline int > virtqueue_enqueue_single_packed_vec(struct virtnet_tx *txvq, > struct rte_mbuf *txm) > { > - struct virtqueue *vq = txvq->vq; > + struct virtqueue *vq = virtnet_txq_to_vq(txvq); > struct virtio_hw *hw = vq->hw; > uint16_t hdr_size = hw->vtnet_hdr_size; > uint16_t slots, can_push = 0, use_indirect = 0; > @@ -253,7 +253,7 @@ virtio_xmit_pkts_packed_vec(void *tx_queue, struct > rte_mbuf **tx_pkts, > uint16_t nb_pkts) > { > struct virtnet_tx *txvq = tx_queue; > - struct virtqueue *vq = txvq->vq; > + struct virtqueue *vq = virtnet_txq_to_vq(txvq); > struct virtio_hw *hw = vq->hw; > uint16_t nb_tx = 0; > uint16_t remained; > @@ -358,7 +358,7 @@ static inline uint16_t > virtqueue_dequeue_batch_packed_vec(struct virtnet_rx *rxvq, > struct rte_mbuf **rx_pkts) > { > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > struct virtio_hw *hw = vq->hw; > uint16_t hdr_size = hw->vtnet_hdr_size; > uint64_t addrs[PACKED_BATCH_SIZE]; > @@ -460,7 +460,7 @@ virtqueue_dequeue_single_packed_vec(struct virtnet_rx > *rxvq, > { > uint16_t used_idx, id; > uint32_t len; > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > struct virtio_hw *hw = vq->hw; > uint32_t hdr_size = hw->vtnet_hdr_size; > struct virtio_net_hdr *hdr; > @@ -512,7 +512,7 @@ virtio_recv_refill_packed_vec(struct virtnet_rx *rxvq, > struct rte_mbuf **cookie, > uint16_t num) > { > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > struct vring_packed_desc *start_dp = vq->vq_packed.ring.desc; > uint16_t flags = vq->vq_packed.cached_flags; > struct virtio_hw *hw = vq->hw; > @@ -568,7 +568,7 @@ virtio_recv_pkts_packed_vec(void *rx_queue, > uint16_t nb_pkts) > { > struct virtnet_rx *rxvq = rx_queue; > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > struct virtio_hw *hw = vq->hw; > uint16_t num, nb_rx = 0; > uint32_t nb_enqueued = 0; > diff --git a/drivers/net/virtio/virtio_rxtx_simple.h > b/drivers/net/virtio/virtio_rxtx_simple.h > index f2a5aedf97..f258771fcf 100644 > --- a/drivers/net/virtio/virtio_rxtx_simple.h > +++ b/drivers/net/virtio/virtio_rxtx_simple.h > @@ -23,7 +23,7 @@ virtio_rxq_rearm_vec(struct virtnet_rx *rxvq) > struct rte_mbuf **sw_ring; > struct vring_desc *start_dp; > int ret; > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > > desc_idx = vq->vq_avail_idx & (vq->vq_nentries - 1); > sw_ring = &vq->sw_ring[desc_idx]; > diff --git a/drivers/net/virtio/virtio_rxtx_simple_altivec.c > b/drivers/net/virtio/virtio_rxtx_simple_altivec.c > index a260ebdf57..e1f3d8bdca 100644 > --- a/drivers/net/virtio/virtio_rxtx_simple_altivec.c > +++ b/drivers/net/virtio/virtio_rxtx_simple_altivec.c > @@ -41,7 +41,7 @@ virtio_recv_pkts_vec(void *rx_queue, struct rte_mbuf > **rx_pkts, > uint16_t nb_pkts) > { > struct virtnet_rx *rxvq = rx_queue; > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > struct virtio_hw *hw = vq->hw; > uint16_t nb_used, nb_total; > uint16_t desc_idx; > diff --git a/drivers/net/virtio/virtio_rxtx_simple_neon.c > b/drivers/net/virtio/virtio_rxtx_simple_neon.c > index 12e034dc0a..8307dda5a4 100644 > --- a/drivers/net/virtio/virtio_rxtx_simple_neon.c > +++ b/drivers/net/virtio/virtio_rxtx_simple_neon.c > @@ -41,7 +41,7 @@ virtio_recv_pkts_vec(void *rx_queue, > uint16_t nb_pkts) > { > struct virtnet_rx *rxvq = rx_queue; > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > struct virtio_hw *hw = vq->hw; > uint16_t nb_used, nb_total; > uint16_t desc_idx; > diff --git a/drivers/net/virtio/virtio_rxtx_simple_sse.c > b/drivers/net/virtio/virtio_rxtx_simple_sse.c > index 1056e9c20b..c6191ce39e 100644 > --- a/drivers/net/virtio/virtio_rxtx_simple_sse.c > +++ b/drivers/net/virtio/virtio_rxtx_simple_sse.c > @@ -41,7 +41,7 @@ virtio_recv_pkts_vec(void *rx_queue, struct rte_mbuf > **rx_pkts, > uint16_t nb_pkts) > { > struct virtnet_rx *rxvq = rx_queue; > - struct virtqueue *vq = rxvq->vq; > + struct virtqueue *vq = virtnet_rxq_to_vq(rxvq); > struct virtio_hw *hw = vq->hw; > uint16_t nb_used, nb_total; > uint16_t desc_idx; > diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c > b/drivers/net/virtio/virtio_user/virtio_user_dev.c > index 154aecc209..dd60de1d74 100644 > --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c > +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c > @@ -846,13 +846,13 @@ virtio_user_dev_reset_queues_packed(struct rte_eth_dev > *eth_dev) > /* Vring reset for each Tx queue and Rx queue. */ > for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { > rxvq = eth_dev->data->rx_queues[i]; > - virtqueue_rxvq_reset_packed(rxvq->vq); > + virtqueue_rxvq_reset_packed(virtnet_rxq_to_vq(rxvq)); > virtio_dev_rx_queue_setup_finish(eth_dev, i); > } > > for (i = 0; i < eth_dev->data->nb_tx_queues; i++) { > txvq = eth_dev->data->tx_queues[i]; > - virtqueue_txvq_reset_packed(txvq->vq); > + virtqueue_txvq_reset_packed(virtnet_txq_to_vq(txvq)); > } > > hw->started = 1; > diff --git a/drivers/net/virtio/virtio_user_ethdev.c > b/drivers/net/virtio/virtio_user_ethdev.c > index a287805cf2..3b8b14d704 100644 > --- a/drivers/net/virtio/virtio_user_ethdev.c > +++ b/drivers/net/virtio/virtio_user_ethdev.c > @@ -249,7 +249,7 @@ virtio_user_notify_queue(struct virtio_hw *hw, struct > virtqueue *vq) > uint64_t buf = 1; > struct virtio_user_dev *dev = virtio_user_get_dev(hw); > > - if (hw->cvq && (hw->cvq->vq == vq)) { > + if (hw->cvq && (virtnet_cq_to_vq(hw->cvq) == vq)) { > if (virtio_with_packed_queue(vq->hw)) > virtio_user_handle_cq_packed(dev, vq->vq_queue_index); > else > diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h > index 9274c48080..c64e7dcbdf 100644 > --- a/drivers/net/virtio/virtqueue.h > +++ b/drivers/net/virtio/virtqueue.h > @@ -218,6 +218,10 @@ struct vq_desc_extra { > uint16_t next; > }; > > +#define virtnet_rxq_to_vq(rxvq) container_of(rxvq, struct virtqueue, rxq) > +#define virtnet_txq_to_vq(txvq) container_of(txvq, struct virtqueue, txq) > +#define virtnet_cq_to_vq(cvq) container_of(cvq, struct virtqueue, cq) > + > struct virtqueue { > struct virtio_hw *hw; /**< virtio_hw structure pointer. */ > union { > @@ -668,7 +672,7 @@ virtqueue_enqueue_xmit_packed(struct virtnet_tx *txvq, > struct rte_mbuf *cookie, > { > struct virtio_tx_region *txr = txvq->virtio_net_hdr_mz->addr; > struct vq_desc_extra *dxp; > - struct virtqueue *vq = txvq->vq; > + struct virtqueue *vq = virtnet_txq_to_vq(txvq); > struct vring_packed_desc *start_dp, *head_dp; > uint16_t idx, id, head_idx, head_flags; > int16_t head_size = vq->hw->vtnet_hdr_size; > -- > 2.29.2