ipv4: Don't store a rule pointer in fib_result.
authorDavid S. Miller <davem@davemloft.net>
Fri, 13 Jul 2012 15:21:29 +0000 (08:21 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 13 Jul 2012 15:21:29 +0000 (08:21 -0700)
We only use it to fetch the rule's tclassid, so just store the
tclassid there instead.

This also decreases the size of fib_result by a full 8 bytes on
64-bit.  On 32-bits it's a wash.

Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip_fib.h
net/ipv4/fib_frontend.c
net/ipv4/fib_rules.c
net/ipv4/route.c

index e91fedd22db2a9e06d477452b906e84f38b3b28d..5697acefeba38e5351c7c962d6816e639d59cd49 100644 (file)
@@ -106,12 +106,10 @@ struct fib_result {
        unsigned char   nh_sel;
        unsigned char   type;
        unsigned char   scope;
+       u32             tclassid;
        struct fib_info *fi;
        struct fib_table *table;
        struct list_head *fa_head;
-#ifdef CONFIG_IP_MULTIPLE_TABLES
-       struct fib_rule *r;
-#endif
 };
 
 struct fib_result_nl {
@@ -215,10 +213,6 @@ static inline int fib_lookup(struct net *net, const struct flowi4 *flp,
 extern int __net_init fib4_rules_init(struct net *net);
 extern void __net_exit fib4_rules_exit(struct net *net);
 
-#ifdef CONFIG_IP_ROUTE_CLASSID
-extern u32 fib_rules_tclass(const struct fib_result *res);
-#endif
-
 extern struct fib_table *fib_new_table(struct net *net, u32 id);
 extern struct fib_table *fib_get_table(struct net *net, u32 id);
 
@@ -229,7 +223,7 @@ static inline int fib_lookup(struct net *net, struct flowi4 *flp,
                             struct fib_result *res)
 {
        if (!net->ipv4.fib_has_custom_rules) {
-               res->r = NULL;
+               res->tclassid = 0;
                if (net->ipv4.fib_local &&
                    !fib_table_lookup(net->ipv4.fib_local, flp, res,
                                      FIB_LOOKUP_NOREF))
@@ -289,7 +283,7 @@ static inline void fib_combine_itag(u32 *itag, const struct fib_result *res)
 #endif
        *itag = FIB_RES_NH(*res).nh_tclassid<<16;
 #ifdef CONFIG_IP_MULTIPLE_TABLES
-       rtag = fib_rules_tclass(res);
+       rtag = res->tclassid;
        if (*itag == 0)
                *itag = (rtag<<16);
        *itag |= (rtag>>16);
index 81f85716a894a8c42a506641271b3f77af45f104..7a31194ec63344f6c0abec0fec41d807dc34fdfb 100644 (file)
@@ -169,10 +169,6 @@ static inline unsigned int __inet_dev_addr_type(struct net *net,
        if (ipv4_is_multicast(addr))
                return RTN_MULTICAST;
 
-#ifdef CONFIG_IP_MULTIPLE_TABLES
-       res.r = NULL;
-#endif
-
        local_table = fib_get_table(net, RT_TABLE_LOCAL);
        if (local_table) {
                ret = RTN_UNICAST;
@@ -934,10 +930,6 @@ static void nl_fib_lookup(struct fib_result_nl *frn, struct fib_table *tb)
                .flowi4_scope = frn->fl_scope,
        };
 
-#ifdef CONFIG_IP_MULTIPLE_TABLES
-       res.r = NULL;
-#endif
-
        frn->err = -ENOENT;
        if (tb) {
                local_bh_disable();
index c06da93b0b7022a44303e204431f52b6abec55d7..a83d74e498d23af8c104bc3d68eca5ca4a8ac228 100644 (file)
@@ -47,13 +47,6 @@ struct fib4_rule {
 #endif
 };
 
-#ifdef CONFIG_IP_ROUTE_CLASSID
-u32 fib_rules_tclass(const struct fib_result *res)
-{
-       return res->r ? ((struct fib4_rule *) res->r)->tclassid : 0;
-}
-#endif
-
 int __fib_lookup(struct net *net, struct flowi4 *flp, struct fib_result *res)
 {
        struct fib_lookup_arg arg = {
@@ -63,8 +56,12 @@ int __fib_lookup(struct net *net, struct flowi4 *flp, struct fib_result *res)
        int err;
 
        err = fib_rules_lookup(net->ipv4.rules_ops, flowi4_to_flowi(flp), 0, &arg);
-       res->r = arg.rule;
-
+#ifdef CONFIG_IP_ROUTE_CLASSID
+       if (arg.rule)
+               res->tclassid = ((struct fib4_rule *)arg.rule)->tclassid;
+       else
+               res->tclassid = 0;
+#endif
        return err;
 }
 EXPORT_SYMBOL_GPL(__fib_lookup);
index 9319bf1f8354b622f61a7cfcfcbdf5f754ff783c..aad21819316df6a1e90e8953854d965abf03fe46 100644 (file)
@@ -1735,7 +1735,7 @@ static void rt_set_nexthop(struct rtable *rt, const struct flowi4 *fl4,
 
 #ifdef CONFIG_IP_ROUTE_CLASSID
 #ifdef CONFIG_IP_MULTIPLE_TABLES
-       set_class_tag(rt, fib_rules_tclass(res));
+       set_class_tag(rt, res->tclassid);
 #endif
        set_class_tag(rt, itag);
 #endif
@@ -2353,11 +2353,9 @@ static struct rtable *ip_route_output_slow(struct net *net, struct flowi4 *fl4)
        __be32 orig_saddr;
        int orig_oif;
 
+       res.tclassid    = 0;
        res.fi          = NULL;
        res.table       = NULL;
-#ifdef CONFIG_IP_MULTIPLE_TABLES
-       res.r           = NULL;
-#endif
 
        orig_daddr = fl4->daddr;
        orig_saddr = fl4->saddr;