From 46130c22d9908110f16de30f193956166b49d4c5 Mon Sep 17 00:00:00 2001 From: Packit Service Date: Feb 24 2021 18:34:29 +0000 Subject: Apply patch BZ_1931355-SRIOV-wait-VF-mount-decrease.patch patch_name: BZ_1931355-SRIOV-wait-VF-mount-decrease.patch present_in_specfile: true location_in_specfile: 2 --- diff --git a/libnmstate/ifaces/ethernet.py b/libnmstate/ifaces/ethernet.py index 292b7bc..55772ce 100644 --- a/libnmstate/ifaces/ethernet.py +++ b/libnmstate/ifaces/ethernet.py @@ -62,9 +62,23 @@ class EthernetIface(BaseIface): ) @property + def sriov_vfs(self): + return ( + self.raw.get(Ethernet.CONFIG_SUBTREE, {}) + .get(Ethernet.SRIOV_SUBTREE, {}) + .get(Ethernet.SRIOV.VFS_SUBTREE, []) + ) + + @property def is_peer(self): return self._is_peer + @property + def is_sriov(self): + return self.raw.get(Ethernet.CONFIG_SUBTREE, {}).get( + Ethernet.SRIOV_SUBTREE + ) + def create_sriov_vf_ifaces(self): return [ EthernetIface( @@ -102,6 +116,9 @@ class EthernetIface(BaseIface): for i in range(self.sriov_total_vfs, old_sriov_total_vfs) ] + def check_total_vfs_matches_vf_list(self, total_vfs): + return total_vfs == len(self.sriov_vfs) + def _capitalize_sriov_vf_mac(state): vfs = ( diff --git a/libnmstate/ifaces/ifaces.py b/libnmstate/ifaces/ifaces.py index 44c9e61..6c94a98 100644 --- a/libnmstate/ifaces/ifaces.py +++ b/libnmstate/ifaces/ifaces.py @@ -238,6 +238,8 @@ class Ifaces: if new_iface.name not in self._kernel_ifaces: new_iface.mark_as_desired() new_ifaces.append(new_iface) + else: + self._kernel_ifaces[new_iface.name].mark_as_desired() for new_iface in new_ifaces: self._kernel_ifaces[new_iface.name] = new_iface @@ -656,6 +658,18 @@ class Ifaces: cur_iface.state_for_verify(), ) ) + elif ( + iface.type == InterfaceType.ETHERNET and iface.is_sriov + ): + if not cur_iface.check_total_vfs_matches_vf_list( + iface.sriov_total_vfs + ): + raise NmstateVerificationError( + "The NIC exceeded the waiting time for " + "verification and it is failing because " + "the `total_vfs` does not match the VF " + "list length." + ) def gen_dns_metadata(self, dns_state, route_state): iface_metadata = dns_state.gen_metadata(self, route_state) diff --git a/libnmstate/netapplier.py b/libnmstate/netapplier.py index cf208d1..3c5759b 100644 --- a/libnmstate/netapplier.py +++ b/libnmstate/netapplier.py @@ -24,6 +24,7 @@ import time from libnmstate import validator from libnmstate.error import NmstateVerificationError +from libnmstate.schema import InterfaceType from .nmstate import create_checkpoints from .nmstate import destroy_checkpoints @@ -37,6 +38,7 @@ from .version import get_version MAINLOOP_TIMEOUT = 35 VERIFY_RETRY_INTERNAL = 1 VERIFY_RETRY_TIMEOUT = 5 +VERIFY_RETRY_TIMEOUT_INCREASE = 4 def apply( @@ -109,7 +111,13 @@ def _apply_ifaces_state(plugins, net_state, verify_change, save_to_disk): plugin.apply_changes(net_state, save_to_disk) verified = False if verify_change: - for _ in range(VERIFY_RETRY_TIMEOUT): + if _net_state_contains_sriov_interface(net_state): + # If SR-IOV is present, the verification timeout is being increased + # to avoid timeouts due to slow drivers like i40e. + verify_retry = VERIFY_RETRY_TIMEOUT * VERIFY_RETRY_TIMEOUT_INCREASE + else: + verify_retry = VERIFY_RETRY_TIMEOUT + for _ in range(verify_retry): try: _verify_change(plugins, net_state) verified = True @@ -120,6 +128,14 @@ def _apply_ifaces_state(plugins, net_state, verify_change, save_to_disk): _verify_change(plugins, net_state) +def _net_state_contains_sriov_interface(net_state): + for iface in net_state.ifaces.all_kernel_ifaces.values(): + if iface.type == InterfaceType.ETHERNET and iface.is_sriov: + return True + + return False + + def _verify_change(plugins, net_state): current_state = show_with_plugins(plugins) net_state.verify(current_state)