[ovs-dev] [PATCH] compat: Initialize IPv4 reassembly secret timer

Greg Rose gvrose8192 at gmail.com
Fri Jul 20 01:48:31 UTC 2018


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 <gvrose8192 at gmail.com>
---
 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



More information about the dev mailing list