ixgbe: fix number of segments with vector scattered Rx
[dpdk.git] / drivers / net / ixgbe / ixgbe_rxtx_vec.c
index c01da7b..1c16dec 100644 (file)
@@ -497,6 +497,8 @@ reassemble_packets(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_bufs,
                                else {
                                        /* free up last mbuf */
                                        struct rte_mbuf *secondlast = start;
+
+                                       start->nb_segs--;
                                        while (secondlast->next != end)
                                                secondlast = secondlast->next;
                                        secondlast->data_len -= (rxq->crc_len -
@@ -549,10 +551,10 @@ ixgbe_recv_scattered_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
                return 0;
 
        /* happy day case, full burst + no packets to be joined */
-       const uint32_t *split_fl32 = (uint32_t *)split_flags;
+       const uint64_t *split_fl64 = (uint64_t *)split_flags;
        if (rxq->pkt_first_seg == NULL &&
-                       split_fl32[0] == 0 && split_fl32[1] == 0 &&
-                       split_fl32[2] == 0 && split_fl32[3] == 0)
+                       split_fl64[0] == 0 && split_fl64[1] == 0 &&
+                       split_fl64[2] == 0 && split_fl64[3] == 0)
                return nb_bufs;
 
        /* reassemble any packets that need reassembly*/
@@ -608,8 +610,7 @@ ixgbe_tx_free_bufs(struct ixgbe_tx_queue *txq)
         * first buffer to free from S/W ring is at index
         * tx_next_dd - (tx_rs_thresh-1)
         */
-       txep = &((struct ixgbe_tx_entry_v *)txq->sw_ring)[txq->tx_next_dd -
-                       (n - 1)];
+       txep = &txq->sw_ring_v[txq->tx_next_dd - (n - 1)];
        m = __rte_pktmbuf_prefree_seg(txep[0].mbuf);
        if (likely(m != NULL)) {
                free[0] = m;
@@ -678,7 +679,7 @@ ixgbe_xmit_pkts_vec(void *tx_queue, struct rte_mbuf **tx_pkts,
 
        tx_id = txq->tx_tail;
        txdp = &txq->tx_ring[tx_id];
-       txep = &((struct ixgbe_tx_entry_v *)txq->sw_ring)[tx_id];
+       txep = &txq->sw_ring_v[tx_id];
 
        txq->nb_tx_free = (uint16_t)(txq->nb_tx_free - nb_pkts);
 
@@ -699,7 +700,7 @@ ixgbe_xmit_pkts_vec(void *tx_queue, struct rte_mbuf **tx_pkts,
 
                /* avoid reach the end of ring */
                txdp = &(txq->tx_ring[tx_id]);
-               txep = &(((struct ixgbe_tx_entry_v *)txq->sw_ring)[tx_id]);
+               txep = &txq->sw_ring_v[tx_id];
        }
 
        tx_backlog_entry(txep, tx_pkts, nb_commit);
@@ -722,7 +723,7 @@ ixgbe_xmit_pkts_vec(void *tx_queue, struct rte_mbuf **tx_pkts,
 }
 
 static void __attribute__((cold))
-ixgbe_tx_queue_release_mbufs(struct ixgbe_tx_queue *txq)
+ixgbe_tx_queue_release_mbufs_vec(struct ixgbe_tx_queue *txq)
 {
        unsigned i;
        struct ixgbe_tx_entry_v *txe;
@@ -735,14 +736,14 @@ ixgbe_tx_queue_release_mbufs(struct ixgbe_tx_queue *txq)
        for (i = txq->tx_next_dd - (txq->tx_rs_thresh - 1);
             i != txq->tx_tail;
             i = (i + 1) & max_desc) {
-               txe = &((struct ixgbe_tx_entry_v *)txq->sw_ring)[i];
+               txe = &txq->sw_ring_v[i];
                rte_pktmbuf_free_seg(txe->mbuf);
        }
        txq->nb_tx_free = max_desc;
 
        /* reset tx_entry */
        for (i = 0; i < txq->nb_tx_desc; i++) {
-               txe = (struct ixgbe_tx_entry_v *)&txq->sw_ring[i];
+               txe = &txq->sw_ring_v[i];
                txe->mbuf = NULL;
        }
 }
@@ -772,8 +773,8 @@ ixgbe_tx_free_swring(struct ixgbe_tx_queue *txq)
                return;
 
        if (txq->sw_ring != NULL) {
-               rte_free((struct ixgbe_rx_entry *)txq->sw_ring - 1);
-               txq->sw_ring = NULL;
+               rte_free(txq->sw_ring_v - 1);
+               txq->sw_ring_v = NULL;
        }
 }
 
@@ -781,7 +782,7 @@ static void __attribute__((cold))
 ixgbe_reset_tx_queue(struct ixgbe_tx_queue *txq)
 {
        static const union ixgbe_adv_tx_desc zeroed_desc = {{0}};
-       struct ixgbe_tx_entry_v *txe = (struct ixgbe_tx_entry_v *)txq->sw_ring;
+       struct ixgbe_tx_entry_v *txe = txq->sw_ring_v;
        uint16_t i;
 
        /* Zero out HW ring memory */
@@ -812,7 +813,7 @@ ixgbe_reset_tx_queue(struct ixgbe_tx_queue *txq)
 }
 
 static const struct ixgbe_txq_ops vec_txq_ops = {
-       .release_mbufs = ixgbe_tx_queue_release_mbufs,
+       .release_mbufs = ixgbe_tx_queue_release_mbufs_vec,
        .free_swring = ixgbe_tx_free_swring,
        .reset = ixgbe_reset_tx_queue,
 };
@@ -838,12 +839,11 @@ ixgbe_rxq_vec_setup(struct ixgbe_rx_queue *rxq)
 int __attribute__((cold))
 ixgbe_txq_vec_setup(struct ixgbe_tx_queue *txq)
 {
-       if (txq->sw_ring == NULL)
+       if (txq->sw_ring_v == NULL)
                return -1;
 
        /* leave the first one for overflow */
-       txq->sw_ring = (struct ixgbe_tx_entry *)
-               ((struct ixgbe_tx_entry_v *)txq->sw_ring + 1);
+       txq->sw_ring_v = txq->sw_ring_v + 1;
        txq->ops = &vec_txq_ops;
 
        return 0;