On Wed, 2016-01-20 at 16:27 -0800, Jesse Gross wrote: > GRO is currently not aware of tunnel metadata generated by lightweight > tunnels and stored in the dst. This leads to two possible problems: > * Incorrectly merging two frames that have different metadata. > * Leaking of allocated metadata from merged frames. > > This avoids those problems by comparing the tunnel information before > merging, similar to how we handle other metadata (such as vlan tags), > and releasing any state when we are done. > > Reported-by: John <john.philli...@hpe.com> > Fixes: 2e15ea39 ("ip_gre: Add support to collect tunnel metadata.") > Signed-off-by: Jesse Gross <je...@kernel.org> > --- > include/net/dst_metadata.h | 23 +++++++++++++++++++++++ > net/core/dev.c | 9 +++++++-- > 2 files changed, 30 insertions(+), 2 deletions(-) > > diff --git a/include/net/dst_metadata.h b/include/net/dst_metadata.h > index 6816f0f..c3de935 100644 > --- a/include/net/dst_metadata.h > +++ b/include/net/dst_metadata.h > @@ -44,6 +44,29 @@ static inline bool skb_valid_dst(const struct sk_buff *skb) > return dst && !(dst->flags & DST_METADATA); > } > > +static inline int skb_metadata_dst_cmp(struct sk_buff *skb_a, > + struct sk_buff *skb_b) > +{ > + const struct metadata_dst *a = skb_metadata_dst(skb_a); > + const struct metadata_dst *b = skb_metadata_dst(skb_b); > + > + if (!a != !b) > + return 1; > + > + if (!a) > + return 0; > +
It is adding 4 conditional test per flow in GRO engine for the fast path... With up to 8 flows in GRO (per RX queue), it is a total of 32 added conditional tests. You should shortcut to one test : if (!(skb_a->_skb_refdst | skb_b->_skb_refdst) return 0;