mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 13:44:15 +08:00
ipv4: Fix fib_trie build in some configurations.
If we end up including include/linux/node.h (either explicitly or implicitly) that header has a definition of "structt node" too. So rename the one we use in fib_trie to "rt_trie_node" to avoid the conflict. Reported-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
442b9635c5
commit
b299e4f001
@ -95,7 +95,7 @@ typedef unsigned int t_key;
|
||||
#define IS_TNODE(n) (!(n->parent & T_LEAF))
|
||||
#define IS_LEAF(n) (n->parent & T_LEAF)
|
||||
|
||||
struct node {
|
||||
struct rt_trie_node {
|
||||
unsigned long parent;
|
||||
t_key key;
|
||||
};
|
||||
@ -126,7 +126,7 @@ struct tnode {
|
||||
struct work_struct work;
|
||||
struct tnode *tnode_free;
|
||||
};
|
||||
struct node *child[0];
|
||||
struct rt_trie_node *child[0];
|
||||
};
|
||||
|
||||
#ifdef CONFIG_IP_FIB_TRIE_STATS
|
||||
@ -151,16 +151,16 @@ struct trie_stat {
|
||||
};
|
||||
|
||||
struct trie {
|
||||
struct node *trie;
|
||||
struct rt_trie_node *trie;
|
||||
#ifdef CONFIG_IP_FIB_TRIE_STATS
|
||||
struct trie_use_stats stats;
|
||||
#endif
|
||||
};
|
||||
|
||||
static void put_child(struct trie *t, struct tnode *tn, int i, struct node *n);
|
||||
static void tnode_put_child_reorg(struct tnode *tn, int i, struct node *n,
|
||||
static void put_child(struct trie *t, struct tnode *tn, int i, struct rt_trie_node *n);
|
||||
static void tnode_put_child_reorg(struct tnode *tn, int i, struct rt_trie_node *n,
|
||||
int wasfull);
|
||||
static struct node *resize(struct trie *t, struct tnode *tn);
|
||||
static struct rt_trie_node *resize(struct trie *t, struct tnode *tn);
|
||||
static struct tnode *inflate(struct trie *t, struct tnode *tn);
|
||||
static struct tnode *halve(struct trie *t, struct tnode *tn);
|
||||
/* tnodes to free after resize(); protected by RTNL */
|
||||
@ -177,12 +177,12 @@ static const int sync_pages = 128;
|
||||
static struct kmem_cache *fn_alias_kmem __read_mostly;
|
||||
static struct kmem_cache *trie_leaf_kmem __read_mostly;
|
||||
|
||||
static inline struct tnode *node_parent(struct node *node)
|
||||
static inline struct tnode *node_parent(struct rt_trie_node *node)
|
||||
{
|
||||
return (struct tnode *)(node->parent & ~NODE_TYPE_MASK);
|
||||
}
|
||||
|
||||
static inline struct tnode *node_parent_rcu(struct node *node)
|
||||
static inline struct tnode *node_parent_rcu(struct rt_trie_node *node)
|
||||
{
|
||||
struct tnode *ret = node_parent(node);
|
||||
|
||||
@ -192,22 +192,22 @@ static inline struct tnode *node_parent_rcu(struct node *node)
|
||||
/* Same as rcu_assign_pointer
|
||||
* but that macro() assumes that value is a pointer.
|
||||
*/
|
||||
static inline void node_set_parent(struct node *node, struct tnode *ptr)
|
||||
static inline void node_set_parent(struct rt_trie_node *node, struct tnode *ptr)
|
||||
{
|
||||
smp_wmb();
|
||||
node->parent = (unsigned long)ptr | NODE_TYPE(node);
|
||||
}
|
||||
|
||||
static inline struct node *tnode_get_child(struct tnode *tn, unsigned int i)
|
||||
static inline struct rt_trie_node *tnode_get_child(struct tnode *tn, unsigned int i)
|
||||
{
|
||||
BUG_ON(i >= 1U << tn->bits);
|
||||
|
||||
return tn->child[i];
|
||||
}
|
||||
|
||||
static inline struct node *tnode_get_child_rcu(struct tnode *tn, unsigned int i)
|
||||
static inline struct rt_trie_node *tnode_get_child_rcu(struct tnode *tn, unsigned int i)
|
||||
{
|
||||
struct node *ret = tnode_get_child(tn, i);
|
||||
struct rt_trie_node *ret = tnode_get_child(tn, i);
|
||||
|
||||
return rcu_dereference_rtnl(ret);
|
||||
}
|
||||
@ -378,7 +378,7 @@ static void __tnode_free_rcu(struct rcu_head *head)
|
||||
{
|
||||
struct tnode *tn = container_of(head, struct tnode, rcu);
|
||||
size_t size = sizeof(struct tnode) +
|
||||
(sizeof(struct node *) << tn->bits);
|
||||
(sizeof(struct rt_trie_node *) << tn->bits);
|
||||
|
||||
if (size <= PAGE_SIZE)
|
||||
kfree(tn);
|
||||
@ -402,7 +402,7 @@ static void tnode_free_safe(struct tnode *tn)
|
||||
tn->tnode_free = tnode_free_head;
|
||||
tnode_free_head = tn;
|
||||
tnode_free_size += sizeof(struct tnode) +
|
||||
(sizeof(struct node *) << tn->bits);
|
||||
(sizeof(struct rt_trie_node *) << tn->bits);
|
||||
}
|
||||
|
||||
static void tnode_free_flush(void)
|
||||
@ -443,7 +443,7 @@ static struct leaf_info *leaf_info_new(int plen)
|
||||
|
||||
static struct tnode *tnode_new(t_key key, int pos, int bits)
|
||||
{
|
||||
size_t sz = sizeof(struct tnode) + (sizeof(struct node *) << bits);
|
||||
size_t sz = sizeof(struct tnode) + (sizeof(struct rt_trie_node *) << bits);
|
||||
struct tnode *tn = tnode_alloc(sz);
|
||||
|
||||
if (tn) {
|
||||
@ -456,7 +456,7 @@ static struct tnode *tnode_new(t_key key, int pos, int bits)
|
||||
}
|
||||
|
||||
pr_debug("AT %p s=%zu %zu\n", tn, sizeof(struct tnode),
|
||||
sizeof(struct node) << bits);
|
||||
sizeof(struct rt_trie_node) << bits);
|
||||
return tn;
|
||||
}
|
||||
|
||||
@ -465,7 +465,7 @@ static struct tnode *tnode_new(t_key key, int pos, int bits)
|
||||
* and no bits are skipped. See discussion in dyntree paper p. 6
|
||||
*/
|
||||
|
||||
static inline int tnode_full(const struct tnode *tn, const struct node *n)
|
||||
static inline int tnode_full(const struct tnode *tn, const struct rt_trie_node *n)
|
||||
{
|
||||
if (n == NULL || IS_LEAF(n))
|
||||
return 0;
|
||||
@ -474,7 +474,7 @@ static inline int tnode_full(const struct tnode *tn, const struct node *n)
|
||||
}
|
||||
|
||||
static inline void put_child(struct trie *t, struct tnode *tn, int i,
|
||||
struct node *n)
|
||||
struct rt_trie_node *n)
|
||||
{
|
||||
tnode_put_child_reorg(tn, i, n, -1);
|
||||
}
|
||||
@ -484,10 +484,10 @@ static inline void put_child(struct trie *t, struct tnode *tn, int i,
|
||||
* Update the value of full_children and empty_children.
|
||||
*/
|
||||
|
||||
static void tnode_put_child_reorg(struct tnode *tn, int i, struct node *n,
|
||||
static void tnode_put_child_reorg(struct tnode *tn, int i, struct rt_trie_node *n,
|
||||
int wasfull)
|
||||
{
|
||||
struct node *chi = tn->child[i];
|
||||
struct rt_trie_node *chi = tn->child[i];
|
||||
int isfull;
|
||||
|
||||
BUG_ON(i >= 1<<tn->bits);
|
||||
@ -515,7 +515,7 @@ static void tnode_put_child_reorg(struct tnode *tn, int i, struct node *n,
|
||||
}
|
||||
|
||||
#define MAX_WORK 10
|
||||
static struct node *resize(struct trie *t, struct tnode *tn)
|
||||
static struct rt_trie_node *resize(struct trie *t, struct tnode *tn)
|
||||
{
|
||||
int i;
|
||||
struct tnode *old_tn;
|
||||
@ -605,7 +605,7 @@ static struct node *resize(struct trie *t, struct tnode *tn)
|
||||
|
||||
/* Keep root node larger */
|
||||
|
||||
if (!node_parent((struct node *)tn)) {
|
||||
if (!node_parent((struct rt_trie_node *)tn)) {
|
||||
inflate_threshold_use = inflate_threshold_root;
|
||||
halve_threshold_use = halve_threshold_root;
|
||||
} else {
|
||||
@ -635,7 +635,7 @@ static struct node *resize(struct trie *t, struct tnode *tn)
|
||||
|
||||
/* Return if at least one inflate is run */
|
||||
if (max_work != MAX_WORK)
|
||||
return (struct node *) tn;
|
||||
return (struct rt_trie_node *) tn;
|
||||
|
||||
/*
|
||||
* Halve as long as the number of empty children in this
|
||||
@ -663,7 +663,7 @@ static struct node *resize(struct trie *t, struct tnode *tn)
|
||||
if (tn->empty_children == tnode_child_length(tn) - 1) {
|
||||
one_child:
|
||||
for (i = 0; i < tnode_child_length(tn); i++) {
|
||||
struct node *n;
|
||||
struct rt_trie_node *n;
|
||||
|
||||
n = tn->child[i];
|
||||
if (!n)
|
||||
@ -676,7 +676,7 @@ one_child:
|
||||
return n;
|
||||
}
|
||||
}
|
||||
return (struct node *) tn;
|
||||
return (struct rt_trie_node *) tn;
|
||||
}
|
||||
|
||||
static struct tnode *inflate(struct trie *t, struct tnode *tn)
|
||||
@ -723,14 +723,14 @@ static struct tnode *inflate(struct trie *t, struct tnode *tn)
|
||||
goto nomem;
|
||||
}
|
||||
|
||||
put_child(t, tn, 2*i, (struct node *) left);
|
||||
put_child(t, tn, 2*i+1, (struct node *) right);
|
||||
put_child(t, tn, 2*i, (struct rt_trie_node *) left);
|
||||
put_child(t, tn, 2*i+1, (struct rt_trie_node *) right);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < olen; i++) {
|
||||
struct tnode *inode;
|
||||
struct node *node = tnode_get_child(oldtnode, i);
|
||||
struct rt_trie_node *node = tnode_get_child(oldtnode, i);
|
||||
struct tnode *left, *right;
|
||||
int size, j;
|
||||
|
||||
@ -825,7 +825,7 @@ nomem:
|
||||
static struct tnode *halve(struct trie *t, struct tnode *tn)
|
||||
{
|
||||
struct tnode *oldtnode = tn;
|
||||
struct node *left, *right;
|
||||
struct rt_trie_node *left, *right;
|
||||
int i;
|
||||
int olen = tnode_child_length(tn);
|
||||
|
||||
@ -856,7 +856,7 @@ static struct tnode *halve(struct trie *t, struct tnode *tn)
|
||||
if (!newn)
|
||||
goto nomem;
|
||||
|
||||
put_child(t, tn, i/2, (struct node *)newn);
|
||||
put_child(t, tn, i/2, (struct rt_trie_node *)newn);
|
||||
}
|
||||
|
||||
}
|
||||
@ -958,7 +958,7 @@ fib_find_node(struct trie *t, u32 key)
|
||||
{
|
||||
int pos;
|
||||
struct tnode *tn;
|
||||
struct node *n;
|
||||
struct rt_trie_node *n;
|
||||
|
||||
pos = 0;
|
||||
n = rcu_dereference_rtnl(t->trie);
|
||||
@ -993,17 +993,17 @@ static void trie_rebalance(struct trie *t, struct tnode *tn)
|
||||
|
||||
key = tn->key;
|
||||
|
||||
while (tn != NULL && (tp = node_parent((struct node *)tn)) != NULL) {
|
||||
while (tn != NULL && (tp = node_parent((struct rt_trie_node *)tn)) != NULL) {
|
||||
cindex = tkey_extract_bits(key, tp->pos, tp->bits);
|
||||
wasfull = tnode_full(tp, tnode_get_child(tp, cindex));
|
||||
tn = (struct tnode *) resize(t, (struct tnode *)tn);
|
||||
|
||||
tnode_put_child_reorg((struct tnode *)tp, cindex,
|
||||
(struct node *)tn, wasfull);
|
||||
(struct rt_trie_node *)tn, wasfull);
|
||||
|
||||
tp = node_parent((struct node *) tn);
|
||||
tp = node_parent((struct rt_trie_node *) tn);
|
||||
if (!tp)
|
||||
rcu_assign_pointer(t->trie, (struct node *)tn);
|
||||
rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);
|
||||
|
||||
tnode_free_flush();
|
||||
if (!tp)
|
||||
@ -1015,7 +1015,7 @@ static void trie_rebalance(struct trie *t, struct tnode *tn)
|
||||
if (IS_TNODE(tn))
|
||||
tn = (struct tnode *)resize(t, (struct tnode *)tn);
|
||||
|
||||
rcu_assign_pointer(t->trie, (struct node *)tn);
|
||||
rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);
|
||||
tnode_free_flush();
|
||||
}
|
||||
|
||||
@ -1025,7 +1025,7 @@ static struct list_head *fib_insert_node(struct trie *t, u32 key, int plen)
|
||||
{
|
||||
int pos, newpos;
|
||||
struct tnode *tp = NULL, *tn = NULL;
|
||||
struct node *n;
|
||||
struct rt_trie_node *n;
|
||||
struct leaf *l;
|
||||
int missbit;
|
||||
struct list_head *fa_head = NULL;
|
||||
@ -1111,10 +1111,10 @@ static struct list_head *fib_insert_node(struct trie *t, u32 key, int plen)
|
||||
if (t->trie && n == NULL) {
|
||||
/* Case 2: n is NULL, and will just insert a new leaf */
|
||||
|
||||
node_set_parent((struct node *)l, tp);
|
||||
node_set_parent((struct rt_trie_node *)l, tp);
|
||||
|
||||
cindex = tkey_extract_bits(key, tp->pos, tp->bits);
|
||||
put_child(t, (struct tnode *)tp, cindex, (struct node *)l);
|
||||
put_child(t, (struct tnode *)tp, cindex, (struct rt_trie_node *)l);
|
||||
} else {
|
||||
/* Case 3: n is a LEAF or a TNODE and the key doesn't match. */
|
||||
/*
|
||||
@ -1141,18 +1141,18 @@ static struct list_head *fib_insert_node(struct trie *t, u32 key, int plen)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
node_set_parent((struct node *)tn, tp);
|
||||
node_set_parent((struct rt_trie_node *)tn, tp);
|
||||
|
||||
missbit = tkey_extract_bits(key, newpos, 1);
|
||||
put_child(t, tn, missbit, (struct node *)l);
|
||||
put_child(t, tn, missbit, (struct rt_trie_node *)l);
|
||||
put_child(t, tn, 1-missbit, n);
|
||||
|
||||
if (tp) {
|
||||
cindex = tkey_extract_bits(key, tp->pos, tp->bits);
|
||||
put_child(t, (struct tnode *)tp, cindex,
|
||||
(struct node *)tn);
|
||||
(struct rt_trie_node *)tn);
|
||||
} else {
|
||||
rcu_assign_pointer(t->trie, (struct node *)tn);
|
||||
rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);
|
||||
tp = tn;
|
||||
}
|
||||
}
|
||||
@ -1376,7 +1376,7 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi *flp,
|
||||
{
|
||||
struct trie *t = (struct trie *) tb->tb_data;
|
||||
int ret;
|
||||
struct node *n;
|
||||
struct rt_trie_node *n;
|
||||
struct tnode *pn;
|
||||
int pos, bits;
|
||||
t_key key = ntohl(flp->fl4_dst);
|
||||
@ -1541,7 +1541,7 @@ backtrace:
|
||||
if (chopped_off <= pn->bits) {
|
||||
cindex &= ~(1 << (chopped_off-1));
|
||||
} else {
|
||||
struct tnode *parent = node_parent_rcu((struct node *) pn);
|
||||
struct tnode *parent = node_parent_rcu((struct rt_trie_node *) pn);
|
||||
if (!parent)
|
||||
goto failed;
|
||||
|
||||
@ -1568,7 +1568,7 @@ found:
|
||||
*/
|
||||
static void trie_leaf_remove(struct trie *t, struct leaf *l)
|
||||
{
|
||||
struct tnode *tp = node_parent((struct node *) l);
|
||||
struct tnode *tp = node_parent((struct rt_trie_node *) l);
|
||||
|
||||
pr_debug("entering trie_leaf_remove(%p)\n", l);
|
||||
|
||||
@ -1706,7 +1706,7 @@ static int trie_flush_leaf(struct leaf *l)
|
||||
* Scan for the next right leaf starting at node p->child[idx]
|
||||
* Since we have back pointer, no recursion necessary.
|
||||
*/
|
||||
static struct leaf *leaf_walk_rcu(struct tnode *p, struct node *c)
|
||||
static struct leaf *leaf_walk_rcu(struct tnode *p, struct rt_trie_node *c)
|
||||
{
|
||||
do {
|
||||
t_key idx;
|
||||
@ -1732,7 +1732,7 @@ static struct leaf *leaf_walk_rcu(struct tnode *p, struct node *c)
|
||||
}
|
||||
|
||||
/* Node empty, walk back up to parent */
|
||||
c = (struct node *) p;
|
||||
c = (struct rt_trie_node *) p;
|
||||
} while ((p = node_parent_rcu(c)) != NULL);
|
||||
|
||||
return NULL; /* Root of trie */
|
||||
@ -1753,7 +1753,7 @@ static struct leaf *trie_firstleaf(struct trie *t)
|
||||
|
||||
static struct leaf *trie_nextleaf(struct leaf *l)
|
||||
{
|
||||
struct node *c = (struct node *) l;
|
||||
struct rt_trie_node *c = (struct rt_trie_node *) l;
|
||||
struct tnode *p = node_parent_rcu(c);
|
||||
|
||||
if (!p)
|
||||
@ -1961,7 +1961,7 @@ struct fib_trie_iter {
|
||||
unsigned int depth;
|
||||
};
|
||||
|
||||
static struct node *fib_trie_get_next(struct fib_trie_iter *iter)
|
||||
static struct rt_trie_node *fib_trie_get_next(struct fib_trie_iter *iter)
|
||||
{
|
||||
struct tnode *tn = iter->tnode;
|
||||
unsigned int cindex = iter->index;
|
||||
@ -1975,7 +1975,7 @@ static struct node *fib_trie_get_next(struct fib_trie_iter *iter)
|
||||
iter->tnode, iter->index, iter->depth);
|
||||
rescan:
|
||||
while (cindex < (1<<tn->bits)) {
|
||||
struct node *n = tnode_get_child_rcu(tn, cindex);
|
||||
struct rt_trie_node *n = tnode_get_child_rcu(tn, cindex);
|
||||
|
||||
if (n) {
|
||||
if (IS_LEAF(n)) {
|
||||
@ -1994,7 +1994,7 @@ rescan:
|
||||
}
|
||||
|
||||
/* Current node exhausted, pop back up */
|
||||
p = node_parent_rcu((struct node *)tn);
|
||||
p = node_parent_rcu((struct rt_trie_node *)tn);
|
||||
if (p) {
|
||||
cindex = tkey_extract_bits(tn->key, p->pos, p->bits)+1;
|
||||
tn = p;
|
||||
@ -2006,10 +2006,10 @@ rescan:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct node *fib_trie_get_first(struct fib_trie_iter *iter,
|
||||
static struct rt_trie_node *fib_trie_get_first(struct fib_trie_iter *iter,
|
||||
struct trie *t)
|
||||
{
|
||||
struct node *n;
|
||||
struct rt_trie_node *n;
|
||||
|
||||
if (!t)
|
||||
return NULL;
|
||||
@ -2033,7 +2033,7 @@ static struct node *fib_trie_get_first(struct fib_trie_iter *iter,
|
||||
|
||||
static void trie_collect_stats(struct trie *t, struct trie_stat *s)
|
||||
{
|
||||
struct node *n;
|
||||
struct rt_trie_node *n;
|
||||
struct fib_trie_iter iter;
|
||||
|
||||
memset(s, 0, sizeof(*s));
|
||||
@ -2106,7 +2106,7 @@ static void trie_show_stats(struct seq_file *seq, struct trie_stat *stat)
|
||||
seq_putc(seq, '\n');
|
||||
seq_printf(seq, "\tPointers: %u\n", pointers);
|
||||
|
||||
bytes += sizeof(struct node *) * pointers;
|
||||
bytes += sizeof(struct rt_trie_node *) * pointers;
|
||||
seq_printf(seq, "Null ptrs: %u\n", stat->nullpointers);
|
||||
seq_printf(seq, "Total size: %u kB\n", (bytes + 1023) / 1024);
|
||||
}
|
||||
@ -2187,7 +2187,7 @@ static const struct file_operations fib_triestat_fops = {
|
||||
.release = single_release_net,
|
||||
};
|
||||
|
||||
static struct node *fib_trie_get_idx(struct seq_file *seq, loff_t pos)
|
||||
static struct rt_trie_node *fib_trie_get_idx(struct seq_file *seq, loff_t pos)
|
||||
{
|
||||
struct fib_trie_iter *iter = seq->private;
|
||||
struct net *net = seq_file_net(seq);
|
||||
@ -2200,7 +2200,7 @@ static struct node *fib_trie_get_idx(struct seq_file *seq, loff_t pos)
|
||||
struct fib_table *tb;
|
||||
|
||||
hlist_for_each_entry_rcu(tb, node, head, tb_hlist) {
|
||||
struct node *n;
|
||||
struct rt_trie_node *n;
|
||||
|
||||
for (n = fib_trie_get_first(iter,
|
||||
(struct trie *) tb->tb_data);
|
||||
@ -2229,7 +2229,7 @@ static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||
struct fib_table *tb = iter->tb;
|
||||
struct hlist_node *tb_node;
|
||||
unsigned int h;
|
||||
struct node *n;
|
||||
struct rt_trie_node *n;
|
||||
|
||||
++*pos;
|
||||
/* next node in same table */
|
||||
@ -2315,7 +2315,7 @@ static inline const char *rtn_type(char *buf, size_t len, unsigned int t)
|
||||
static int fib_trie_seq_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
const struct fib_trie_iter *iter = seq->private;
|
||||
struct node *n = v;
|
||||
struct rt_trie_node *n = v;
|
||||
|
||||
if (!node_parent_rcu(n))
|
||||
fib_table_print(seq, iter->tb);
|
||||
|
Loading…
Reference in New Issue
Block a user