On Fri, 20 Nov 2020 07:38:36 +0800 [email protected] wrote:
> +int tcf_dev_queue_xmit(struct sk_buff *skb, int (*xmit)(struct sk_buff *skb))
> +{
> + xmit_hook_func *xmit_hook;
> +
> + xmit_hook = rcu_dereference(tcf_xmit_hook);
> + if (xmit_hook)
> + return xmit_hook(skb, xmit);
> + else
> + return xmit(skb);
> +}
> +EXPORT_SYMBOL_GPL(tcf_dev_queue_xmit);
I'm concerned about the performance impact of these indirect calls.
Did you check what code compiler will generate? What the impact with
retpolines enabled is going to be?
Now that sch_frag is no longer a module this could be simplified.
First of all - xmit_hook can only be sch_frag_xmit_hook, so please use
that directly.
if (READ_ONCE(tcf_xmit_hook_count))
sch_frag_xmit_hook(...
else
dev_queue_xmit(...
The abstraction is costly and not necessary right now IMO.
Then probably the counter should be:
u32 __read_mostly tcf_xmit_hook_count;
To avoid byte loads and having it be places in an unlucky cache line.
You could also make the helper a static inline in a header.
Unless I'm not giving the compiler enough credit and the performance
impact of this patch with retpolines on is indiscernible, but that'd
need to be proven by testing...