diff options
author | Amit Kumar Salecha <amit.salecha@qlogic.com> | 2010-06-13 23:39:04 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-06-15 18:15:27 -0700 |
commit | 2227bae22becb88b75ede022c7bb991aabfb50bb (patch) | |
tree | 3dcf27270876df33598085282de81678d233acde /drivers/net/netxen | |
parent | bf445080dad9542c6bc6b693d941cae89605134c (diff) | |
download | linux-3.10-2227bae22becb88b75ede022c7bb991aabfb50bb.tar.gz linux-3.10-2227bae22becb88b75ede022c7bb991aabfb50bb.tar.bz2 linux-3.10-2227bae22becb88b75ede022c7bb991aabfb50bb.zip |
netxen: fix rcv buffer leak
Rcv producer should be read in spin-lock.
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/netxen')
-rw-r--r-- | drivers/net/netxen/netxen_nic_init.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index e08527f4b30..c865dda2adf 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c @@ -1805,9 +1805,10 @@ netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid, netxen_ctx_msg msg = 0; struct list_head *head; + spin_lock(&rds_ring->lock); + producer = rds_ring->producer; - spin_lock(&rds_ring->lock); head = &rds_ring->free_list; while (!list_empty(head)) { @@ -1829,7 +1830,6 @@ netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid, producer = get_next_index(producer, rds_ring->num_desc); } - spin_unlock(&rds_ring->lock); if (count) { rds_ring->producer = producer; @@ -1853,6 +1853,8 @@ netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid, NETXEN_RCV_PRODUCER_OFFSET), msg); } } + + spin_unlock(&rds_ring->lock); } static void @@ -1864,10 +1866,11 @@ netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, int producer, count = 0; struct list_head *head; - producer = rds_ring->producer; if (!spin_trylock(&rds_ring->lock)) return; + producer = rds_ring->producer; + head = &rds_ring->free_list; while (!list_empty(head)) { |