Thu, Oct 12, 2017 at 11:45:43PM CEST, dan...@iogearbox.net wrote: >On 10/12/2017 07:17 PM, Jiri Pirko wrote: >> From: Jiri Pirko <j...@mellanox.com> >> >> In sch_handle_egress and sch_handle_ingress, don't use tp->q and use >> dev->ingress_queue which stores the same pointer instead. >> >> Signed-off-by: Jiri Pirko <j...@mellanox.com> >> --- >> net/core/dev.c | 21 +++++++++++++++------ >> 1 file changed, 15 insertions(+), 6 deletions(-) >> >> diff --git a/net/core/dev.c b/net/core/dev.c >> index fcddccb..cb9e5e5 100644 >> --- a/net/core/dev.c >> +++ b/net/core/dev.c >> @@ -3273,14 +3273,18 @@ EXPORT_SYMBOL(dev_loopback_xmit); >> static struct sk_buff * >> sch_handle_egress(struct sk_buff *skb, int *ret, struct net_device *dev) >> { >> + struct netdev_queue *netdev_queue = >> + rcu_dereference_bh(dev->ingress_queue); >> struct tcf_proto *cl = rcu_dereference_bh(dev->egress_cl_list); >> struct tcf_result cl_res; >> + struct Qdisc *q; >> >> - if (!cl) >> + if (!cl || !netdev_queue) >> return skb; >> + q = netdev_queue->qdisc; > >NAK, no additional overhead in the software fast-path of >sch_handle_{ingress,egress}() like this. There are users out there >that use tc in software only, so performance is critical here.
Okay, how else do you suggest I can avoid the need to use tp->q? I was thinking about storing q directly to net_device, which would safe one dereference, resulting in the same amount as current cl->q. Thanks.