net: use the frag lru_lock to protect netns_frags.nqueues update
authorJesper Dangaard Brouer <brouer@redhat.com>
Wed, 27 Mar 2013 05:55:56 +0000 (05:55 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 27 Mar 2013 16:48:33 +0000 (12:48 -0400)
Move the protection of netns_frags.nqueues updates under the LRU_lock,
instead of the write lock.  As they are located on the same cacheline,
and this is also needed when transitioning to use per hash bucket locking.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/inet_frag.h
net/ipv4/inet_fragment.c

index 64b4e7d23b8ae2834f37989a66d7892f1caabc53..7cac9c5789b55a2a94ef5ed1a30a9ec245c66d23 100644 (file)
@@ -143,6 +143,7 @@ static inline void inet_frag_lru_del(struct inet_frag_queue *q)
 {
        spin_lock(&q->net->lru_lock);
        list_del(&q->lru_list);
+       q->net->nqueues--;
        spin_unlock(&q->net->lru_lock);
 }
 
@@ -151,6 +152,7 @@ static inline void inet_frag_lru_add(struct netns_frags *nf,
 {
        spin_lock(&nf->lru_lock);
        list_add_tail(&q->lru_list, &nf->lru_list);
+       q->net->nqueues++;
        spin_unlock(&nf->lru_lock);
 }
 
index 8ba548a8efcefd8b8ea48a88ced9030f76fb32a7..1206ca64b0eabdf8812941daa8ae20b55e16c3e5 100644 (file)
@@ -124,7 +124,6 @@ static inline void fq_unlink(struct inet_frag_queue *fq, struct inet_frags *f)
 {
        write_lock(&f->lock);
        hlist_del(&fq->list);
-       fq->net->nqueues--;
        write_unlock(&f->lock);
        inet_frag_lru_del(fq);
 }
@@ -260,7 +259,6 @@ static struct inet_frag_queue *inet_frag_intern(struct netns_frags *nf,
 
        atomic_inc(&qp->refcnt);
        hlist_add_head(&qp->list, &f->hash[hash]);
-       nf->nqueues++;
        write_unlock(&f->lock);
        inet_frag_lru_add(nf, qp);
        return qp;