@@ -1048,6 +1048,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
@@ -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 */
/* Upstream commit 3fd588eb90bf ("inet: frag: remove lru list") dropped this
* function, but we call it from our compat code. Provide a noop version. */
@@ -29,6 +31,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 +51,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 */