forked from Minki/linux
[IPV4]: Prepare FIB core for RCU.
* RCU versions of hlist_***_rcu * fib_alias partial rcu port just whats needed now. Signed-off-by: Robert Olsson <Robert.Olsson@data.slu.se> Signed-off-by: Stephen Hemminger <shemminger@osdl.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3625796806
commit
e5b4376074
@ -634,6 +634,27 @@ static inline void hlist_add_after(struct hlist_node *n,
|
||||
next->next->pprev = &next->next;
|
||||
}
|
||||
|
||||
static inline void hlist_add_before_rcu(struct hlist_node *n,
|
||||
struct hlist_node *next)
|
||||
{
|
||||
n->pprev = next->pprev;
|
||||
n->next = next;
|
||||
smp_wmb();
|
||||
next->pprev = &n->next;
|
||||
*(n->pprev) = n;
|
||||
}
|
||||
|
||||
static inline void hlist_add_after_rcu(struct hlist_node *prev,
|
||||
struct hlist_node *n)
|
||||
{
|
||||
n->next = prev->next;
|
||||
n->pprev = &prev->next;
|
||||
smp_wmb();
|
||||
prev->next = n;
|
||||
if (n->next)
|
||||
n->next->pprev = &n->next;
|
||||
}
|
||||
|
||||
#define hlist_entry(ptr, type, member) container_of(ptr,type,member)
|
||||
|
||||
#define hlist_for_each(pos, head) \
|
||||
|
@ -7,6 +7,7 @@
|
||||
|
||||
struct fib_alias {
|
||||
struct list_head fa_list;
|
||||
struct rcu_head rcu;
|
||||
struct fib_info *fa_info;
|
||||
u8 fa_tos;
|
||||
u8 fa_type;
|
||||
|
@ -854,6 +854,7 @@ failure:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Note! fib_semantic_match intentionally uses RCU list functions. */
|
||||
int fib_semantic_match(struct list_head *head, const struct flowi *flp,
|
||||
struct fib_result *res, __u32 zone, __u32 mask,
|
||||
int prefixlen)
|
||||
@ -861,7 +862,7 @@ int fib_semantic_match(struct list_head *head, const struct flowi *flp,
|
||||
struct fib_alias *fa;
|
||||
int nh_sel = 0;
|
||||
|
||||
list_for_each_entry(fa, head, fa_list) {
|
||||
list_for_each_entry_rcu(fa, head, fa_list) {
|
||||
int err;
|
||||
|
||||
if (fa->fa_tos &&
|
||||
|
Loading…
Reference in New Issue
Block a user