qlge: Fix memory leak in the process of refill
authorJitendra Kalsaria <jitendra.kalsaria@qlogic.com>
Fri, 3 Feb 2012 14:06:51 +0000 (14:06 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 4 Feb 2012 20:59:31 +0000 (15:59 -0500)
Driver was leaking memory when page allocation failures occurs.

Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qlge/qlge_main.c

index af12e80975d158d11230b54d6c61cf1e854de242..49343ec21c820eda0441a2f274c2a7d3c667d50c 100644 (file)
@@ -1143,14 +1143,16 @@ static void ql_update_lbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
        int i;
 
        while (rx_ring->lbq_free_cnt > 32) {
-               for (i = 0; i < 16; i++) {
+               for (i = (rx_ring->lbq_clean_idx % 16); i < 16; i++) {
                        netif_printk(qdev, rx_status, KERN_DEBUG, qdev->ndev,
                                     "lbq: try cleaning clean_idx = %d.\n",
                                     clean_idx);
                        lbq_desc = &rx_ring->lbq[clean_idx];
                        if (ql_get_next_chunk(qdev, rx_ring, lbq_desc)) {
+                               rx_ring->lbq_clean_idx = clean_idx;
                                netif_err(qdev, ifup, qdev->ndev,
-                                         "Could not get a page chunk.\n");
+                                               "Could not get a page chunk, i=%d, clean_idx =%d .\n",
+                                               i, clean_idx);
                                return;
                        }
 
@@ -1195,7 +1197,7 @@ static void ql_update_sbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
        int i;
 
        while (rx_ring->sbq_free_cnt > 16) {
-               for (i = 0; i < 16; i++) {
+               for (i = (rx_ring->sbq_clean_idx % 16); i < 16; i++) {
                        sbq_desc = &rx_ring->sbq[clean_idx];
                        netif_printk(qdev, rx_status, KERN_DEBUG, qdev->ndev,
                                     "sbq: try cleaning clean_idx = %d.\n",