Blame SOURCES/BZ_1931355-SRIOV-wait-VF-mount-decrease.patch

8662b7
From 80c97b27707b036f0a54988ade4bda3ccb342b34 Mon Sep 17 00:00:00 2001
520691
From: Fernando Fernandez Mancera <ffmancera@riseup.net>
520691
Date: Mon, 22 Feb 2021 12:03:11 +0100
8662b7
Subject: [PATCH 1/2] SR-IOV: increase the verification timeout if SR-IOV is
520691
 present
520691
520691
Certain drivers like i40e take a long time to modify the VFs in the
520691
kernel. Nmstate is timing out on verification because of that. In order
520691
to fix this, nmstate is incresing the verification time if SR-IOV is
520691
present on the desired state.
520691
520691
Signed-off-by: Fernando Fernandez Mancera <ffmancera@riseup.net>
8662b7
Signed-off-by: Gris Ge <fge@redhat.com>
520691
---
8662b7
 libnmstate/ifaces/ethernet.py |  6 ++++++
520691
 libnmstate/netapplier.py      | 18 +++++++++++++++++-
8662b7
 2 files changed, 23 insertions(+), 1 deletion(-)
520691
520691
diff --git a/libnmstate/ifaces/ethernet.py b/libnmstate/ifaces/ethernet.py
8662b7
index 292b7bc..ca8501b 100644
520691
--- a/libnmstate/ifaces/ethernet.py
520691
+++ b/libnmstate/ifaces/ethernet.py
8662b7
@@ -65,6 +65,12 @@ class EthernetIface(BaseIface):
8662b7
     def is_peer(self):
8662b7
         return self._is_peer
520691
 
8662b7
+    @property
520691
+    def is_sriov(self):
520691
+        return self.raw.get(Ethernet.CONFIG_SUBTREE, {}).get(
8662b7
+            Ethernet.SRIOV_SUBTREE
520691
+        )
520691
+
520691
     def create_sriov_vf_ifaces(self):
520691
         return [
520691
             EthernetIface(
520691
diff --git a/libnmstate/netapplier.py b/libnmstate/netapplier.py
8662b7
index cf208d1..3c5759b 100644
520691
--- a/libnmstate/netapplier.py
520691
+++ b/libnmstate/netapplier.py
8662b7
@@ -24,6 +24,7 @@ import time
520691
 
520691
 from libnmstate import validator
520691
 from libnmstate.error import NmstateVerificationError
520691
+from libnmstate.schema import InterfaceType
520691
 
520691
 from .nmstate import create_checkpoints
520691
 from .nmstate import destroy_checkpoints
8662b7
@@ -37,6 +38,7 @@ from .version import get_version
520691
 MAINLOOP_TIMEOUT = 35
520691
 VERIFY_RETRY_INTERNAL = 1
520691
 VERIFY_RETRY_TIMEOUT = 5
520691
+VERIFY_RETRY_TIMEOUT_INCREASE = 4
520691
 
520691
 
520691
 def apply(
8662b7
@@ -109,7 +111,13 @@ def _apply_ifaces_state(plugins, net_state, verify_change, save_to_disk):
520691
         plugin.apply_changes(net_state, save_to_disk)
520691
     verified = False
520691
     if verify_change:
520691
-        for _ in range(VERIFY_RETRY_TIMEOUT):
520691
+        if _net_state_contains_sriov_interface(net_state):
520691
+            # If SR-IOV is present, the verification timeout is being increased
520691
+            # to avoid timeouts due to slow drivers like i40e.
520691
+            verify_retry = VERIFY_RETRY_TIMEOUT * VERIFY_RETRY_TIMEOUT_INCREASE
520691
+        else:
520691
+            verify_retry = VERIFY_RETRY_TIMEOUT
520691
+        for _ in range(verify_retry):
520691
             try:
520691
                 _verify_change(plugins, net_state)
520691
                 verified = True
8662b7
@@ -120,6 +128,14 @@ def _apply_ifaces_state(plugins, net_state, verify_change, save_to_disk):
520691
             _verify_change(plugins, net_state)
520691
 
520691
 
520691
+def _net_state_contains_sriov_interface(net_state):
8662b7
+    for iface in net_state.ifaces.all_kernel_ifaces.values():
520691
+        if iface.type == InterfaceType.ETHERNET and iface.is_sriov:
520691
+            return True
520691
+
520691
+    return False
520691
+
520691
+
520691
 def _verify_change(plugins, net_state):
520691
     current_state = show_with_plugins(plugins)
520691
     net_state.verify(current_state)
520691
-- 
8662b7
2.27.0
8662b7
8662b7
8662b7
From 439fe3a51a82060c5b62974c6c9fbdf403c4196b Mon Sep 17 00:00:00 2001
8662b7
From: Fernando Fernandez Mancera <ffmancera@riseup.net>
8662b7
Date: Mon, 22 Feb 2021 13:33:06 +0100
8662b7
Subject: [PATCH 2/2] SR-IOV: fail on verification if `total_vfs` does not
8662b7
 match vfs len
8662b7
8662b7
Signed-off-by: Fernando Fernandez Mancera <ffmancera@riseup.net>
8662b7
Signed-off-by: Gris Ge <fge@redhat.com>
8662b7
---
8662b7
 libnmstate/ifaces/ethernet.py | 11 +++++++++++
8662b7
 libnmstate/ifaces/ifaces.py   | 14 ++++++++++++++
8662b7
 2 files changed, 25 insertions(+)
8662b7
8662b7
diff --git a/libnmstate/ifaces/ethernet.py b/libnmstate/ifaces/ethernet.py
8662b7
index ca8501b..55772ce 100644
8662b7
--- a/libnmstate/ifaces/ethernet.py
8662b7
+++ b/libnmstate/ifaces/ethernet.py
8662b7
@@ -61,6 +61,14 @@ class EthernetIface(BaseIface):
8662b7
             .get(Ethernet.SRIOV.TOTAL_VFS, 0)
8662b7
         )
8662b7
 
8662b7
+    @property
8662b7
+    def sriov_vfs(self):
8662b7
+        return (
8662b7
+            self.raw.get(Ethernet.CONFIG_SUBTREE, {})
8662b7
+            .get(Ethernet.SRIOV_SUBTREE, {})
8662b7
+            .get(Ethernet.SRIOV.VFS_SUBTREE, [])
8662b7
+        )
8662b7
+
8662b7
     @property
8662b7
     def is_peer(self):
8662b7
         return self._is_peer
8662b7
@@ -108,6 +116,9 @@ class EthernetIface(BaseIface):
8662b7
             for i in range(self.sriov_total_vfs, old_sriov_total_vfs)
8662b7
         ]
8662b7
 
8662b7
+    def check_total_vfs_matches_vf_list(self, total_vfs):
8662b7
+        return total_vfs == len(self.sriov_vfs)
8662b7
+
8662b7
 
8662b7
 def _capitalize_sriov_vf_mac(state):
8662b7
     vfs = (
8662b7
diff --git a/libnmstate/ifaces/ifaces.py b/libnmstate/ifaces/ifaces.py
8662b7
index 44c9e61..6c94a98 100644
8662b7
--- a/libnmstate/ifaces/ifaces.py
8662b7
+++ b/libnmstate/ifaces/ifaces.py
8662b7
@@ -238,6 +238,8 @@ class Ifaces:
8662b7
                     if new_iface.name not in self._kernel_ifaces:
8662b7
                         new_iface.mark_as_desired()
8662b7
                         new_ifaces.append(new_iface)
8662b7
+                    else:
8662b7
+                        self._kernel_ifaces[new_iface.name].mark_as_desired()
8662b7
         for new_iface in new_ifaces:
8662b7
             self._kernel_ifaces[new_iface.name] = new_iface
8662b7
 
8662b7
@@ -656,6 +658,18 @@ class Ifaces:
8662b7
                                 cur_iface.state_for_verify(),
8662b7
                             )
8662b7
                         )
8662b7
+                    elif (
8662b7
+                        iface.type == InterfaceType.ETHERNET and iface.is_sriov
8662b7
+                    ):
8662b7
+                        if not cur_iface.check_total_vfs_matches_vf_list(
8662b7
+                            iface.sriov_total_vfs
8662b7
+                        ):
8662b7
+                            raise NmstateVerificationError(
8662b7
+                                "The NIC exceeded the waiting time for "
8662b7
+                                "verification and it is failing because "
8662b7
+                                "the `total_vfs` does not match the VF "
8662b7
+                                "list length."
8662b7
+                            )
8662b7
 
8662b7
     def gen_dns_metadata(self, dns_state, route_state):
8662b7
         iface_metadata = dns_state.gen_metadata(self, route_state)
8662b7
-- 
8662b7
2.27.0
520691