}
rte_prefetch0(cookie);
- rte_packet_prefetch(cookie->data);
+ rte_packet_prefetch(rte_pktmbuf_mtod(cookie, void *));
rx_pkts[i] = cookie;
vq->vq_used_cons_idx++;
vq_ring_free_chain(vq, desc_idx);
struct virtio_hw *hw
= VIRTIO_DEV_PRIVATE_TO_HW(dev->data->dev_private);
- virtio_dev_vring_start(hw->cvq, VTNET_CQ);
- VIRTQUEUE_DUMP((struct virtqueue *)hw->cvq);
+ if (hw->cvq) {
+ virtio_dev_vring_start(hw->cvq, VTNET_CQ);
+ VIRTQUEUE_DUMP((struct virtqueue *)hw->cvq);
+ }
}
void
}
#define VIRTIO_MBUF_BURST_SZ 64
-#define DESC_PER_CACHELINE (CACHE_LINE_SIZE / sizeof(struct vring_desc))
+#define DESC_PER_CACHELINE (RTE_CACHE_LINE_SIZE / sizeof(struct vring_desc))
uint16_t
virtio_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
{
}
rxm->port = rxvq->port_id;
- rxm->data = (char *)rxm->buf_addr + RTE_PKTMBUF_HEADROOM;
+ rxm->data_off = RTE_PKTMBUF_HEADROOM;
rxm->nb_segs = 1;
rxm->next = NULL;
if (seg_num == 0)
seg_num = 1;
- rxm->data = (char *)rxm->buf_addr + RTE_PKTMBUF_HEADROOM;
+ rxm->data_off = RTE_PKTMBUF_HEADROOM;
rxm->nb_segs = seg_num;
rxm->next = NULL;
rxm->pkt_len = (uint32_t)(len[0] - hdr_size);
while (extra_idx < rcv_cnt) {
rxm = rcv_pkts[extra_idx];
- rxm->data =
- (char *)rxm->buf_addr +
- RTE_PKTMBUF_HEADROOM - hdr_size;
+ rxm->data_off = RTE_PKTMBUF_HEADROOM - hdr_size;
rxm->next = NULL;
rxm->pkt_len = (uint32_t)(len[extra_idx]);
rxm->data_len = (uint16_t)(len[extra_idx]);
num = (uint16_t)(likely(nb_used < VIRTIO_MBUF_BURST_SZ) ? nb_used : VIRTIO_MBUF_BURST_SZ);
while (nb_tx < nb_pkts) {
- int need = tx_pkts[nb_tx]->nb_segs - txvq->vq_free_cnt;
+ /* Need one more descriptor for virtio header. */
+ int need = tx_pkts[nb_tx]->nb_segs - txvq->vq_free_cnt + 1;
int deq_cnt = RTE_MIN(need, (int)num);
num -= (deq_cnt > 0) ? deq_cnt : 0;
deq_cnt--;
}
- if (tx_pkts[nb_tx]->nb_segs <= txvq->vq_free_cnt) {
+ need = (int)tx_pkts[nb_tx]->nb_segs - txvq->vq_free_cnt + 1;
+ /*
+ * Zero or negative value indicates it has enough free
+ * descriptors to use for transmitting.
+ */
+ if (likely(need <= 0)) {
txm = tx_pkts[nb_tx];
/* Enqueue Packet buffers */
error = virtqueue_enqueue_xmit(txvq, txm);