Commit da557374 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

inetpeer: inetpeer_invalidate_tree() cleanup

No need to use cmpxchg() in inetpeer_invalidate_tree() since we hold
base lock.

Also use correct rcu annotations to remove sparse errors
(CONFIG_SPARSE_RCU_POINTER=y)

net/ipv4/inetpeer.c:144:19: error: incompatible types in comparison
expression (different address spaces)
net/ipv4/inetpeer.c:149:20: error: incompatible types in comparison
expression (different address spaces)
net/ipv4/inetpeer.c:595:10: error: incompatible types in comparison
expression (different address spaces)
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Cc: Steffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6dab015c
...@@ -126,7 +126,7 @@ int inet_peer_maxttl __read_mostly = 10 * 60 * HZ; /* usual time to live: 10 min ...@@ -126,7 +126,7 @@ int inet_peer_maxttl __read_mostly = 10 * 60 * HZ; /* usual time to live: 10 min
static void inetpeer_gc_worker(struct work_struct *work) static void inetpeer_gc_worker(struct work_struct *work)
{ {
struct inet_peer *p, *n; struct inet_peer *p, *n, *c;
LIST_HEAD(list); LIST_HEAD(list);
spin_lock_bh(&gc_lock); spin_lock_bh(&gc_lock);
...@@ -138,17 +138,19 @@ static void inetpeer_gc_worker(struct work_struct *work) ...@@ -138,17 +138,19 @@ static void inetpeer_gc_worker(struct work_struct *work)
list_for_each_entry_safe(p, n, &list, gc_list) { list_for_each_entry_safe(p, n, &list, gc_list) {
if(need_resched()) if (need_resched())
cond_resched(); cond_resched();
if (p->avl_left != peer_avl_empty) { c = rcu_dereference_protected(p->avl_left, 1);
list_add_tail(&p->avl_left->gc_list, &list); if (c != peer_avl_empty) {
p->avl_left = peer_avl_empty; list_add_tail(&c->gc_list, &list);
p->avl_left = peer_avl_empty_rcu;
} }
if (p->avl_right != peer_avl_empty) { c = rcu_dereference_protected(p->avl_right, 1);
list_add_tail(&p->avl_right->gc_list, &list); if (c != peer_avl_empty) {
p->avl_right = peer_avl_empty; list_add_tail(&c->gc_list, &list);
p->avl_right = peer_avl_empty_rcu;
} }
n = list_entry(p->gc_list.next, struct inet_peer, gc_list); n = list_entry(p->gc_list.next, struct inet_peer, gc_list);
...@@ -587,23 +589,17 @@ static void inetpeer_inval_rcu(struct rcu_head *head) ...@@ -587,23 +589,17 @@ static void inetpeer_inval_rcu(struct rcu_head *head)
void inetpeer_invalidate_tree(struct inet_peer_base *base) void inetpeer_invalidate_tree(struct inet_peer_base *base)
{ {
struct inet_peer *old, *new, *prev; struct inet_peer *root;
write_seqlock_bh(&base->lock); write_seqlock_bh(&base->lock);
old = base->root; root = rcu_deref_locked(base->root, base);
if (old == peer_avl_empty_rcu) if (root != peer_avl_empty) {
goto out; base->root = peer_avl_empty_rcu;
new = peer_avl_empty_rcu;
prev = cmpxchg(&base->root, old, new);
if (prev == old) {
base->total = 0; base->total = 0;
call_rcu(&prev->gc_rcu, inetpeer_inval_rcu); call_rcu(&root->gc_rcu, inetpeer_inval_rcu);
} }
out:
write_sequnlock_bh(&base->lock); write_sequnlock_bh(&base->lock);
} }
EXPORT_SYMBOL(inetpeer_invalidate_tree); EXPORT_SYMBOL(inetpeer_invalidate_tree);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment