On Sat, Sep 26, 2020 at 08:30:58PM +0300, Vladimir Oltean wrote: > For all DSA formats that don't use tail tags, it looks like behind the > obscure number crunching they're all doing the same thing: locating the > real EtherType behind the DSA tag. Nonetheless, this is not immediately > obvious, so create a generic helper for those DSA taggers that put the > header before the EtherType.
This is interesting, and opens up the possibility of an optimisation on the hot path. net/core/flow_dissector.c: bool __skb_flow_dissect(const struct net *net, const struct sk_buff *skb, struct flow_dissector *flow_dissector, void *target_container, void *data, __be16 proto, int nhoff, int hlen, unsigned int flags) { ... #if IS_ENABLED(CONFIG_NET_DSA) if (unlikely(skb->dev && netdev_uses_dsa(skb->dev) && proto == htons(ETH_P_XDSA))) { const struct dsa_device_ops *ops; int offset = 0; ops = skb->dev->dsa_ptr->tag_ops; if (ops->flow_dissect && !ops->flow_dissect(skb, &proto, &offset)) { hlen -= offset; nhoff += offset; } } #endif Given spectra and meltdown etc, jumping through a pointer is expensive and we try to avoid it on the hot path. Given most of the taggers are going to use the generic version, maybe add a test here, is ops->flow_dissect the generic version, and if so, call it directly, rather than go through the pointer. Or only set ops->flow_dissect if the generic version cannot be used. Andrew