在 2020/11/25 3:24, Jakub Kicinski 写道: > On Fri, 20 Nov 2020 07:38:36 +0800 we...@ucloud.cn 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. Maybe a static key replace tcf_xmit_hook_count is more simplified?
DEFINE_STATIC_KEY_FALSE(tcf_xmit_hook_in_use);