aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched/cls_fw.c
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 /net/sched/cls_fw.c
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 'net/sched/cls_fw.c')
-rw-r--r--net/sched/cls_fw.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/net/sched/cls_fw.c b/net/sched/cls_fw.c
index d605285af5bf..ca662aaa5eb4 100644
--- a/net/sched/cls_fw.c
+++ b/net/sched/cls_fw.c
@@ -41,7 +41,7 @@ struct fw_filter {
41 u32 id; 41 u32 id;
42 struct tcf_result res; 42 struct tcf_result res;
43#ifdef CONFIG_NET_CLS_IND 43#ifdef CONFIG_NET_CLS_IND
44 char indev[IFNAMSIZ]; 44 int ifindex;
45#endif /* CONFIG_NET_CLS_IND */ 45#endif /* CONFIG_NET_CLS_IND */
46 struct tcf_exts exts; 46 struct tcf_exts exts;
47}; 47};
@@ -86,7 +86,7 @@ static int fw_classify(struct sk_buff *skb, const struct tcf_proto *tp,
86 if (f->id == id) { 86 if (f->id == id) {
87 *res = f->res; 87 *res = f->res;
88#ifdef CONFIG_NET_CLS_IND 88#ifdef CONFIG_NET_CLS_IND
89 if (!tcf_match_indev(skb, f->indev)) 89 if (!tcf_match_indev(skb, f->ifindex))
90 continue; 90 continue;
91#endif /* CONFIG_NET_CLS_IND */ 91#endif /* CONFIG_NET_CLS_IND */
92 r = tcf_exts_exec(skb, &f->exts, res); 92 r = tcf_exts_exec(skb, &f->exts, res);
@@ -207,9 +207,11 @@ fw_change_attrs(struct net *net, struct tcf_proto *tp, struct fw_filter *f,
207 207
208#ifdef CONFIG_NET_CLS_IND 208#ifdef CONFIG_NET_CLS_IND
209 if (tb[TCA_FW_INDEV]) { 209 if (tb[TCA_FW_INDEV]) {
210 err = tcf_change_indev(tp, f->indev, tb[TCA_FW_INDEV]); 210 int ret;
211 if (err < 0) 211 ret = tcf_change_indev(net, tb[TCA_FW_INDEV]);
212 if (ret < 0)
212 goto errout; 213 goto errout;
214 f->ifindex = ret;
213 } 215 }
214#endif /* CONFIG_NET_CLS_IND */ 216#endif /* CONFIG_NET_CLS_IND */
215 217
@@ -348,9 +350,12 @@ static int fw_dump(struct net *net, struct tcf_proto *tp, unsigned long fh,
348 nla_put_u32(skb, TCA_FW_CLASSID, f->res.classid)) 350 nla_put_u32(skb, TCA_FW_CLASSID, f->res.classid))
349 goto nla_put_failure; 351 goto nla_put_failure;
350#ifdef CONFIG_NET_CLS_IND 352#ifdef CONFIG_NET_CLS_IND
351 if (strlen(f->indev) && 353 if (f->ifindex) {
352 nla_put_string(skb, TCA_FW_INDEV, f->indev)) 354 struct net_device *dev;
353 goto nla_put_failure; 355 dev = __dev_get_by_index(net, f->ifindex);
356 if (dev && nla_put_string(skb, TCA_FW_INDEV, dev->name))
357 goto nla_put_failure;
358 }
354#endif /* CONFIG_NET_CLS_IND */ 359#endif /* CONFIG_NET_CLS_IND */
355 if (head->mask != 0xFFFFFFFF && 360 if (head->mask != 0xFFFFFFFF &&
356 nla_put_u32(skb, TCA_FW_MASK, head->mask)) 361 nla_put_u32(skb, TCA_FW_MASK, head->mask))