DPDK patches and discussions
 help / color / mirror / Atom feed
From: Ivan Malov <ivan.malov@arknetworks.am>
To: Andrew Bailey <abailey@iol.unh.edu>
Cc: luca.vizzarro@arm.com, dev@dpdk.org, dmarx@iol.unh.edu,
	probb@iol.unh.edu
Subject: Re: [PATCH v1 1/3] dts: allow mbuf_fast_free to be set with testpmd shell
Date: Tue, 2 Sep 2025 23:37:28 +0400 (+04)	[thread overview]
Message-ID: <3505d755-ddbc-d6f5-ff47-0ea2216c8993@arknetworks.am> (raw)
In-Reply-To: <20250902142725.56736-2-abailey@iol.unh.edu>

Hi Andrew,

On Tue, 2 Sep 2025, Andrew Bailey wrote:

> Currently, there is no way in the testpmd shell class to set the mbuf
> fast free offload configuration for RX or TX ports. This prohibits any

To me, this reads like some ports can be Rx-only while others can be Tx-only,
which is a little bit confusing. Also, let's double check that it makes to talk
about the 'mbuf fast free offload' in the context of an Rx queue; -- it was my
impression that this offload is only applicable to Tx queues, as they are meant
to 'reap' mbufs associated with 'done' Tx descriptors. Am I missing something?

> test suites to be written utilizing this offload configuration. Additionally,
> the NIC capabilities for the TX offload are not gathered. This prevents future
> test suites from being skipped if they do not support a TX offload capability.
> Introduce methods that support calls to testpmd in order to allow the
> configuration of mbuf fast free and to gather TX offload capabilities.

This added ability to collect Tx offload capability info is good.

One more point to consider: this handles 'mbuf_fast_free' on per-queue level,
but if it is valid on port-global level, too, may be one can also cover that.

