[PATCH v4 4/5] dts: add OS abstractions for creating virtual functions

Juraj Linkeš juraj.linkes at pantheon.tech
Wed Sep 25 14:05:06 CEST 2024


> diff --git a/dts/framework/testbed_model/linux_session.py b/dts/framework/testbed_model/linux_session.py

> @@ -210,3 +214,37 @@ def configure_ipv4_forwarding(self, enable: bool) -> None:
>           """Overrides :meth:`~.os_session.OSSession.configure_ipv4_forwarding`."""
>           state = 1 if enable else 0
>           self.send_command(f"sysctl -w net.ipv4.ip_forward={state}", privileged=True)
> +
> +    def set_num_virtual_functions(self, num: int, pf_port: Port) -> bool:
> +        """Overrides :meth:`~.os_session.OSSession.set_num_virtual_functions`."""
> +        sys_bus_path = f"/sys/bus/pci/devices/{pf_port.pci}/sriov_numvfs".replace(":", "\\:")
> +        curr_num_vfs = int(self.send_command(f"cat {sys_bus_path}").stdout)
> +        if num > 0 and curr_num_vfs >= num:
> +            self._logger.info(
> +                f"{curr_num_vfs} VFs already configured on port {pf_port.identifier.pci} on node "
> +                f"{pf_port.identifier.node}."
> +            )
> +            return False
> +        elif num > 0 and curr_num_vfs > 0:

These two conditions could be written as:
if num > 0:
     if curr_num_vfs >= num:
         return False
     elif curr_num_vfs > 0:
         raise InternalError()

Maybe it's not worth the extra indent, but it's easier to understand, so 
I lean towards doing it this way.


> +    def get_pci_addr_of_vfs(self, pf_port: Port) -> list[str]:
> +        """Overrides :meth:`~.os_session.OSSession.get_pci_addr_of_vfs`."""
> +        sys_bus_path = f"/sys/bus/pci/devices/{pf_port.pci}".replace(":", "\\:")
> +        curr_num_vfs = int(self.send_command(f"cat {sys_bus_path}/sriov_numvfs").stdout)
> +        if curr_num_vfs > 0:
> +            pci_addrs = self.send_command(
> +                'awk -F "PCI_SLOT_NAME=" "/PCI_SLOT_NAME=/ {print \\$2}" '
> +                + f"{sys_bus_path}/virtfn*/uevent",

We could use a TextParser here. Not sure if it's a good fit though.


> diff --git a/dts/framework/testbed_model/os_session.py b/dts/framework/testbed_model/os_session.py

> @@ -395,3 +395,43 @@ def configure_ipv4_forwarding(self, enable: bool) -> None:

> +    @abstractmethod
> +    def set_num_virtual_functions(self, num: int, pf_port: Port) -> bool:
> +        """Update the number of virtual functions (VFs) on a port.
> +
> +        It should be noted that, due to the nature of VFs, if there are already VFs that exist on
> +        the physical function (PF) prior to calling this function, additional ones cannot be added.
> +        The only way to add more VFs is to remove the existing and then set the desired amount. For
> +        this reason, this method will handle creation in the following order:
> +
> +        1. Use existing VFs on the PF if the number of existing VFs is greater than or equal to
> +        `num`
> +        2. Throw an exception noting that VFs cannot be created if the PF has some VFs already set
> +        on it, but the total VFs that it has are less then `num`.
> +        3. Create `num` VFs on the PF if there are none on it already
> +
> +        Args:
> +            num: The number of VFs to set on the port.
> +            pf_port: The port to add the VFs to.
> +
> +        Raises:
> +            InternalError: If `pf_port` has less than `num` VFs configured on it
> +                already.
> +
> +        Returns:
> +            :data:`True` if this method successfully created VFs, :data:`False` if existing VFs
> +            were used instead.
> +        """

The whole docstring talks only about the creation of VFs, but we can 
also remove VFs with this.





More information about the dev mailing list