Commit 85b91b03 authored by David S. Miller's avatar David S. Miller

ipv4: Don't store a rule pointer in fib_result.

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: default avatarDavid S. Miller <davem@davemloft.net>
parent d01cb207
...@@ -106,12 +106,10 @@ struct fib_result { ...@@ -106,12 +106,10 @@ struct fib_result {
unsigned char nh_sel; unsigned char nh_sel;
unsigned char type; unsigned char type;
unsigned char scope; unsigned char scope;
u32 tclassid;
struct fib_info *fi; struct fib_info *fi;
struct fib_table *table; struct fib_table *table;
struct list_head *fa_head; struct list_head *fa_head;
#ifdef CONFIG_IP_MULTIPLE_TABLES
struct fib_rule *r;
#endif
}; };
struct fib_result_nl { struct fib_result_nl {
...@@ -215,10 +213,6 @@ static inline int fib_lookup(struct net *net, const struct flowi4 *flp, ...@@ -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 int __net_init fib4_rules_init(struct net *net);
extern void __net_exit fib4_rules_exit(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_new_table(struct net *net, u32 id);
extern struct fib_table *fib_get_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, ...@@ -229,7 +223,7 @@ static inline int fib_lookup(struct net *net, struct flowi4 *flp,
struct fib_result *res) struct fib_result *res)
{ {
if (!net->ipv4.fib_has_custom_rules) { if (!net->ipv4.fib_has_custom_rules) {
res->r = NULL; res->tclassid = 0;
if (net->ipv4.fib_local && if (net->ipv4.fib_local &&
!fib_table_lookup(net->ipv4.fib_local, flp, res, !fib_table_lookup(net->ipv4.fib_local, flp, res,
FIB_LOOKUP_NOREF)) FIB_LOOKUP_NOREF))
...@@ -289,7 +283,7 @@ static inline void fib_combine_itag(u32 *itag, const struct fib_result *res) ...@@ -289,7 +283,7 @@ static inline void fib_combine_itag(u32 *itag, const struct fib_result *res)
#endif #endif
*itag = FIB_RES_NH(*res).nh_tclassid<<16; *itag = FIB_RES_NH(*res).nh_tclassid<<16;
#ifdef CONFIG_IP_MULTIPLE_TABLES #ifdef CONFIG_IP_MULTIPLE_TABLES
rtag = fib_rules_tclass(res); rtag = res->tclassid;
if (*itag == 0) if (*itag == 0)
*itag = (rtag<<16); *itag = (rtag<<16);
*itag |= (rtag>>16); *itag |= (rtag>>16);
......
...@@ -169,10 +169,6 @@ static inline unsigned int __inet_dev_addr_type(struct net *net, ...@@ -169,10 +169,6 @@ static inline unsigned int __inet_dev_addr_type(struct net *net,
if (ipv4_is_multicast(addr)) if (ipv4_is_multicast(addr))
return RTN_MULTICAST; return RTN_MULTICAST;
#ifdef CONFIG_IP_MULTIPLE_TABLES
res.r = NULL;
#endif
local_table = fib_get_table(net, RT_TABLE_LOCAL); local_table = fib_get_table(net, RT_TABLE_LOCAL);
if (local_table) { if (local_table) {
ret = RTN_UNICAST; ret = RTN_UNICAST;
...@@ -934,10 +930,6 @@ static void nl_fib_lookup(struct fib_result_nl *frn, struct fib_table *tb) ...@@ -934,10 +930,6 @@ static void nl_fib_lookup(struct fib_result_nl *frn, struct fib_table *tb)
.flowi4_scope = frn->fl_scope, .flowi4_scope = frn->fl_scope,
}; };
#ifdef CONFIG_IP_MULTIPLE_TABLES
res.r = NULL;
#endif
frn->err = -ENOENT; frn->err = -ENOENT;
if (tb) { if (tb) {
local_bh_disable(); local_bh_disable();
......
...@@ -47,13 +47,6 @@ struct fib4_rule { ...@@ -47,13 +47,6 @@ struct fib4_rule {
#endif #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) int __fib_lookup(struct net *net, struct flowi4 *flp, struct fib_result *res)
{ {
struct fib_lookup_arg arg = { struct fib_lookup_arg arg = {
...@@ -63,8 +56,12 @@ int __fib_lookup(struct net *net, struct flowi4 *flp, struct fib_result *res) ...@@ -63,8 +56,12 @@ int __fib_lookup(struct net *net, struct flowi4 *flp, struct fib_result *res)
int err; int err;
err = fib_rules_lookup(net->ipv4.rules_ops, flowi4_to_flowi(flp), 0, &arg); 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; return err;
} }
EXPORT_SYMBOL_GPL(__fib_lookup); EXPORT_SYMBOL_GPL(__fib_lookup);
......
...@@ -1735,7 +1735,7 @@ static void rt_set_nexthop(struct rtable *rt, const struct flowi4 *fl4, ...@@ -1735,7 +1735,7 @@ static void rt_set_nexthop(struct rtable *rt, const struct flowi4 *fl4,
#ifdef CONFIG_IP_ROUTE_CLASSID #ifdef CONFIG_IP_ROUTE_CLASSID
#ifdef CONFIG_IP_MULTIPLE_TABLES #ifdef CONFIG_IP_MULTIPLE_TABLES
set_class_tag(rt, fib_rules_tclass(res)); set_class_tag(rt, res->tclassid);
#endif #endif
set_class_tag(rt, itag); set_class_tag(rt, itag);
#endif #endif
...@@ -2353,11 +2353,9 @@ static struct rtable *ip_route_output_slow(struct net *net, struct flowi4 *fl4) ...@@ -2353,11 +2353,9 @@ static struct rtable *ip_route_output_slow(struct net *net, struct flowi4 *fl4)
__be32 orig_saddr; __be32 orig_saddr;
int orig_oif; int orig_oif;
res.tclassid = 0;
res.fi = NULL; res.fi = NULL;
res.table = NULL; res.table = NULL;
#ifdef CONFIG_IP_MULTIPLE_TABLES
res.r = NULL;
#endif
orig_daddr = fl4->daddr; orig_daddr = fl4->daddr;
orig_saddr = fl4->saddr; orig_saddr = fl4->saddr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment