[ovs-dev,2/9] compat: Fix up changes to inet frags in 5.1+
diff mbox series

Message ID 1582584158-16348-2-git-send-email-gvrose8192@gmail.com
State Superseded
Headers show
Series
  • [ovs-dev,1/9] acinclude: Enable Linux kernel 5.5
Related show

Commit Message

Greg Rose Feb. 24, 2020, 10:42 p.m. UTC
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 <gvrose8192@gmail.com>
---
 acinclude.m4                                  |  2 ++
 datapath/linux/compat/include/net/inet_frag.h | 21 +++++++++++++++++++++
 2 files changed, 23 insertions(+)

Patch
diff mbox series

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 */
@@ -29,6 +38,10 @@  static inline bool inet_frag_evicting(struct inet_frag_queue *q)
 #define inet_frag_lru_move(q)
 #endif
 
+#ifdef HAVE_INET_FRAG_FQDIR
+#define netns_frags fqdir
+#endif
+
 #ifndef HAVE_SUB_FRAG_MEM_LIMIT_ARG_STRUCT_NETNS_FRAGS
 #ifdef HAVE_FRAG_PERCPU_COUNTER_BATCH
 static inline void rpl_sub_frag_mem_limit(struct netns_frags *nf, int i)
@@ -45,13 +58,21 @@  static inline void rpl_add_frag_mem_limit(struct netns_frags *nf, int i)
 #else /* !frag_percpu_counter_batch */
 static inline void rpl_sub_frag_mem_limit(struct netns_frags *nf, int i)
 {
+#ifdef HAVE_INET_FRAG_FQDIR
+	atomic_long_sub(i, &nf->mem);
+#else
 	atomic_sub(i, &nf->mem);
+#endif
 }
 #define sub_frag_mem_limit rpl_sub_frag_mem_limit
 
 static inline void rpl_add_frag_mem_limit(struct netns_frags *nf, int i)
 {
+#ifdef HAVE_INET_FRAG_FQDIR
+	atomic_long_add(i, &nf->mem);
+#else
 	atomic_add(i, &nf->mem);
+#endif
 }
 #define add_frag_mem_limit rpl_add_frag_mem_limit
 #endif /* frag_percpu_counter_batch */