mirror of https://github.com/F-Stack/f-stack.git
59 lines
1.4 KiB
C
59 lines
1.4 KiB
C
|
/* SPDX-License-Identifier: BSD-3-Clause
|
||
|
* Copyright (c) 2023 Arm Limited.
|
||
|
*/
|
||
|
|
||
|
#include "testpmd.h"
|
||
|
|
||
|
/*
|
||
|
* Forwarding of packets in I/O mode.
|
||
|
* Enable mbufs recycle mode to recycle txq used mbufs
|
||
|
* for rxq mbuf ring. This can bypass mempool path and
|
||
|
* save CPU cycles.
|
||
|
*/
|
||
|
static bool
|
||
|
pkt_burst_recycle_mbufs(struct fwd_stream *fs)
|
||
|
{
|
||
|
struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
|
||
|
uint16_t nb_rx;
|
||
|
|
||
|
/* Recycle used mbufs from the txq, and move these mbufs into
|
||
|
* the rxq mbuf ring.
|
||
|
*/
|
||
|
rte_eth_recycle_mbufs(fs->rx_port, fs->rx_queue,
|
||
|
fs->tx_port, fs->tx_queue, &(fs->recycle_rxq_info));
|
||
|
|
||
|
/*
|
||
|
* Receive a burst of packets and forward them.
|
||
|
*/
|
||
|
nb_rx = common_fwd_stream_receive(fs, pkts_burst, nb_pkt_per_burst);
|
||
|
if (unlikely(nb_rx == 0))
|
||
|
return false;
|
||
|
|
||
|
common_fwd_stream_transmit(fs, pkts_burst, nb_rx);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
recycle_mbufs_stream_init(struct fwd_stream *fs)
|
||
|
{
|
||
|
int rc;
|
||
|
|
||
|
/* Retrieve information about given ports's Rx queue
|
||
|
* for recycling mbufs.
|
||
|
*/
|
||
|
rc = rte_eth_recycle_rx_queue_info_get(fs->rx_port,
|
||
|
fs->rx_queue, &(fs->recycle_rxq_info));
|
||
|
if (rc != 0)
|
||
|
TESTPMD_LOG(WARNING,
|
||
|
"Failed to get rx queue mbufs recycle info\n");
|
||
|
|
||
|
common_fwd_stream_init(fs);
|
||
|
}
|
||
|
|
||
|
struct fwd_engine recycle_mbufs_engine = {
|
||
|
.fwd_mode_name = "recycle_mbufs",
|
||
|
.stream_init = recycle_mbufs_stream_init,
|
||
|
.packet_fwd = pkt_burst_recycle_mbufs,
|
||
|
};
|