diff options
| author | Amit Kumar Salecha <amit.salecha@qlogic.com> | 2010-06-13 19:39:04 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-06-15 21:15:27 -0400 |
| commit | 2227bae22becb88b75ede022c7bb991aabfb50bb (patch) | |
| tree | 3dcf27270876df33598085282de81678d233acde | |
| parent | bf445080dad9542c6bc6b693d941cae89605134c (diff) | |
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>
| -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 e08527f4b301..c865dda2adf1 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, | |||
| 1805 | netxen_ctx_msg msg = 0; | 1805 | netxen_ctx_msg msg = 0; |
| 1806 | struct list_head *head; | 1806 | struct list_head *head; |
| 1807 | 1807 | ||
| 1808 | spin_lock(&rds_ring->lock); | ||
| 1809 | |||
| 1808 | producer = rds_ring->producer; | 1810 | producer = rds_ring->producer; |
| 1809 | 1811 | ||
| 1810 | spin_lock(&rds_ring->lock); | ||
| 1811 | head = &rds_ring->free_list; | 1812 | head = &rds_ring->free_list; |
| 1812 | while (!list_empty(head)) { | 1813 | while (!list_empty(head)) { |
| 1813 | 1814 | ||
| @@ -1829,7 +1830,6 @@ netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid, | |||
| 1829 | 1830 | ||
| 1830 | producer = get_next_index(producer, rds_ring->num_desc); | 1831 | producer = get_next_index(producer, rds_ring->num_desc); |
| 1831 | } | 1832 | } |
| 1832 | spin_unlock(&rds_ring->lock); | ||
| 1833 | 1833 | ||
| 1834 | if (count) { | 1834 | if (count) { |
| 1835 | rds_ring->producer = producer; | 1835 | rds_ring->producer = producer; |
| @@ -1853,6 +1853,8 @@ netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid, | |||
| 1853 | NETXEN_RCV_PRODUCER_OFFSET), msg); | 1853 | NETXEN_RCV_PRODUCER_OFFSET), msg); |
| 1854 | } | 1854 | } |
| 1855 | } | 1855 | } |
| 1856 | |||
| 1857 | spin_unlock(&rds_ring->lock); | ||
| 1856 | } | 1858 | } |
| 1857 | 1859 | ||
| 1858 | static void | 1860 | static void |
| @@ -1864,10 +1866,11 @@ netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, | |||
| 1864 | int producer, count = 0; | 1866 | int producer, count = 0; |
| 1865 | struct list_head *head; | 1867 | struct list_head *head; |
| 1866 | 1868 | ||
| 1867 | producer = rds_ring->producer; | ||
| 1868 | if (!spin_trylock(&rds_ring->lock)) | 1869 | if (!spin_trylock(&rds_ring->lock)) |
| 1869 | return; | 1870 | return; |
| 1870 | 1871 | ||
| 1872 | producer = rds_ring->producer; | ||
| 1873 | |||
| 1871 | head = &rds_ring->free_list; | 1874 | head = &rds_ring->free_list; |
| 1872 | while (!list_empty(head)) { | 1875 | while (!list_empty(head)) { |
| 1873 | 1876 | ||
