On Mon, Oct 02, 2017 at 12:36:33PM -0700, Tom Herbert wrote: > On Mon, Oct 2, 2017 at 1:41 AM, Simon Horman <simon.hor...@netronome.com> > wrote: > > Move dissection of tunnel info from the flower classifier to the flow > > dissector where all other dissection occurs. This should not have any > > behavioural affect on other users of the flow dissector.
... > > +static void > > +__skb_flow_dissect_tunnel_info(const struct sk_buff *skb, > > + struct flow_dissector *flow_dissector, > > + void *target_container) > > +{ > > + struct ip_tunnel_info *info; > > + struct ip_tunnel_key *key; > > + > > + /* A quick check to see if there might be something to do. */ > > + if (!dissector_uses_key(flow_dissector, > > + FLOW_DISSECTOR_KEY_ENC_KEYID) && > > + !dissector_uses_key(flow_dissector, > > + FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) && > > + !dissector_uses_key(flow_dissector, > > + FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS) && > > + !dissector_uses_key(flow_dissector, > > + FLOW_DISSECTOR_KEY_ENC_CONTROL) && > > + !dissector_uses_key(flow_dissector, > > + FLOW_DISSECTOR_KEY_ENC_PORTS)) > > + return; > > This complex conditional is now in the path of every call to flow > dissector regardless of whether a classifier is enabled or tunnels > are. What does the assembly show in terms of number of branches? Can > we at least get this down to one check (might be a use case for > FLOW_DISSECTOR_F_FLOWER ;-) ), or even better use the static key when > encap or is enabled? Hi Tom, it appears to me (a little to my surprise but I did check before posting) that the compiler turns the above into a single comparison. $ gcc --version gcc (Debian 4.9.2-10) 4.9.2 Copyright (C) 2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.