net/i40e: fix mbuf free in vector Tx
vPMD tx does not set sw_ring's mbuf to NULL after free.
Therefore, in cases where the vector transmit function is in
use, we must use the appropriate index and threshold values
for the queue to only free the unreleased mbufs
Fixes: b4669bb950
("i40e: add vector Tx")
Cc: stable@dpdk.org
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
This commit is contained in:
parent
1edc13a83b
commit
24853544c8
@ -2305,18 +2305,40 @@ i40e_reset_rx_queue(struct i40e_rx_queue *rxq)
|
||||
void
|
||||
i40e_tx_queue_release_mbufs(struct i40e_tx_queue *txq)
|
||||
{
|
||||
struct rte_eth_dev *dev;
|
||||
uint16_t i;
|
||||
|
||||
dev = &rte_eth_devices[txq->port_id];
|
||||
|
||||
if (!txq || !txq->sw_ring) {
|
||||
PMD_DRV_LOG(DEBUG, "Pointer to rxq or sw_ring is NULL");
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < txq->nb_tx_desc; i++) {
|
||||
if (txq->sw_ring[i].mbuf) {
|
||||
/**
|
||||
* vPMD tx will not set sw_ring's mbuf to NULL after free,
|
||||
* so need to free remains more carefully.
|
||||
*/
|
||||
if (dev->tx_pkt_burst == i40e_xmit_pkts_vec) {
|
||||
i = txq->tx_next_dd - txq->tx_rs_thresh + 1;
|
||||
if (txq->tx_tail < i) {
|
||||
for (; i < txq->nb_tx_desc; i++) {
|
||||
rte_pktmbuf_free_seg(txq->sw_ring[i].mbuf);
|
||||
txq->sw_ring[i].mbuf = NULL;
|
||||
}
|
||||
i = 0;
|
||||
}
|
||||
for (; i < txq->tx_tail; i++) {
|
||||
rte_pktmbuf_free_seg(txq->sw_ring[i].mbuf);
|
||||
txq->sw_ring[i].mbuf = NULL;
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < txq->nb_tx_desc; i++) {
|
||||
if (txq->sw_ring[i].mbuf) {
|
||||
rte_pktmbuf_free_seg(txq->sw_ring[i].mbuf);
|
||||
txq->sw_ring[i].mbuf = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user