aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/qlcnic
diff options
context:
space:
mode:
authorAmit Kumar Salecha <amit.salecha@qlogic.com>2010-04-21 22:51:40 -0400
committerDavid S. Miller <davem@davemloft.net>2010-04-22 18:28:30 -0400
commited6f1353e195b4432e251667b2d84d766d07c79c (patch)
treec3431005c6e541dd65f23a8af7a7eb16b3ee4d8f /drivers/net/qlcnic
parentade91f8ec92da43b62b0efaa854cfd4b5ec0c0c9 (diff)
qlcnic: fix rcv buffer leak
Rcv producer value 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/qlcnic')
-rw-r--r--drivers/net/qlcnic/qlcnic_init.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/net/qlcnic/qlcnic_init.c b/drivers/net/qlcnic/qlcnic_init.c
index 9ef9f58f84dd..1b621ca13e25 100644
--- a/drivers/net/qlcnic/qlcnic_init.c
+++ b/drivers/net/qlcnic/qlcnic_init.c
@@ -1554,9 +1554,10 @@ qlcnic_post_rx_buffers(struct qlcnic_adapter *adapter, u32 ringid,
1554 int producer, count = 0; 1554 int producer, count = 0;
1555 struct list_head *head; 1555 struct list_head *head;
1556 1556
1557 spin_lock(&rds_ring->lock);
1558
1557 producer = rds_ring->producer; 1559 producer = rds_ring->producer;
1558 1560
1559 spin_lock(&rds_ring->lock);
1560 head = &rds_ring->free_list; 1561 head = &rds_ring->free_list;
1561 while (!list_empty(head)) { 1562 while (!list_empty(head)) {
1562 1563
@@ -1578,13 +1579,13 @@ qlcnic_post_rx_buffers(struct qlcnic_adapter *adapter, u32 ringid,
1578 1579
1579 producer = get_next_index(producer, rds_ring->num_desc); 1580 producer = get_next_index(producer, rds_ring->num_desc);
1580 } 1581 }
1581 spin_unlock(&rds_ring->lock);
1582 1582
1583 if (count) { 1583 if (count) {
1584 rds_ring->producer = producer; 1584 rds_ring->producer = producer;
1585 writel((producer-1) & (rds_ring->num_desc-1), 1585 writel((producer-1) & (rds_ring->num_desc-1),
1586 rds_ring->crb_rcv_producer); 1586 rds_ring->crb_rcv_producer);
1587 } 1587 }
1588 spin_unlock(&rds_ring->lock);
1588} 1589}
1589 1590
1590static void 1591static void
@@ -1596,10 +1597,11 @@ qlcnic_post_rx_buffers_nodb(struct qlcnic_adapter *adapter,
1596 int producer, count = 0; 1597 int producer, count = 0;
1597 struct list_head *head; 1598 struct list_head *head;
1598 1599
1599 producer = rds_ring->producer;
1600 if (!spin_trylock(&rds_ring->lock)) 1600 if (!spin_trylock(&rds_ring->lock))
1601 return; 1601 return;
1602 1602
1603 producer = rds_ring->producer;
1604
1603 head = &rds_ring->free_list; 1605 head = &rds_ring->free_list;
1604 while (!list_empty(head)) { 1606 while (!list_empty(head)) {
1605 1607