@@ -407,7 +407,7 @@ struct efx_rx_queue {
unsigned int page_recycle_count;
unsigned int page_recycle_failed;
unsigned int page_recycle_full;
- unsigned int page_ptr_mask;
+ int page_ptr_mask;
unsigned int max_fill;
unsigned int fast_fill_trigger;
unsigned int min_fill;
@@ -150,7 +150,10 @@ static void efx_init_rx_recycle_ring(struct efx_rx_queue *rx_queue)
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 = -1;
+ else
+ rx_queue->page_ptr_mask = page_ring_size - 1;
}
static void efx_fini_rx_recycle_ring(struct efx_rx_queue *rx_queue)
The return value of kcalloc() needs to be checked. To avoid dereference of null pointer in case of the failure of alloc, such as efx_fini_rx_recycle_ring(). Therefore, it should be better to change the definition of page_ptr_mask to signed int and then assign the page_ptr_mask to -1 when page_ring is NULL, in order to avoid the use in the loop. Fixes: 3d95b884392f ("sfc: move more rx code") Signed-off-by: Jiasheng Jiang <jiasheng@iscas.ac.cn> --- Changelog: v2 -> v3 *Change 1. Casade return -ENOMEM when alloc fails and deal with the error. *Change 2. Set size to -1 instead of return error. --- drivers/net/ethernet/sfc/net_driver.h | 2 +- drivers/net/ethernet/sfc/rx_common.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-)