> > -static inline bool netif_elide_gro(const struct net_device *dev) > > +static inline bool netif_elide_gro(const struct sk_buff *skb) > > { > > - if (!(dev->features & NETIF_F_GRO) || dev->xdp_prog) > > + if (!(skb->dev->features & NETIF_F_GRO) || skb->dev->xdp_prog) > > return true; > > + > > +#ifdef CONFIG_SKB_GRO_CONTROL > > + return skb->gro_disabled; > > +#else > > return false; > > +#endif > > Yet more branches in the hot path. > > Compile time configurability does not help, as that will be > enabled by distros. > > For a fairly niche use case. Where functionality of GRO already > works. So just a performance for a very rare case at the cost of a > regression in the common case. A small regression perhaps, but death > by a thousand cuts. > I share your concern on operating on this hotpath. Will a static_branch + sysctl make it less aggressive? Speaking of performance, I'd hope this can give us more control so we can achieve the best of two worlds: for TCP and some UDP traffic, we can enable GRO, while for some other classes that we know GRO does no good or even harm, let's disable GRO to save more cycles. The key observation is that developers may already know which traffic is blessed by GRO, but lack a way to realize it. best Yan