[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:
Robert Olsson 2005-08-25 13:01:03 -07:00 committed by David S. Miller
parent 3625796806
commit e5b4376074
3 changed files with 24 additions and 1 deletions

View File

@ -634,6 +634,27 @@ static inline void hlist_add_after(struct hlist_node *n,
next->next->pprev = &next->next; 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_entry(ptr, type, member) container_of(ptr,type,member)
#define hlist_for_each(pos, head) \ #define hlist_for_each(pos, head) \

View File

@ -7,6 +7,7 @@
struct fib_alias { struct fib_alias {
struct list_head fa_list; struct list_head fa_list;
struct rcu_head rcu;
struct fib_info *fa_info; struct fib_info *fa_info;
u8 fa_tos; u8 fa_tos;
u8 fa_type; u8 fa_type;

View File

@ -854,6 +854,7 @@ failure:
return NULL; return NULL;
} }
/* Note! fib_semantic_match intentionally uses RCU list functions. */
int fib_semantic_match(struct list_head *head, const struct flowi *flp, int fib_semantic_match(struct list_head *head, const struct flowi *flp,
struct fib_result *res, __u32 zone, __u32 mask, struct fib_result *res, __u32 zone, __u32 mask,
int prefixlen) int prefixlen)
@ -861,7 +862,7 @@ int fib_semantic_match(struct list_head *head, const struct flowi *flp,
struct fib_alias *fa; struct fib_alias *fa;
int nh_sel = 0; int nh_sel = 0;
list_for_each_entry(fa, head, fa_list) { list_for_each_entry_rcu(fa, head, fa_list) {
int err; int err;
if (fa->fa_tos && if (fa->fa_tos &&