size = sizeof(struct igb_rx_buffer) * rx_ring->count;
 
-       rx_ring->rx_buffer_info = vzalloc(size);
+       rx_ring->rx_buffer_info = vmalloc(size);
        if (!rx_ring->rx_buffer_info)
                goto err;
 
        rxdctl |= IGB_RX_HTHRESH << 8;
        rxdctl |= IGB_RX_WTHRESH << 16;
 
+       /* initialize rx_buffer_info */
+       memset(ring->rx_buffer_info, 0,
+              sizeof(struct igb_rx_buffer) * ring->count);
+
        /* initialize Rx descriptor 0 */
        rx_desc = IGB_RX_DESC(ring, 0);
        rx_desc->wb.upper.length = 0;
  **/
 static void igb_clean_rx_ring(struct igb_ring *rx_ring)
 {
-       unsigned long size;
-       u16 i;
+       u16 i = rx_ring->next_to_clean;
 
        if (rx_ring->skb)
                dev_kfree_skb(rx_ring->skb);
        rx_ring->skb = NULL;
 
-       if (!rx_ring->rx_buffer_info)
-               return;
-
        /* Free all the Rx ring sk_buffs */
-       for (i = 0; i < rx_ring->count; i++) {
+       while (i != rx_ring->next_to_alloc) {
                struct igb_rx_buffer *buffer_info = &rx_ring->rx_buffer_info[i];
 
-               if (!buffer_info->page)
-                       continue;
-
                /* Invalidate cache lines that may have been written to by
                 * device so that we avoid corrupting memory.
                 */
                __page_frag_cache_drain(buffer_info->page,
                                        buffer_info->pagecnt_bias);
 
-               buffer_info->page = NULL;
+               i++;
+               if (i == rx_ring->count)
+                       i = 0;
        }
 
-       size = sizeof(struct igb_rx_buffer) * rx_ring->count;
-       memset(rx_ring->rx_buffer_info, 0, size);
-
        rx_ring->next_to_alloc = 0;
        rx_ring->next_to_clean = 0;
        rx_ring->next_to_use = 0;