aboutsummaryrefslogtreecommitdiffstats
path: root/include/net
diff options
context:
space:
mode:
authorWANG Cong <xiyou.wangcong@gmail.com>2014-01-09 19:14:02 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-13 14:50:15 -0500
commit2519a602c273c5254781bc55b6e678a17e469a12 (patch)
treefcfbf3b98b6e186ea042d8167ddbde5b4fff63f2 /include/net
parent832d1d5bfaefafa5aa40282f6765c6d996fe384e (diff)
net_sched: optimize tcf_match_indev()
tcf_match_indev() is called in fast path, it is not wise to search for a netdev by ifindex and then compare by its name, just compare the ifindex. Also, dev->name could be changed by user-space, therefore the match would be always fail, but dev->ifindex could be consistent. BTW, this will also save some bytes from the core struct of u32. Cc: Jamal Hadi Salim <jhs@mojatatu.com> Cc: David S. Miller <davem@davemloft.net> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com> Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net')
-rw-r--r--include/net/pkt_cls.h30
1 files changed, 15 insertions, 15 deletions
diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h
index 50ea07969c09..a2441fb1428f 100644
--- a/include/net/pkt_cls.h
+++ b/include/net/pkt_cls.h
@@ -338,27 +338,27 @@ static inline int tcf_valid_offset(const struct sk_buff *skb,
338#include <net/net_namespace.h> 338#include <net/net_namespace.h>
339 339
340static inline int 340static inline int
341tcf_change_indev(struct tcf_proto *tp, char *indev, struct nlattr *indev_tlv) 341tcf_change_indev(struct net *net, struct nlattr *indev_tlv)
342{ 342{
343 char indev[IFNAMSIZ];
344 struct net_device *dev;
345
343 if (nla_strlcpy(indev, indev_tlv, IFNAMSIZ) >= IFNAMSIZ) 346 if (nla_strlcpy(indev, indev_tlv, IFNAMSIZ) >= IFNAMSIZ)
344 return -EINVAL; 347 return -EINVAL;
345 return 0; 348 dev = __dev_get_by_name(net, indev);
349 if (!dev)
350 return -ENODEV;
351 return dev->ifindex;
346} 352}
347 353
348static inline int 354static inline bool
349tcf_match_indev(struct sk_buff *skb, char *indev) 355tcf_match_indev(struct sk_buff *skb, int ifindex)
350{ 356{
351 struct net_device *dev; 357 if (!ifindex)
352 358 return true;
353 if (indev[0]) { 359 if (!skb->skb_iif)
354 if (!skb->skb_iif) 360 return false;
355 return 0; 361 return ifindex == skb->skb_iif;
356 dev = __dev_get_by_index(dev_net(skb->dev), skb->skb_iif);
357 if (!dev || strcmp(indev, dev->name))
358 return 0;
359 }
360
361 return 1;
362} 362}
363#endif /* CONFIG_NET_CLS_IND */ 363#endif /* CONFIG_NET_CLS_IND */
364 364