Hi!
From: Jiasheng Jiang jiasheng@iscas.ac.cn
[ Upstream commit 9b8bdd1eb5890aeeab7391dddcf8bd51f7b07216 ]
Because of the possible failure of the kcalloc, it should be better to set rx_queue->page_ptr_mask to 0 when it happens in order to maintain the consistency.
Again this is confusing/wrong, or at least not a complete fix...
+++ b/drivers/net/ethernet/sfc/falcon/rx.c @@ -732,7 +732,10 @@ static void ef4_init_rx_recycle_ring(struct ef4_nic *efx, efx->rx_bufs_per_page); rx_queue->page_ring = kcalloc(page_ring_size, sizeof(*rx_queue->page_ring), GFP_KERNEL);
- rx_queue->page_ptr_mask = page_ring_size - 1;
- if (!rx_queue->page_ring)
rx_queue->page_ptr_mask = 0;
- else
rx_queue->page_ptr_mask = page_ring_size - 1;
}
...as we have
index = rx_queue->page_remove & rx_queue->page_ptr_mask; page = rx_queue->page_ring[index]; in ef4_reuse_page, and similar problems in other places, including
for (i = 0; i <= rx_queue->page_ptr_mask; i++) { struct page *page = rx_queue->page_ring[i];
. Best regards, Pavel