Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 121527
b: refs/heads/master
c: 96631ed
h: refs/heads/master
i:
  121525: 873d04c
  121523: 78c7a7c
  121519: 16d6ece
v: v3
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Oct 29, 2008
1 parent b5f39b8 commit 237c767
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f52b5054ec108aaa9e903850d6b62af8ae3fe6ae
refs/heads/master: 96631ed16c514cf8b28fab991a076985ce378c26
17 changes: 17 additions & 0 deletions trunk/include/linux/rculist.h
Original file line number Diff line number Diff line change
Expand Up @@ -383,5 +383,22 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \
pos = rcu_dereference(pos->next))

/**
* hlist_for_each_entry_rcu_safenext - iterate over rcu list of given type
* @tpos: the type * to use as a loop cursor.
* @pos: the &struct hlist_node to use as a loop cursor.
* @head: the head for your list.
* @member: the name of the hlist_node within the struct.
* @next: the &struct hlist_node to use as a next cursor
*
* Special version of hlist_for_each_entry_rcu that make sure
* each next pointer is fetched before each iteration.
*/
#define hlist_for_each_entry_rcu_safenext(tpos, pos, head, member, next) \
for (pos = rcu_dereference((head)->first); \
pos && ({ next = pos->next; smp_rmb(); prefetch(next); 1; }) && \
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); \
pos = rcu_dereference(next))

#endif /* __KERNEL__ */
#endif
4 changes: 2 additions & 2 deletions trunk/include/net/sock.h
Original file line number Diff line number Diff line change
Expand Up @@ -419,8 +419,8 @@ static __inline__ void sk_add_bind_node(struct sock *sk,

#define sk_for_each(__sk, node, list) \
hlist_for_each_entry(__sk, node, list, sk_node)
#define sk_for_each_rcu(__sk, node, list) \
hlist_for_each_entry_rcu(__sk, node, list, sk_node)
#define sk_for_each_rcu_safenext(__sk, node, list, next) \
hlist_for_each_entry_rcu_safenext(__sk, node, list, sk_node, next)
#define sk_for_each_from(__sk, node) \
if (__sk && ({ node = &(__sk)->sk_node; 1; })) \
hlist_for_each_entry_from(__sk, node, sk_node)
Expand Down
4 changes: 2 additions & 2 deletions trunk/net/ipv4/udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ static struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr,
int dif, struct udp_table *udptable)
{
struct sock *sk, *result;
struct hlist_node *node;
struct hlist_node *node, *next;
unsigned short hnum = ntohs(dport);
unsigned int hash = udp_hashfn(net, hnum);
struct udp_hslot *hslot = &udptable->hash[hash];
Expand All @@ -266,7 +266,7 @@ static struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr,
begin:
result = NULL;
badness = -1;
sk_for_each_rcu(sk, node, &hslot->head) {
sk_for_each_rcu_safenext(sk, node, &hslot->head, next) {
/*
* lockless reader, and SLAB_DESTROY_BY_RCU items:
* We must check this item was not moved to another chain
Expand Down
4 changes: 2 additions & 2 deletions trunk/net/ipv6/udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ static struct sock *__udp6_lib_lookup(struct net *net,
int dif, struct udp_table *udptable)
{
struct sock *sk, *result;
struct hlist_node *node;
struct hlist_node *node, *next;
unsigned short hnum = ntohs(dport);
unsigned int hash = udp_hashfn(net, hnum);
struct udp_hslot *hslot = &udptable->hash[hash];
Expand All @@ -108,7 +108,7 @@ static struct sock *__udp6_lib_lookup(struct net *net,
begin:
result = NULL;
badness = -1;
sk_for_each_rcu(sk, node, &hslot->head) {
sk_for_each_rcu_safenext(sk, node, &hslot->head, next) {
/*
* lockless reader, and SLAB_DESTROY_BY_RCU items:
* We must check this item was not moved to another chain
Expand Down

0 comments on commit 237c767

Please sign in to comment.