The RHEL 7 kernels expect the secret timer interval to be initialized
before calling the inet_frags_init() function. By not initializing it
the inet_frags_secret_rebuild() function was running on every tick
rather than on the expected interval. This caused occasional panics
from page faults when inet_frags_secret_rebuild() would try to rearm a
timer from the openvswitch kernel module which had just been removed.
Also remove the prior, and now unnecessary, work around.
VMware BZ 2094203
Fixes: 595e069a ("compat: Backport IPv4 reassembly.")
Signed-off-by: Greg Rose <[email protected]>
---
datapath/datapath.c | 10 ----------
datapath/linux/compat/ip_fragment.c | 3 +++
datapath/linux/compat/nf_conntrack_reasm.c | 3 +++
3 files changed, 6 insertions(+), 10 deletions(-)
diff --git a/datapath/datapath.c b/datapath/datapath.c
index 43f0d74..3ea240a 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -2478,16 +2478,6 @@ error:
static void dp_cleanup(void)
{
-#if RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8,0)
- /* On RHEL 7.x kernels we hit a kernel paging error without
- * this barrier and subsequent hefty delay. A process will
- * attempt to access openvwitch memory after it has been
- * unloaded. Further debugging is needed on that but for
- * now let's not let customer machines panic.
- */
- rcu_barrier();
- msleep(3000);
-#endif
dp_unregister_genl(ARRAY_SIZE(dp_genl_families));
ovs_netdev_exit();
unregister_netdevice_notifier(&ovs_dp_device_notifier);
diff --git a/datapath/linux/compat/ip_fragment.c
b/datapath/linux/compat/ip_fragment.c
index 8f2012b..f910b99 100644
--- a/datapath/linux/compat/ip_fragment.c
+++ b/datapath/linux/compat/ip_fragment.c
@@ -812,6 +812,9 @@ int __init rpl_ipfrag_init(void)
#ifdef HAVE_INET_FRAGS_WITH_FRAGS_WORK
ip4_frags.frags_cache_name = ip_frag_cache_name;
#endif
+#if RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8,0)
+ ip4_frags.secret_interval = 10 * 60 * HZ;
+#endif
if (inet_frags_init(&ip4_frags)) {
pr_warn("IP: failed to allocate ip4_frags cache\n");
return -ENOMEM;
diff --git a/datapath/linux/compat/nf_conntrack_reasm.c
b/datapath/linux/compat/nf_conntrack_reasm.c
index ea153c3..ce13112 100644
--- a/datapath/linux/compat/nf_conntrack_reasm.c
+++ b/datapath/linux/compat/nf_conntrack_reasm.c
@@ -643,6 +643,9 @@ int rpl_nf_ct_frag6_init(void)
#ifdef HAVE_INET_FRAGS_WITH_FRAGS_WORK
nf_frags.frags_cache_name = nf_frags_cache_name;
#endif
+#if RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8,0)
+ nf_frags.secret_interval = 10 * 60 * HZ;
+#endif
ret = inet_frags_init(&nf_frags);
if (ret)
goto out;
--
1.8.3.1
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev