From: Luca Vizzarro <Luca.Vizzarro@arm.com>
To: Andrew Bailey <abailey@iol.unh.edu>
Cc: dev@dpdk.org, dmarx@iol.unh.edu, probb@iol.unh.edu
Subject: Re: [PATCH] dts: enable port binding on the TG
Date: Fri, 15 Aug 2025 09:50:33 +0100 [thread overview]
Message-ID: <992dc4bd-a55a-4f48-9be2-5e6d3385e1cd@arm.com> (raw)
In-Reply-To: <20250814203846.407334-1-abailey@iol.unh.edu>
Hi Andrew,
thank you for the very quick turnaround! I've just noticed that this is
not precisely what I had in mind, but in fairness this approach is
perfectly good.
On 14/08/2025 21:38, Andrew Bailey wrote:
> Currently, driver binding for all nodes relies on a devbind_script_path
> attribute in the node main sessions. This attribute is being set on the
> SUT node, but not the TG node. Consequently, if the TG node ports are
> not bound to the correct driver before DTS execution, the TG ports will
> fail to bind and DTS will error.
>
> relocate prepare devbind script method to topology class to be used by both
> TG and SUT nodes.
nit: missed capitalisation.>
> Signed-off-by: Andrew Bailey <abailey@iol.unh.edu>
>
> done
> ---
> .mailmap | 1 +
> dts/framework/remote_session/dpdk.py | 36 +----------------------
> dts/framework/testbed_model/topology.py | 39 +++++++++++++++++++++++++
> 3 files changed, 41 insertions(+), 35 deletions(-)
>
> diff --git a/.mailmap b/.mailmap
> index 34a99f93a1..df06862d8b 100644
> --- a/.mailmap
> +++ b/.mailmap
> @@ -104,6 +104,7 @@ Andre Muezerie <andremue@linux.microsoft.com> <andremue@microsoft.com>
> Andrea Arcangeli <aarcange@redhat.com>
> Andrea Grandi <andrea.grandi@intel.com>
> Andre Richter <andre.o.richter@gmail.com>
> +Andrew Bailey <abailey@iol.unh.edu>
> Andrew Boyer <andrew.boyer@amd.com> <aboyer@pensando.io>
> Andrew Harvey <agh@cisco.com>
> Andrew Jackson <ajackson@solarflare.com>
> diff --git a/dts/framework/remote_session/dpdk.py b/dts/framework/remote_session/dpdk.py
> index 606d6e22fe..d1ab3ae50d 100644
> --- a/dts/framework/remote_session/dpdk.py
> +++ b/dts/framework/remote_session/dpdk.py
> @@ -24,12 +24,11 @@
> RemoteDPDKTarballLocation,
> RemoteDPDKTreeLocation,
> )
> -from framework.exception import ConfigurationError, InternalError, RemoteFileNotFoundError
> +from framework.exception import ConfigurationError, RemoteFileNotFoundError
> from framework.logger import DTSLogger, get_dts_logger
> from framework.params.eal import EalParams
> from framework.remote_session.remote_session import CommandResult
> from framework.testbed_model.cpu import LogicalCore, LogicalCoreCount, LogicalCoreList, lcore_filter
> -from framework.testbed_model.linux_session import LinuxSession
> from framework.testbed_model.node import Node
> from framework.testbed_model.os_session import OSSession
> from framework.testbed_model.virtual_device import VirtualDevice
> @@ -358,7 +357,6 @@ def setup(self):
> """Set up the DPDK runtime on the target node."""
> if self.build:
> self.build.setup()
> - self._prepare_devbind_script()
>
> def teardown(self) -> None:
> """Reset DPDK variables and bind port driver to the OS driver."""
> @@ -385,38 +383,6 @@ def run_dpdk_app(
> f"{app_path} {eal_params}", timeout, privileged=True, verify=True
> )
>
> - def _prepare_devbind_script(self) -> None:
> - """Prepare the devbind script.
> -
> - If the environment has a build associated with it, then use the script within that build's
> - tree. Otherwise, copy the script from the local repository.
> -
> - This script is only available for Linux, if the detected session is not Linux then do
> - nothing.
> -
> - Raises:
> - InternalError: If dpdk-devbind.py could not be found.
> - """
> - if not isinstance(self._node.main_session, LinuxSession):
> - return
> -
> - if self.build:
> - devbind_script_path = self._node.main_session.join_remote_path(
> - self.build.remote_dpdk_tree_path, "usertools", "dpdk-devbind.py"
> - )
> - else:
> - local_script_path = Path("..", "usertools", "dpdk-devbind.py").resolve()
> - if not local_script_path.exists():
> - raise InternalError("Could not find dpdk-devbind.py locally.")
> -
> - devbind_script_path = self._node.main_session.join_remote_path(
> - self._node.tmp_dir, local_script_path.name
> - )
> -
> - self._node.main_session.copy_to(local_script_path, devbind_script_path)
> -
> - self._node.main_session.devbind_script_path = devbind_script_path
> -
> def filter_lcores(
> self,
> filter_specifier: LogicalCoreCount | LogicalCoreList,
> diff --git a/dts/framework/testbed_model/topology.py b/dts/framework/testbed_model/topology.py
> index 899ea0ad3a..db96aaf170 100644
> --- a/dts/framework/testbed_model/topology.py
> +++ b/dts/framework/testbed_model/topology.py
> @@ -12,11 +12,13 @@
> from collections.abc import Iterator
> from dataclasses import dataclass
> from enum import Enum
> +from pathlib import Path
> from typing import Literal, NamedTuple
>
> from typing_extensions import Self
>
> from framework.exception import ConfigurationError, InternalError
> +from framework.testbed_model.linux_session import LinuxSession
> from framework.testbed_model.node import Node
>
> from .port import DriverKind, Port, PortConfig
> @@ -128,6 +130,7 @@ def setup(self) -> None:
>
> Binds all the ports to the right kernel driver to retrieve MAC addresses and logical names.
> """
> + self._prepare_devbind_script()
> self._setup_ports("sut")
> self._setup_ports("tg")
>
> @@ -250,6 +253,42 @@ def _bind_ports_to_drivers(
> for driver_name, ports in driver_to_ports.items():
> node.main_session.bind_ports_to_driver(ports, driver_name)
>
> + def _prepare_devbind_script(self) -> None:
> + """Prepare the devbind script.
> +
> + If the environment has a build associated with it, then use the script within that build's
> + tree. Otherwise, copy the script from the local repository.
This is no longer true as you are now only copying the script.> +
> + This script is only available for Linux, if the detected session is not Linux then do
> + nothing.
> +
> + Raises:
> + InternalError: If dpdk-devbind.py could not be found.
> + """
> + from framework.context import get_ctx
> +
> + ctx = get_ctx()
> + tg = ctx.tg_node
> + sut = ctx.sut_node
Since we are only calling these once there is no need in placing them in
their own variables, see below.> +
> + def prepare_node(node: Node) -> None:
> + if not isinstance(node.main_session, LinuxSession):
> + return
> +
> + local_script_path = Path("..", "usertools", "dpdk-devbind.py").resolve()
> + if not local_script_path.exists():
> + raise InternalError("Could not find dpdk-devbind.py locally.")I guess local_script_path can go outside the inner function. Similarly
we can store the result of `not local_script_path.exists()` in a
variable in the outer function, but keep the check here as we only want
to check if session is LinuxSession of course.> +
> + devbind_script_path = node.main_session.join_remote_path(
> + node.tmp_dir, local_script_path.name
> + )
> +
> + node.main_session.copy_to(local_script_path, devbind_script_path)
> + node.main_session.devbind_script_path = devbind_script_path
> +
> + prepare_node(tg)
> + prepare_node(sut)
can just do:
prepare_node(ctx.tg_node)
...
and spare 2 redundant lines.> +
> @property
> def sut_dpdk_ports(self) -> list[Port]:
> """The DPDK ports for the SUT node."""
Thank you!
Best,
Luca
prev parent reply other threads:[~2025-08-15 8:50 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-14 20:38 Andrew Bailey
2025-08-15 8:50 ` Luca Vizzarro [this message]
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=992dc4bd-a55a-4f48-9be2-5e6d3385e1cd@arm.com \
--to=luca.vizzarro@arm.com \
--cc=abailey@iol.unh.edu \
--cc=dev@dpdk.org \
--cc=dmarx@iol.unh.edu \
--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).