DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH 1/2] dts: introduce abstract class for TG and SUT DPDK runtime environments
@ 2025-08-08 18:21 Andrew Bailey
  2025-08-08 18:21 ` [PATCH 2/2] dts: enable port binding on the TG Andrew Bailey
  2025-08-11 11:17 ` [PATCH 1/2] dts: introduce abstract class for TG and SUT DPDK runtime environments Luca Vizzarro
  0 siblings, 2 replies; 7+ messages in thread
From: Andrew Bailey @ 2025-08-08 18:21 UTC (permalink / raw)
  To: luca.vizzarro; +Cc: dev, dmarx, probb, Andrew Bailey

DPDK runtime environment has logic in methods for two modes of use, one
for TG environments and one for SUT environments. TG nodes utilizing
these methods only require a single class attribute that DPDK runtime
environment holds. TG nodes using these methods do not require the
overhead of a new DPDK runtime evironment.

Lift shared methods into a new abstract class and split the existing
runtime class into SUT and TG specific runtime classes.

Signed-off-by: Andrew Bailey <abailey@iol.unh.edu>
---
 dts/framework/context.py             |   4 +-
 dts/framework/remote_session/dpdk.py | 151 ++++++++++++++++++---------
 dts/framework/test_run.py            |   9 +-
 3 files changed, 110 insertions(+), 54 deletions(-)

diff --git a/dts/framework/context.py b/dts/framework/context.py
index 4360bc8699..086f07e0e9 100644
--- a/dts/framework/context.py
+++ b/dts/framework/context.py
@@ -15,7 +15,7 @@
 from framework.testbed_model.topology import Topology
 
 if TYPE_CHECKING:
-    from framework.remote_session.dpdk import DPDKBuildEnvironment, DPDKRuntimeEnvironment
+    from framework.remote_session.dpdk import DPDKBuildEnvironment, DPDKSUTRuntimeEnvironment
     from framework.testbed_model.traffic_generator.traffic_generator import TrafficGenerator
 
 P = ParamSpec("P")
@@ -68,7 +68,7 @@ class Context:
     tg_node: Node
     topology: Topology
     dpdk_build: "DPDKBuildEnvironment"
-    dpdk: "DPDKRuntimeEnvironment"
+    dpdk: "DPDKSUTRuntimeEnvironment"
     tg: "TrafficGenerator"
     local: LocalContext = field(default_factory=LocalContext)
     shell_pool: ShellPool = field(default_factory=ShellPool)
diff --git a/dts/framework/remote_session/dpdk.py b/dts/framework/remote_session/dpdk.py
index 606d6e22fe..8e45da4bd5 100644
--- a/dts/framework/remote_session/dpdk.py
+++ b/dts/framework/remote_session/dpdk.py
@@ -7,6 +7,7 @@
 
 import os
 import time
+from abc import ABC, abstractmethod
 from collections.abc import Iterable
 from dataclasses import dataclass
 from functools import cached_property
@@ -302,14 +303,83 @@ def get_dpdk_build_info(self) -> DPDKBuildInfo:
         return DPDKBuildInfo(dpdk_version=self.dpdk_version, compiler_version=self.compiler_version)
 
 
-class DPDKRuntimeEnvironment:
-    """Class handling a DPDK runtime environment."""
+class DPDKRuntimeEnvironment(ABC):
+    """Shared methods between TG and SUT runtimes."""
 
-    config: Final[DPDKRuntimeConfiguration]
-    build: Final[DPDKBuildEnvironment | None]
     _node: Final[Node]
