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 <[email protected]> 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 <[email protected]>
---
  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.

Thanks,

- Greg

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to