On 3/3/2020 3:10 PM, Gregory Rose wrote:

On 2/28/2020 9:02 AM, Gregory Rose wrote:
On 2/27/2020 3:54 PM, Yi-Hung Wei wrote:
On Wed, Feb 26, 2020 at 9:41 AM Greg Rose <gvrose8...@gmail.com> wrote:
Since Linux kernel release 5.1 the fragments field of the inet_frag_queue
structure is removed and now only the rb_fragments structure with an
rb_node pointer is used for both ipv4 and ipv6.  In addition, the
atomic_sub and atomic_add functions are replaced with their
equivalent long counterparts.

Signed-off-by: Greg Rose <gvrose8...@gmail.com>
---
  acinclude.m4                                  |  2 ++
  datapath/linux/compat/include/net/inet_frag.h | 21 +++++++++++++++++++++
  2 files changed, 23 insertions(+)

diff --git a/acinclude.m4 b/acinclude.m4
index db64267..cad76c7 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -1067,6 +1067,8 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
[OVS_DEFINE([HAVE_RBTREE_RB_LINK_NODE_RCU])])
    OVS_GREP_IFELSE([$KSRC/include/net/dst_ops.h], [bool confirm_neigh],
[OVS_DEFINE([HAVE_DST_OPS_CONFIRM_NEIGH])])
+  OVS_GREP_IFELSE([$KSRC/include/net/inet_frag.h], [fqdir],
+                  [OVS_DEFINE([HAVE_INET_FRAG_FQDIR])])

    if cmp -s datapath/linux/kcompat.h.new \
              datapath/linux/kcompat.h >/dev/null 2>&1; then
diff --git a/datapath/linux/compat/include/net/inet_frag.h b/datapath/linux/compat/include/net/inet_frag.h
index 124c8be..e3c6df3 100644
--- a/datapath/linux/compat/include/net/inet_frag.h
+++ b/datapath/linux/compat/include/net/inet_frag.h
@@ -18,7 +18,16 @@ static inline bool inet_frag_evicting(struct inet_frag_queue *q)
  #ifdef HAVE_INET_FRAG_QUEUE_WITH_LIST_EVICTOR
         return !hlist_unhashed(&q->list_evictor);
  #else
+/*
+ * We can't use acinclude.m4 to check this as the field 'fragments'
+ * also matches 'rb_fragments'.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5,1,0)
         return (q_flags(q) & INET_FRAG_FIRST_IN) && q->fragments != NULL;
+#else
+       return (q_flags(q) & INET_FRAG_FIRST_IN) &&
+                       q->rb_fragments.rb_node != NULL;
+#endif
  #endif /* HAVE_INET_FRAG_QUEUE_WITH_LIST_EVICTOR */
  }
  #endif /* HAVE_INET_FRAG_EVICTING */
Yes, it's a bummer if we can not check some fields in the acinclude.m4.

It looks like inet_frag_evicting() has been removed by upstream commit
399d1404be66 ("inet: frags: get rif of inet_frag_evicting()") since
kernel 4.17, and the only place that we use is in rpl_ipfrag_init() ->
ip_expire() when HAVE_CORRECT_MRU_HANDLING is not available.
Therefore, how about the following approach that avoids the less
reliable kernel version check.

--- a/datapath/linux/compat/include/net/inet_frag.h
+++ b/datapath/linux/compat/include/net/inet_frag.h
@@ -12,6 +12,7 @@
  #define qp_flags(qp) (qp->q.flags)
  #endif

+#ifndef HAVE_CORRECT_MRU_HANDLING
  #ifndef HAVE_INET_FRAG_EVICTING
  static inline bool inet_frag_evicting(struct inet_frag_queue *q)
  {
@@ -22,6 +23,7 @@ static inline bool inet_frag_evicting(struct
inet_frag_queue *q)
  #endif /* HAVE_INET_FRAG_QUEUE_WITH_LIST_EVICTOR */
  }
  #endif /* HAVE_INET_FRAG_EVICTING */
+#endif /* HAVE_CORRECT_MRU_HANDLING */


I am good with the rest of the backports in this patch.

Hi Yi-Hung,

I have a V3 set of patches for this series but I found that the inet_frags changes in this patch (with or without your suggested change) are failing tests 59 and 60 in check-kmod on a Ubuntu 18.04 system with the 4.15.0-88-generic kernel.  I'm investigating that issue and should have the updated V3 patches ready as soon
as I sort this out.


It turns out the check-kmod (58-60) tests are failing on 4.15.0-88-generic with the master branch as well so that is something we'll need to investigate and fix. For now I'll go ahead and prep the V3 patch series and send them on when ready.

Thanks,

- Greg

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to