Currently, users must modprobe VFIO-PCI before running DTS when using a non-mellanox NIC. This patch automates the process on test run start up. In addition, if the SUT is expected to use a subset of a few QAT devices, VFIO-PCI must be loaded in a separate manner. This patch adds this distinction.
Signed-off-by: Andrew Bailey <[email protected]> --- dts/framework/testbed_model/linux_session.py | 24 ++++++++++++++++++++ dts/framework/testbed_model/node.py | 4 ++++ dts/framework/testbed_model/os_session.py | 4 ++++ 3 files changed, 32 insertions(+) diff --git a/dts/framework/testbed_model/linux_session.py b/dts/framework/testbed_model/linux_session.py index 8d678c5b5d..1bc8bd54b9 100644 --- a/dts/framework/testbed_model/linux_session.py +++ b/dts/framework/testbed_model/linux_session.py @@ -224,6 +224,30 @@ def devbind_script_path(self) -> PurePath: """ raise InternalError("Accessed devbind script path before setup.") + def load_vfio(self, pf_port: Port) -> None: + """Overrides :meth:'~os_session.OSSession,load_vfio`.""" + cmd_result = self.send_command(f"lspci -nn -s {pf_port.pci}") + device = re.search(r":([0-9a-fA-F]{4})\]", cmd_result.stdout) + if device and device.group(1) in ["37c8", "0435", "19e2"]: + self.send_command( + "modprobe -r vfio_iommu_type1; modprobe -r vfio_pci", + privileged=True, + ) + self.send_command( + "modprobe -r vfio_virqfd; modprobe -r vfio", + privileged=True, + ) + self.send_command( + "modprobe vfio-pci disable_denylist=1 enable_sriov=1", privileged=True + ) + self.send_command( + "echo 1 | tee /sys/module/vfio/parameters/enable_unsafe_noiommu_mode", + privileged=True, + ) + else: + self.send_command("modprobe vfio-pci") + self.refresh_lshw() + def create_crypto_vfs(self, pf_port: list[Port]) -> None: """Overrides :meth:`~os_session.OSSession.create_crypto_vfs`. diff --git a/dts/framework/testbed_model/node.py b/dts/framework/testbed_model/node.py index a4c1f8f22c..2f8d40e8f3 100644 --- a/dts/framework/testbed_model/node.py +++ b/dts/framework/testbed_model/node.py @@ -86,6 +86,10 @@ def __init__(self, node_config: NodeConfiguration) -> None: self.cryptodevs = [ Port(self, cryptodev_config) for cryptodev_config in self.config.cryptodevs ] + if self.cryptodevs: + self.main_session.load_vfio(self.cryptodevs[0]) + elif self.ports and self.ports[0].config.os_driver_for_dpdk == "vfio-pci": + self.main_session.load_vfio(self.ports[0]) self._logger.info(f"Created node: {self.name}") def setup(self) -> None: diff --git a/dts/framework/testbed_model/os_session.py b/dts/framework/testbed_model/os_session.py index 2eeeea6967..4a4fc1f34a 100644 --- a/dts/framework/testbed_model/os_session.py +++ b/dts/framework/testbed_model/os_session.py @@ -615,6 +615,10 @@ def configure_port_mtu(self, mtu: int, port: Port) -> None: port: Port to set `mtu` on. """ + @abstractmethod + def load_vfio(self, pf_port: Port) -> None: + """Load the vfio module according to the device type of the given port.""" + @abstractmethod def create_crypto_vfs(self, pf_ports: list[Port]) -> None: """Creatues virtual functions for each port in 'pf_ports'. -- 2.50.1