>
> Signed-off-by: Andrew Bailey <abailey@iol.unh.edu>
> ---
> dts/framework/remote_session/testpmd_shell.py | 137 +++++++++++++++++-
> 1 file changed, 136 insertions(+), 1 deletion(-)
>
> diff --git a/dts/framework/remote_session/testpmd_shell.py b/dts/framework/remote_session/testpmd_shell.py
> index 786714d1c5..91642efec5 100644
> --- a/dts/framework/remote_session/testpmd_shell.py
> +++ b/dts/framework/remote_session/testpmd_shell.py
> @@ -19,7 +19,7 @@
> import time
> from collections.abc import Callable, MutableSet
> from dataclasses import dataclass, field
> -from enum import Flag, auto
> +from enum import Enum, Flag, auto
> from os import environ
> from pathlib import PurePath
> from typing import TYPE_CHECKING, Any, ClassVar, Concatenate, Literal, ParamSpec, Tuple, TypeAlias
> @@ -344,6 +344,13 @@ def make_parser(cls) -> ParserFn:
>         )
>
>
> +class RxTxArgFlag(Enum):
> +    """Enum representing receiving or transmitting ports."""
> +
> +    TX = "tx"
> +    RX = "rx"
> +
> +
> class DeviceCapabilitiesFlag(Flag):
>     """Flag representing the device capabilities."""
>
> @@ -2787,6 +2794,134 @@ def get_capabilities_physical_function(
>         else:
>             unsupported_capabilities.add(NicCapability.PHYSICAL_FUNCTION)
>
> +    @requires_started_ports
> +    def get_rxtx_offload_config(
> +        self,
> +        rxtx: RxTxArgFlag,
> +        verify: bool,
> +        port_id: int = 0,
> +        num_queues: int = 0,
> +    ) -> dict[int | str, str]:
> +        """Get the RX or TX offload configuration of the queues from the given port.
> +
> +        Args:
> +            rxtx: Whether to get the RX or TX configuration of the given queues.
> +            verify: If :data:'True' the output of the command will be scanned in an attempt to
> +                verify that the offload configuration was retrieved successfully on all queues.
> +            num_queues: The number of queues to get the offload configuration for.
> +            port_id: The port ID that contains the desired queues.
> +
> +        Returns:
> +            A dict containing port info at key 'port' and queue info keyed by the appropriate queue
> +                id.
> +
> +        Raises:
> +            InteractiveCommandExecutionError: If all queue offload configurations could not be
> +                retrieved.
> +
> +        """
> +        returnDict: dict[int | str, str] = {}
> +
> +        config_output = self.send_command(f"show port {port_id} {rxtx.value}_offload configuration")
> +        if verify:
> +            if (
> +                f"Rx Offloading Configuration of port {port_id}" not in config_output
> +                and f"Tx Offloading Configuration of port {port_id}" not in config_output
> +            ):
> +                self._logger.debug(f"Get port offload config error\n{config_output}")
> +                raise InteractiveCommandExecutionError(
> +                    f"""Failed to get offload config on port {port_id}:\n{config_output}"""
> +                )
> +        # Actual output data starts on the thrid line
> +        tempList: list[str] = config_output.splitlines()[3::]
> +        returnDict["port"] = tempList[0]
> +        for i in range(0, num_queues):
> +            returnDict[i] = tempList[i + 1]
> +        return returnDict
> +
> +    @requires_stopped_ports
> +    def set_port_rxtx_mbuf_fast_free(
> +        self, rxtx: RxTxArgFlag, on: bool, verify: bool, port_id: int = 0
> +    ) -> None:
> +        """Sets the mbuf_fast_free configuration for the RX or TX offload for a given port.
> +
> +        Args:
> +            rxtx: Whether to set the mbuf_fast_free on the RX or TX port.
> +            on: If :data:'True' mbuf_fast_free will be enabled, disable it otherwise.
> +            verify: If :data:'True' the output of the command will be scanned in an attempt to
> +                verify that the mbuf_fast_free was set successfully.
> +            port_id: The port number to enable or disable mbuf_fast_free on.
> +
> +        Raises:
> +            InteractiveCommandExecutionError: If mbuf_fast_free could not be set successfully
> +        """
> +        mbuf_output = self.send_command(
> +            f"port config {port_id} {rxtx.value}_offload mbuf_fast_free {"on" if on else "off"}"
> +        )
> +
> +        if "error" in mbuf_output and verify:
> +            raise InteractiveCommandExecutionError(
> +                f"""Unable to set mbuf_fast_free config on port {port_id}:\n{mbuf_output}"""
> +            )
> +
> +    @requires_stopped_ports
> +    def set_queue_rxtx_mbuf_fast_free(
> +        self,
> +        rxtx: RxTxArgFlag,

So this is questionable. Please see below.

> +        on: bool,
> +        verify: bool,
> +        port_id: int = 0,
> +        queue_id: int = 0,
> +    ) -> None:
> +        """Sets RX or TX mbuf_fast_free configuration of the specified queue on a given port.
> +
> +        Args:
> +            rxtx: Whether to set mbuf_fast_free for the RX or TX offload configuration on the
> +                given queues.
> +            on: If :data:'True' the mbuf_fast_free configuration will be enabled, otherwise
> +                disabled.
> +            verify: If :data:'True' the output of the command will be scanned in an attempt to
> +                verify that mbuf_fast_free was set successfully on all ports.
> +            queue_id: The queue to disable mbuf_fast_free on.
> +            port_id: The ID of the port containing the queues.
> +
> +        Raises:
> +            InteractiveCommandExecutionError: If all queues could not be set successfully.
> +        """
> +        toggle = "on" if on else "off"
> +        output = self.send_command(
> +            f"port {port_id} {rxtx.value}q {queue_id} {rxtx.value}_offload mbuf_fast_free {toggle}"

For me, on a slightly dated DPDK build, setting this on an Rx queue fails:

testpmd> port 0 rxq 0 rx_offload mbuf_fast_free off
Bad arguments

An equivalent Tx command works, albeit unsupported in my specific circumstances.

testpmd> port 0 txq 0 tx_offload mbuf_fast_free off
Error: port 0 doesn't support per queue offload: mbuf_fast_free.

> +        )
> +        if verify:
> +            if "Error" in output:
> +                self._logger.debug(f"Set queue offload config error\n{output}")
> +                raise InteractiveCommandExecutionError(
> +                    f"Failed to get offload config on port {port_id}, queue {queue_id}:\n{output}"
> +                )
> +
> +    def set_all_queues_rxtx_mbuf_fast_free(
> +        self,
> +        rxtx: RxTxArgFlag,
> +        on: bool,
> +        verify: bool,
> +        port_id=0,
> +        num_queues: int = 0,
> +    ) -> None:
> +        """Sets mbuf_fast_free configuration for the RX or TX offload of all queues on a given port.
> +
> +        Args:
> +            rxtx: Whether to set mbuf_fast_free for the RX or TX offload configuration on the
> +                given queues.
> +            on: If :data:'True' the mbuf fast_free_configuration will be enabled, otherwise
> +                disabled.
> +            verify: If :data:'True' the output of the command will be scanned in an attempt to
> +                verify that mbuf_fast_free was set successfully on all ports.
> +            port_id: The ID of the port containing the queues.
> +            num_queues: The queue to disable mbuf_fast_free on.

While I'm not well-versed in DTS style in general and cannot push to choose
some specific naming, I'd say, to me, 'queue_ids' would read less ambiguous.

Thank you.

> +        """
> +        for i in range(0, num_queues):
> +            self.set_queue_rxtx_mbuf_fast_free(rxtx, on, verify, port_id=port_id, queue_id=i)
> +
>
> class NicCapability(NoAliasEnum):
>     """A mapping between capability names and the associated :class:`TestPmdShell` methods.
> --
> 2.50.1
>
>

  reply	other threads:[~2025-09-02 19:37 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-02 14:27 [PATCH v1 0/3] dts: add tx_offload support in dts Andrew Bailey
2025-09-02 14:27 ` [PATCH v1 1/3] dts: allow mbuf_fast_free to be set with testpmd shell Andrew Bailey
2025-09-02 19:37   ` Ivan Malov [this message]
2025-09-02 19:48     ` Ivan Malov
2025-09-02 14:27 ` [PATCH v1 2/3] dts: add TX offload capabilities to NIC capabilities Andrew Bailey
2025-09-02 14:27 ` [PATCH v1 3/3] dts: update tx_offload test from old dts Andrew Bailey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3505d755-ddbc-d6f5-ff47-0ea2216c8993@arknetworks.am \
    --to=ivan.malov@arknetworks.am \
    --cc=abailey@iol.unh.edu \
    --cc=dev@dpdk.org \
    --cc=dmarx@iol.unh.edu \
    --cc=luca.vizzarro@arm.com \
    --cc=probb@iol.unh.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).