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: David S. Miller <davem@davemloft.net>
This commit is contained in:
@ -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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
#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,
|
|||||||
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)
|
|||||||
.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 {
|
|||||||
#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)
|
|||||||
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,
|
|||||||
|
|
||||||
#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)
|
|||||||
__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;
|
||||||
|
Reference in New Issue
Block a user