Projects
home:Eustace:branches:Eulaceura:Factory
nmstate
_service:obs_scm:BZ_1931355-SRIOV-wait-VF-mount...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:obs_scm:BZ_1931355-SRIOV-wait-VF-mount-decrease.patch of Package nmstate
From 80c97b27707b036f0a54988ade4bda3ccb342b34 Mon Sep 17 00:00:00 2001 From: Fernando Fernandez Mancera <ffmancera@riseup.net> Date: Mon, 22 Feb 2021 12:03:11 +0100 Subject: [PATCH 1/2] SR-IOV: increase the verification timeout if SR-IOV is present Certain drivers like i40e take a long time to modify the VFs in the kernel. Nmstate is timing out on verification because of that. In order to fix this, nmstate is incresing the verification time if SR-IOV is present on the desired state. Signed-off-by: Fernando Fernandez Mancera <ffmancera@riseup.net> Signed-off-by: Gris Ge <fge@redhat.com> --- libnmstate/ifaces/ethernet.py | 6 ++++++ libnmstate/netapplier.py | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/libnmstate/ifaces/ethernet.py b/libnmstate/ifaces/ethernet.py index 292b7bc..ca8501b 100644 --- a/libnmstate/ifaces/ethernet.py +++ b/libnmstate/ifaces/ethernet.py @@ -65,6 +65,12 @@ class EthernetIface(BaseIface): 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( 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) -- 2.27.0 From 439fe3a51a82060c5b62974c6c9fbdf403c4196b Mon Sep 17 00:00:00 2001 From: Fernando Fernandez Mancera <ffmancera@riseup.net> Date: Mon, 22 Feb 2021 13:33:06 +0100 Subject: [PATCH 2/2] SR-IOV: fail on verification if `total_vfs` does not match vfs len Signed-off-by: Fernando Fernandez Mancera <ffmancera@riseup.net> Signed-off-by: Gris Ge <fge@redhat.com> --- libnmstate/ifaces/ethernet.py | 11 +++++++++++ libnmstate/ifaces/ifaces.py | 14 ++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/libnmstate/ifaces/ethernet.py b/libnmstate/ifaces/ethernet.py index ca8501b..55772ce 100644 --- a/libnmstate/ifaces/ethernet.py +++ b/libnmstate/ifaces/ethernet.py @@ -61,6 +61,14 @@ class EthernetIface(BaseIface): .get(Ethernet.SRIOV.TOTAL_VFS, 0) ) + @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 @@ -108,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) -- 2.27.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2