]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: mana: Use kvmalloc for large RX queue and buffer allocations
authorAditya Garg <gargaditya@linux.microsoft.com>
Sat, 2 May 2026 07:45:34 +0000 (00:45 -0700)
committerJakub Kicinski <kuba@kernel.org>
Wed, 6 May 2026 02:23:16 +0000 (19:23 -0700)
The RX path allocations for rxbufs_pre, das_pre, and rxq scale with
queue count and queue depth. With high queue counts and depth, these can
exceed what kmalloc can reliably provide from physically contiguous
memory under fragmentation.

Switch these from kmalloc to kvmalloc variants so the allocator
transparently falls back to vmalloc when contiguous memory is scarce,
and update the corresponding frees to kvfree.

Signed-off-by: Aditya Garg <gargaditya@linux.microsoft.com>
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
Link: https://patch.msgid.link/20260502074552.23857-3-gargaditya@linux.microsoft.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/microsoft/mana/mana_en.c

index b4379993d096d1adf2425b4e553f5b85627b4da0..462a457e7d53f5c77305cfe1cdb0833c6f943835 100644 (file)
@@ -685,11 +685,11 @@ void mana_pre_dealloc_rxbufs(struct mana_port_context *mpc)
                put_page(virt_to_head_page(mpc->rxbufs_pre[i]));
        }
 
-       kfree(mpc->das_pre);
+       kvfree(mpc->das_pre);
        mpc->das_pre = NULL;
 
 out2:
-       kfree(mpc->rxbufs_pre);
+       kvfree(mpc->rxbufs_pre);
        mpc->rxbufs_pre = NULL;
 
 out1:
@@ -806,11 +806,11 @@ int mana_pre_alloc_rxbufs(struct mana_port_context *mpc, int new_mtu, int num_qu
        num_rxb = num_queues * mpc->rx_queue_size;
 
        WARN(mpc->rxbufs_pre, "mana rxbufs_pre exists\n");
-       mpc->rxbufs_pre = kmalloc_array(num_rxb, sizeof(void *), GFP_KERNEL);
+       mpc->rxbufs_pre = kvmalloc_array(num_rxb, sizeof(void *), GFP_KERNEL);
        if (!mpc->rxbufs_pre)
                goto error;
 
-       mpc->das_pre = kmalloc_objs(dma_addr_t, num_rxb);
+       mpc->das_pre = kvmalloc_objs(dma_addr_t, num_rxb);
        if (!mpc->das_pre)
                goto error;
 
@@ -2570,7 +2570,7 @@ static void mana_destroy_rxq(struct mana_port_context *apc,
        if (rxq->gdma_rq)
                mana_gd_destroy_queue(gc, rxq->gdma_rq);
 
-       kfree(rxq);
+       kvfree(rxq);
 }
 
 static int mana_fill_rx_oob(struct mana_recv_buf_oob *rx_oob, u32 mem_key,
@@ -2710,7 +2710,7 @@ static struct mana_rxq *mana_create_rxq(struct mana_port_context *apc,
 
        gc = gd->gdma_context;
 
-       rxq = kzalloc_flex(*rxq, rx_oobs, apc->rx_queue_size);
+       rxq = kvzalloc_flex(*rxq, rx_oobs, apc->rx_queue_size);
        if (!rxq)
                return NULL;