git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
tcp: enforce tcp_min_snd_mss in tcp_mtu_probing()
[pandora-kernel.git]
/
net
/
ipv4
/
fib_trie.c
diff --git
a/net/ipv4/fib_trie.c
b/net/ipv4/fib_trie.c
index
89d6f71
..
c7c6724
100644
(file)
--- a/
net/ipv4/fib_trie.c
+++ b/
net/ipv4/fib_trie.c
@@
-72,7
+72,7
@@
#include <linux/init.h>
#include <linux/list.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/list.h>
#include <linux/slab.h>
-#include <linux/
prefetch
.h>
+#include <linux/
export
.h>
#include <net/net_namespace.h>
#include <net/ip.h>
#include <net/protocol.h>
#include <net/net_namespace.h>
#include <net/ip.h>
#include <net/protocol.h>
@@
-204,7
+204,7
@@
static inline struct tnode *node_parent_rcu(const struct rt_trie_node *node)
return (struct tnode *)(parent & ~NODE_TYPE_MASK);
}
return (struct tnode *)(parent & ~NODE_TYPE_MASK);
}
-/* Same as
RCU_INIT_POINTER
+/* Same as
rcu_assign_pointer
* but that macro() assumes that value is a pointer.
*/
static inline void node_set_parent(struct rt_trie_node *node, struct tnode *ptr)
* but that macro() assumes that value is a pointer.
*/
static inline void node_set_parent(struct rt_trie_node *node, struct tnode *ptr)
@@
-528,7
+528,7
@@
static void tnode_put_child_reorg(struct tnode *tn, int i, struct rt_trie_node *
if (n)
node_set_parent(n, tn);
if (n)
node_set_parent(n, tn);
-
RCU_INIT_POINTER
(tn->child[i], n);
+
rcu_assign_pointer
(tn->child[i], n);
}
#define MAX_WORK 10
}
#define MAX_WORK 10
@@
-1014,7
+1014,7
@@
static void trie_rebalance(struct trie *t, struct tnode *tn)
tp = node_parent((struct rt_trie_node *) tn);
if (!tp)
tp = node_parent((struct rt_trie_node *) tn);
if (!tp)
-
RCU_INIT_POINTER
(t->trie, (struct rt_trie_node *)tn);
+
rcu_assign_pointer
(t->trie, (struct rt_trie_node *)tn);
tnode_free_flush();
if (!tp)
tnode_free_flush();
if (!tp)
@@
-1026,7
+1026,7
@@
static void trie_rebalance(struct trie *t, struct tnode *tn)
if (IS_TNODE(tn))
tn = (struct tnode *)resize(t, (struct tnode *)tn);
if (IS_TNODE(tn))
tn = (struct tnode *)resize(t, (struct tnode *)tn);
-
RCU_INIT_POINTER
(t->trie, (struct rt_trie_node *)tn);
+
rcu_assign_pointer
(t->trie, (struct rt_trie_node *)tn);
tnode_free_flush();
}
tnode_free_flush();
}
@@
-1163,7
+1163,7
@@
static struct list_head *fib_insert_node(struct trie *t, u32 key, int plen)
put_child(t, (struct tnode *)tp, cindex,
(struct rt_trie_node *)tn);
} else {
put_child(t, (struct tnode *)tp, cindex,
(struct rt_trie_node *)tn);
} else {
-
RCU_INIT_POINTER
(t->trie, (struct rt_trie_node *)tn);
+
rcu_assign_pointer
(t->trie, (struct rt_trie_node *)tn);
tp = tn;
}
}
tp = tn;
}
}
@@
-1371,6
+1371,8
@@
static int check_leaf(struct fib_table *tb, struct trie *t, struct leaf *l,
if (fa->fa_tos && fa->fa_tos != flp->flowi4_tos)
continue;
if (fa->fa_tos && fa->fa_tos != flp->flowi4_tos)
continue;
+ if (fi->fib_dead)
+ continue;
if (fa->fa_info->fib_scope < flp->flowi4_scope)
continue;
fib_alias_accessed(fa);
if (fa->fa_info->fib_scope < flp->flowi4_scope)
continue;
fib_alias_accessed(fa);
@@
-1770,10
+1772,8
@@
static struct leaf *leaf_walk_rcu(struct tnode *p, struct rt_trie_node *c)
if (!c)
continue;
if (!c)
continue;
- if (IS_LEAF(c)) {
- prefetch(rcu_dereference_rtnl(p->child[idx]));
+ if (IS_LEAF(c))
return (struct leaf *) c;
return (struct leaf *) c;
- }
/* Rescan start scanning in new node */
p = (struct tnode *) c;
/* Rescan start scanning in new node */
p = (struct tnode *) c;