On 7/20/2018 2:00 PM, Yi-Hung Wei wrote:
On Thu, Jul 19, 2018 at 6:48 PM, Greg Rose <gvrose8...@gmail.com> wrote:
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.
Thanks Greg for the patch. The bug hides much deeper than I would expect.
Also remove the prior, and now unnecessary, work around.
VMware BZ 2094203
A minor nit, maybe VMware-BZ: #2094203
I'm fine with that. I wasn't aware of any specific format.
--- 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
This is a great catch! Looks like we remove the secret_interval in
net-next commit
e3a57d18b061 ("inet: frag: remove periodic secret rebuild timer")
But somehow RHEL kernel still retain this field, and the
secret_interval was set to 10 * 60 * HZ.
I would recommend to set 'secret_interval' by grepping this filed in
'struct inet_frags' rather than by kernel version. So that if RHEL 8
kernel still have this field, your fix will apply.
That's a good point to raise.
My thinking was to specifically call it out for RHEL 7 because it hasn't
been in the kernel since 3.16
and this bug is RHEL 7 specific. That's a long way back and I'm sure it
will not be there in
the RHEL 8 kernel. This makes it clear that it is only for RHEL 7 and
nothing else.
However, if you and others feel strongly about it I don't mind making
the change.
--- 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
Same for here.
-Yi-Hung
Thanks for the review! I'll wait another day or two to get more feedback.
- Greg
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev