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

Gregory Rose gvrose8192 at gmail.com
Fri Jul 20 19:25:33 UTC 2018


On 7/19/2018 6:48 PM, Greg Rose 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.
>
> 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>

Copying Pravin and Flavio as well.

- Greg

> ---
>   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;



More information about the dev mailing list