+
+    def __init__(self, node: Node):
+        """DPDK runtime environment constructor.
+
+        Args:
+            node: The target node to manage a DPDK environment.
+        """
+        self._node = node
+
+    @abstractmethod
+    def _prepare_devbind_script(self):
+        """Prepare the devbind 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.
+        """
+
+    @abstractmethod
+    def setup(self) -> None:
+        """Set up the DPDK runtime on the target node."""
+
+
+class DPDKTGRuntimeEnvironment(DPDKRuntimeEnvironment):
+    """Class handling a DPDK runtime environment for a TG."""
+
+    def __init__(self, node: Node):
+        """DPDK TG environment constructor.
+
+        Args:
+            node: The target node to manage a DPDK environment.
+        """
+        super().__init__(node)
+
+    def setup(self) -> None:
+        """Set up the DPDK runtime on the target node."""
+        self._prepare_devbind_script()
+
+    def _prepare_devbind_script(self) -> None:
+        """Prepare the devbind script.
+
+        Copy the script build 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
+
+        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
+
+
+class DPDKSUTRuntimeEnvironment(DPDKRuntimeEnvironment):
+    """Class handling a DPDK runtime environment for a SUT."""
+
+    config: Final[DPDKRuntimeConfiguration]
     _logger: Final[DTSLogger]
 
+    build: Final[DPDKBuildEnvironment]
     timestamp: Final[str]
     _virtual_devices: list[VirtualDevice]
     _lcores: list[LogicalCore]
@@ -322,18 +392,18 @@ def __init__(
         self,
         config: DPDKRuntimeConfiguration,
         node: Node,
-        build_env: DPDKBuildEnvironment | None = None,
+        build_env: DPDKBuildEnvironment,
     ):
-        """DPDK environment constructor.
+        """DPDK SUT environment constructor.
 
         Args:
             config: The configuration of DPDK.
             node: The target node to manage a DPDK environment.
-            build_env: The DPDK build environment, if any.
+            build_env: The DPDK build environment.
         """
-        self.config = config
+        super().__init__(node)
         self.build = build_env
-        self._node = node
+        self.config = config
         self._logger = get_dts_logger()
 
         self.timestamp = f"{str(os.getpid())}_{time.strftime('%Y%m%d%H%M%S', time.localtime())}"
@@ -354,17 +424,11 @@ def __init__(
         self._ports_bound_to_dpdk = False
         self._kill_session = None
 
-    def setup(self):
+    def setup(self) -> None:
         """Set up the DPDK runtime on the target node."""
-        if self.build:
-            self.build.setup()
+        self.build.setup()
         self._prepare_devbind_script()
 
-    def teardown(self) -> None:
-        """Reset DPDK variables and bind port driver to the OS driver."""
-        if self.build:
-            self.build.teardown()
-
     def run_dpdk_app(
         self, app_path: PurePath, eal_params: EalParams, timeout: float = 30
     ) -> CommandResult:
@@ -385,38 +449,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,
@@ -459,3 +491,24 @@ def kill_cleanup_dpdk_apps(self) -> None:
     def get_virtual_devices(self) -> Iterable[VirtualDevice]:
         """The available DPDK virtual devices."""
         return (v for v in self._virtual_devices)
+
+    def _prepare_devbind_script(self) -> None:
+        """Prepare the devbind script.
+
+        Use the script within the associated build's tree.
+
+        This script is only available for Linux, if the detected session is not Linux then do
+        nothing.
+        """
+        if not isinstance(self._node.main_session, LinuxSession):
+            return
+
+        devbind_script_path = self._node.main_session.join_remote_path(
+            self.build.remote_dpdk_tree_path, "usertools", "dpdk-devbind.py"
+        )
+
+        self._node.main_session.devbind_script_path = devbind_script_path
+
+    def teardown(self) -> None:
+        """Reset DPDK variables and bind port driver to the OS driver."""
+        self.build.teardown()
diff --git a/dts/framework/test_run.py b/dts/framework/test_run.py
index 4355aeeb4b..274dceebfd 100644
--- a/dts/framework/test_run.py
+++ b/dts/framework/test_run.py
@@ -111,7 +111,10 @@
 from framework.context import Context, init_ctx
 from framework.exception import InternalError, SkippedTestException, TestCaseVerifyError
 from framework.logger import DTSLogger, get_dts_logger
-from framework.remote_session.dpdk import DPDKBuildEnvironment, DPDKRuntimeEnvironment
+from framework.remote_session.dpdk import (
+    DPDKBuildEnvironment,
+    DPDKSUTRuntimeEnvironment,
+)
 from framework.settings import SETTINGS
 from framework.test_result import Result, ResultNode, TestRunResult
 from framework.test_suite import BaseConfig, TestCase, TestSuite
@@ -199,11 +202,11 @@ def __init__(
         )
 
         dpdk_build_env = DPDKBuildEnvironment(config.dpdk.build, sut_node)
-        dpdk_runtime_env = DPDKRuntimeEnvironment(config.dpdk, sut_node, dpdk_build_env)
+        dpdk_sut_runtime_env = DPDKSUTRuntimeEnvironment(config.dpdk, sut_node, dpdk_build_env)
         traffic_generator = create_traffic_generator(config.traffic_generator, tg_node)
 
         self.ctx = Context(
-            sut_node, tg_node, topology, dpdk_build_env, dpdk_runtime_env, traffic_generator
+            sut_node, tg_node, topology, dpdk_build_env, dpdk_sut_runtime_env, traffic_generator
         )
         self.result = result
         self.selected_tests = list(self.config.filter_tests(tests_config))
-- 
2.50.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 2/2] dts: enable port binding on the TG
  2025-08-08 18:21 [PATCH 1/2] dts: introduce abstract class for TG and SUT DPDK runtime environments Andrew Bailey
@ 2025-08-08 18:21 ` Andrew Bailey
  2025-08-28 12:37   ` [PATCH v3] " Andrew Bailey
  2025-08-11 11:17 ` [PATCH 1/2] dts: introduce abstract class for TG and SUT DPDK runtime environments Luca Vizzarro
  1 sibling, 1 reply; 7+ messages in thread
From: Andrew Bailey @ 2025-08-08 18:21 UTC (permalink / raw)
  To: luca.vizzarro; +Cc: dev, dmarx, probb, Andrew Bailey

Currently, ports on the TG are not bound to the correct drivers prior to
running DTS. This causes DTS to crash if they are not initially bound to
the intended drivers.

Leverage TG runtime environment to bind TG ports to correct drivers
before and after running DTS.

Signed-off-by: Andrew Bailey <abailey@iol.unh.edu>
---
 dts/framework/test_run.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/dts/framework/test_run.py b/dts/framework/test_run.py
index 274dceebfd..16d7781536 100644
--- a/dts/framework/test_run.py
+++ b/dts/framework/test_run.py
@@ -114,6 +114,7 @@
 from framework.remote_session.dpdk import (
     DPDKBuildEnvironment,
     DPDKSUTRuntimeEnvironment,
+    DPDKTGRuntimeEnvironment,
 )
 from framework.settings import SETTINGS
 from framework.test_result import Result, ResultNode, TestRunResult
@@ -169,6 +170,7 @@ class TestRun:
     ctx: Context
     result: TestRunResult
     selected_tests: list[TestScenario]
+    tg_runtime_env: DPDKTGRuntimeEnvironment
 
     blocked: bool
     remaining_tests: deque[TestScenario]
@@ -203,6 +205,7 @@ def __init__(
 
         dpdk_build_env = DPDKBuildEnvironment(config.dpdk.build, sut_node)
         dpdk_sut_runtime_env = DPDKSUTRuntimeEnvironment(config.dpdk, sut_node, dpdk_build_env)
+        self.tg_runtime_env = DPDKTGRuntimeEnvironment(tg_node)
         traffic_generator = create_traffic_generator(config.traffic_generator, tg_node)
 
         self.ctx = Context(
@@ -343,6 +346,7 @@ def next(self) -> State | None:
 
         test_run.ctx.sut_node.setup()
         test_run.ctx.tg_node.setup()
+        test_run.tg_runtime_env.setup()
         test_run.ctx.dpdk.setup()
         test_run.ctx.topology.setup()
 
-- 
2.50.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] dts: introduce abstract class for TG and SUT DPDK runtime environments
  2025-08-08 18:21 [PATCH 1/2] dts: introduce abstract class for TG and SUT DPDK runtime environments Andrew Bailey
  2025-08-08 18:21 ` [PATCH 2/2] dts: enable port binding on the TG Andrew Bailey
@ 2025-08-11 11:17 ` Luca Vizzarro
  1 sibling, 0 replies; 7+ messages in thread
From: Luca Vizzarro @ 2025-08-11 11:17 UTC (permalink / raw)
  To: Andrew Bailey; +Cc: dev, dmarx, probb

I am not sure where these changes stem from. From my understanding, this 
enforces the creation of a DPDK environment for the TG, regardless if 
it's needed or not.

The only scenario I can think of this being useful is when paired with 
T-Rex. But like I've mentioned before, since the TG node is managed by 
the traffic generator class, I don't see why DTS should concern itself 
to setting up DPDK on the TG.

Logically, what I am thinking is that if T-Rex has an underlying DPDK 
requirement, then it should be the duty of the T-Rex Traffic Generator 
class to manage this. This behaviour should be agnostic to the overall 
test run, who should only care about our DPDK testing environment and a 
traffic generator.

Please let me know if I am missing something.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v3] dts: enable port binding on the TG
  2025-08-08 18:21 ` [PATCH 2/2] dts: enable port binding on the TG Andrew Bailey
@ 2025-08-28 12:37   ` Andrew Bailey
  2025-08-28 12:50     ` Luca Vizzarro
  2025-08-28 12:54     ` Patrick Robb
  0 siblings, 2 replies; 7+ messages in thread
From: Andrew Bailey @ 2025-08-28 12:37 UTC (permalink / raw)
  To: luca.vizzarro; +Cc: abailey, dev, dmarx, probb

Currently, ports on the TG are not bound to the correct drivers prior to
running DTS. This causes DTS to crash if they are not initially bound to
the intended drivers. Binding the TG ports to the proper driver caused
DTS to fail when the OS and DPDK drivers were the same, due to the port
link not being up. Changing the bound_for_dpdk method for a port to
return false when the OS driver and DPDK driver were shared on a TG
node allowed the TG ports to enter the logic to be brought up in the
configure_ports method within the topology class.

Leverage TG runtime environment to bind TG ports to correct drivers
before and after running DTS.

Signed-off-by: Andrew Bailey <abailey@iol.unh.edu>
---
 dts/framework/remote_session/dpdk.py    | 36 +----------------------
 dts/framework/testbed_model/port.py     |  7 ++++-
 dts/framework/testbed_model/topology.py | 38 +++++++++++++++++++++++++
 3 files changed, 45 insertions(+), 36 deletions(-)

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/port.py b/dts/framework/testbed_model/port.py
index fc58e2b993..e9ad145f97 100644
--- a/dts/framework/testbed_model/port.py
+++ b/dts/framework/testbed_model/port.py
@@ -126,7 +126,12 @@ def original_driver(self) -> str | None:
     @property
     def bound_for_dpdk(self) -> bool:
         """Is the port bound to the driver for DPDK?"""
-        return self.current_driver == self.config.os_driver_for_dpdk
+        dpdk_driver = self.config.os_driver_for_dpdk
+
+        if "TG" in self.node.name:
+            return self.current_driver == dpdk_driver and dpdk_driver != self.config.os_driver
+
+        return self.current_driver == dpdk_driver
 
     def configure_mtu(self, mtu: int):
         """Configure the port's MTU value.
diff --git a/dts/framework/testbed_model/topology.py b/dts/framework/testbed_model/topology.py
index 899ea0ad3a..b35a519719 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,41 @@ 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.
+
+        Copy devbind script from 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.
+        """
+        from framework.context import get_ctx
+
+        local_script_path = Path("..", "usertools", "dpdk-devbind.py").resolve()
+        valid_script_path = local_script_path.exists()
+
+        def prepare_node(node: Node) -> None:
+            if not isinstance(node.main_session, LinuxSession):
+                return
+
+            if not valid_script_path:
+                raise InternalError("Could not find dpdk-devbind.py locally.")
+
+            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
+
+        ctx = get_ctx()
+        prepare_node(ctx.tg_node)
+        prepare_node(ctx.sut_node)
+        # ctx.tg_node.main_session.bring_up_link(self.sut_ports)
+
     @property
     def sut_dpdk_ports(self) -> list[Port]:
         """The DPDK ports for the SUT node."""
-- 
2.50.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v3] dts: enable port binding on the TG
  2025-08-28 12:37   ` [PATCH v3] " Andrew Bailey
@ 2025-08-28 12:50     ` Luca Vizzarro
  2025-08-28 15:17       ` Andrew Bailey
  2025-08-28 12:54     ` Patrick Robb
  1 sibling, 1 reply; 7+ messages in thread
From: Luca Vizzarro @ 2025-08-28 12:50 UTC (permalink / raw)
  To: Andrew Bailey; +Cc: dev, dmarx, probb

Hi Andrew,

I see you've made a bit of a mess with the versioning. v2 was detached
from the thread, so this is confusing me. Can you make sure that (as per
contributing guidelines):
- you always reply with new patches to the very beginning of the thread
  (usually the cover letter of v1 – if it was a single patch, then a
  reply to that patch)
- you add a cover letter to your patch series explaining your changes
  across versions. You can check other emails in the mailing list to
  gather an understanding of this. Of course, if you are sending a
  single patch, a cover letter is not necessary, but you'll need to
  annotate your patch (the contributing guidelines who how this is done)

Finally, I cannot tell easily tell what changed from v2. Can you please
give a summary of the changes?

Best,
Luca

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v3] dts: enable port binding on the TG
  2025-08-28 12:37   ` [PATCH v3] " Andrew Bailey
  2025-08-28 12:50     ` Luca Vizzarro
@ 2025-08-28 12:54     ` Patrick Robb
  1 sibling, 0 replies; 7+ messages in thread
From: Patrick Robb @ 2025-08-28 12:54 UTC (permalink / raw)
  To: Andrew Bailey; +Cc: luca.vizzarro, dev, dmarx

[-- Attachment #1: Type: text/plain, Size: 647 bytes --]

Thanks Luca for the patch submission best practices advice. :)

Andrew we can chat more about the bound_for_dpdk() at the DTS meeting.

On Thu, Aug 28, 2025 at 8:38 AM Andrew Bailey <abailey@iol.unh.edu> wrote:

>
> +        ctx = get_ctx()
> +        prepare_node(ctx.tg_node)
> +        prepare_node(ctx.sut_node)
> +        # ctx.tg_node.main_session.bring_up_link(self.sut_ports)
>

Make sure to drop these commented out function calls and such when you
submit.


> +
>      @property
>      def sut_dpdk_ports(self) -> list[Port]:
>          """The DPDK ports for the SUT node."""
> --
> 2.50.1
>
>
Thanks Andrew.

[-- Attachment #2: Type: text/html, Size: 1256 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v3] dts: enable port binding on the TG
  2025-08-28 12:50     ` Luca Vizzarro
@ 2025-08-28 15:17       ` Andrew Bailey
  0 siblings, 0 replies; 7+ messages in thread
From: Andrew Bailey @ 2025-08-28 15:17 UTC (permalink / raw)
  To: Luca Vizzarro; +Cc: dev, dmarx, probb

[-- Attachment #1: Type: text/plain, Size: 1348 bytes --]

Thank you Luca for the feedback,

Future version patches will be in-reply-to the v1. From v2, the only thing
that has changed is the body of the method is_bound_for_dpdk in ports.py.
Before, it would check if the current driver was the same as the dpdk
driver which is inaccurate for the TG node using mellanox cards. This patch
adds coverage for TG's using mellanox cards in this method.

On Thu, Aug 28, 2025 at 8:50 AM Luca Vizzarro <luca.vizzarro@arm.com> wrote:

> Hi Andrew,
>
> I see you've made a bit of a mess with the versioning. v2 was detached
> from the thread, so this is confusing me. Can you make sure that (as per
> contributing guidelines):
> - you always reply with new patches to the very beginning of the thread
>   (usually the cover letter of v1 – if it was a single patch, then a
>   reply to that patch)
> - you add a cover letter to your patch series explaining your changes
>   across versions. You can check other emails in the mailing list to
>   gather an understanding of this. Of course, if you are sending a
>   single patch, a cover letter is not necessary, but you'll need to
>   annotate your patch (the contributing guidelines who how this is done)
>
> Finally, I cannot tell easily tell what changed from v2. Can you please
> give a summary of the changes?
>
> Best,
> Luca
>

[-- Attachment #2: Type: text/html, Size: 1799 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-08-28 15:18 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-08-08 18:21 [PATCH 1/2] dts: introduce abstract class for TG and SUT DPDK runtime environments Andrew Bailey
2025-08-08 18:21 ` [PATCH 2/2] dts: enable port binding on the TG Andrew Bailey
2025-08-28 12:37   ` [PATCH v3] " Andrew Bailey
2025-08-28 12:50     ` Luca Vizzarro
2025-08-28 15:17       ` Andrew Bailey
2025-08-28 12:54     ` Patrick Robb
2025-08-11 11:17 ` [PATCH 1/2] dts: introduce abstract class for TG and SUT DPDK runtime environments Luca Vizzarro

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).