add prefix to cache line macros
[dpdk.git] / lib / librte_pmd_virtio / virtio_rxtx.c
index 132ee45..c013f97 100644 (file)
@@ -118,7 +118,7 @@ virtqueue_dequeue_burst_rx(struct virtqueue *vq, struct rte_mbuf **rx_pkts,
                }
 
                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);
@@ -328,8 +328,10 @@ virtio_dev_cq_start(struct rte_eth_dev *dev)
        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
@@ -439,7 +441,7 @@ virtio_discard_rxbuf(struct virtqueue *vq, struct rte_mbuf *m)
 }
 
 #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)
 {
@@ -480,7 +482,7 @@ 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;
@@ -584,7 +586,7 @@ virtio_recv_mergeable_pkts(void *rx_queue,
                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);
@@ -622,9 +624,7 @@ virtio_recv_mergeable_pkts(void *rx_queue,
                        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]);
@@ -699,7 +699,8 @@ virtio_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
        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;
@@ -708,7 +709,12 @@ virtio_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
                        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);