[dpdk-dev] [PATCH v1 27/38] net/mvpp2: dummy pool creation
Jerin Jacob
jerinjacobk at gmail.com
Mon Jan 11 17:37:41 CET 2021
On Wed, Dec 23, 2020 at 3:03 PM Michael Shamis <michaelsh at marvell.com> wrote:
>
> Reviewed-by: Michael Shamis <michaelsh at marvell.com>
>
> -----Original Message-----
> From: dev <dev-bounces at dpdk.org> On Behalf Of lironh at marvell.com
> Sent: Wednesday, December 2, 2020 12:12 PM
> To: Jerin Jacob Kollanukkaran <jerinj at marvell.com>
> Cc: dev at dpdk.org; Liron Himi <lironh at marvell.com>
> Subject: [dpdk-dev] [PATCH v1 27/38] net/mvpp2: dummy pool creation
probably change "dummy pool creation" to introduce fixup for ...
>
> From: Liron Himi <lironh at marvell.com>
>
> Currently the HW is configured with only one pool which its buffer size may be larger than the rx-fifo-size.
> In that situation, frame size larger than the fifo-size is gets dropped due to fifo overrun.
> this is cause because the HW works in cut-through mode which waits to have in the fifo at least the amount of bytes as define in the smallest pool's buffer size.
>
> This patch add a dummy pool which its buffer size is very small (smaller than 64B frame). this tricks the HW and any frame size is gets passed from the FIFO to the PP2.
>
> Signed-off-by: Liron Himi <lironh at marvell.com>
> ---
> drivers/net/mvpp2/mrvl_ethdev.c | 71 ++++++++++++++++++++++++++------- drivers/net/mvpp2/mrvl_ethdev.h | 2 +
> drivers/net/mvpp2/mrvl_qos.c | 1 +
> 3 files changed, 60 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c index 127861a82..1f9489d77 100644
> --- a/drivers/net/mvpp2/mrvl_ethdev.c
> +++ b/drivers/net/mvpp2/mrvl_ethdev.c
> @@ -90,6 +90,8 @@ static int used_bpools[PP2_NUM_PKT_PROC] = { static struct pp2_bpool *mrvl_port_to_bpool_lookup[RTE_MAX_ETHPORTS];
> static int mrvl_port_bpool_size[PP2_NUM_PKT_PROC][PP2_BPOOL_NUM_POOLS][RTE_MAX_LCORE];
> static uint64_t cookie_addr_high = MRVL_COOKIE_ADDR_INVALID;
> +static int dummy_pool_id[PP2_NUM_PKT_PROC]; struct pp2_bpool
> +*dummy_pool[PP2_NUM_PKT_PROC] = {0};
>
> struct mrvl_ifnames {
> const char *names[PP2_NUM_ETH_PPIO * PP2_NUM_PKT_PROC]; @@ -189,6 +191,19 @@ static struct {
> MRVL_XSTATS_TBL_ENTRY(tx_errors)
> };
>
> +static inline int
> +mrvl_reserve_bit(int *bitmap, int max)
> +{
> + int n = sizeof(*bitmap) * 8 - __builtin_clz(*bitmap);
> +
> + if (n >= max)
> + return -1;
> +
> + *bitmap |= 1 << n;
> +
> + return n;
> +}
> +
> /**
> * Initialize packet processor.
> *
> @@ -199,6 +214,9 @@ static int
> mrvl_init_pp2(void)
> {
> struct pp2_init_params init_params;
> + struct pp2_bpool_params bpool_params;
> + char name[15];
> + int err, i;
>
> memset(&init_params, 0, sizeof(init_params));
> init_params.hif_reserved_map = MRVL_MUSDK_HIFS_RESERVED; @@ -207,7 +225,36 @@ mrvl_init_pp2(void)
> if (mrvl_cfg && mrvl_cfg->pp2_cfg.prs_udfs.num_udfs)
> memcpy(&init_params.prs_udfs, &mrvl_cfg->pp2_cfg.prs_udfs,
> sizeof(struct pp2_parse_udfs));
> - return pp2_init(&init_params);
> + err = pp2_init(&init_params);
> + if (err != 0) {
> + MRVL_LOG(ERR, "PP2 init failed");
> + return -1;
> + }
> +
> + memset(dummy_pool, 0, sizeof(dummy_pool));
> + for (i = 0; i < pp2_get_num_inst(); i++) {
> + dummy_pool_id[i] = mrvl_reserve_bit(&used_bpools[i],
> + PP2_BPOOL_NUM_POOLS);
> + if (dummy_pool_id[i] < 0) {
> + MRVL_LOG(ERR, "Can't find free pool\n");
> + return -1;
> + }
> +
> + memset(name, 0, sizeof(name));
> + snprintf(name, sizeof(name), "pool-%d:%d", i, dummy_pool_id[i]);
> + memset(&bpool_params, 0, sizeof(bpool_params));
> + bpool_params.match = name;
> + bpool_params.buff_len = MRVL_PKT_OFFS;
> + bpool_params.dummy_short_pool = 1;
> + err = pp2_bpool_init(&bpool_params, &dummy_pool[i]);
> + if (err != 0 || !dummy_pool[i]) {
> + MRVL_LOG(ERR, "BPool init failed!\n");
> + used_bpools[i] &= ~(1 << dummy_pool_id[i]);
> + return -1;
Probably you can move this fixup and init and fini as separation
function with a comment.
Say mrvl_..._fixup_init() and mrvl_..._fixup_fini()
More information about the dev
mailing list