Message ID | 20240223235908.693010-1-kuba@kernel.org (mailing list archive) |
---|---|
State | Accepted |
Commit | 1ce7d306ea63f3e379557c79abd88052e0483813 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] veth: try harder when allocating queue memory | expand |
On Sat, Feb 24, 2024 at 12:59 AM Jakub Kicinski <kuba@kernel.org> wrote: > > struct veth_rq is pretty large, 832B total without debug > options enabled. Since commit under Fixes we try to pre-allocate > enough queues for every possible CPU. Miao Wang reports that > this may lead to order-5 allocations which will fail in production. > > Let the allocation fallback to vmalloc() and try harder. > These are the same flags we pass to netdev queue allocation. > > Reported-and-tested-by: Miao Wang <shankerwangmiao@gmail.com> > Fixes: 9d3684c24a52 ("veth: create by default nr_possible_cpus queues") > Link: https://lore.kernel.org/all/5F52CAE2-2FB7-4712-95F1-3312FBBFA8DD@gmail.com/ > Signed-off-by: Jakub Kicinski <kuba@kernel.org> Reviewed-by: Eric Dumazet <edumazet@google.com> This reminds me a change that we should do in netlink_alloc_large_skb(), using kvmalloc() instead of vmalloc().
Hello: This patch was applied to netdev/net.git (main) by Paolo Abeni <pabeni@redhat.com>: On Fri, 23 Feb 2024 15:59:08 -0800 you wrote: > struct veth_rq is pretty large, 832B total without debug > options enabled. Since commit under Fixes we try to pre-allocate > enough queues for every possible CPU. Miao Wang reports that > this may lead to order-5 allocations which will fail in production. > > Let the allocation fallback to vmalloc() and try harder. > These are the same flags we pass to netdev queue allocation. > > [...] Here is the summary with links: - [net] veth: try harder when allocating queue memory https://git.kernel.org/netdev/net/c/1ce7d306ea63 You are awesome, thank you!
diff --git a/drivers/net/veth.c b/drivers/net/veth.c index a786be805709..cd4a6fe458f9 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c @@ -1461,7 +1461,8 @@ static int veth_alloc_queues(struct net_device *dev) struct veth_priv *priv = netdev_priv(dev); int i; - priv->rq = kcalloc(dev->num_rx_queues, sizeof(*priv->rq), GFP_KERNEL_ACCOUNT); + priv->rq = kvcalloc(dev->num_rx_queues, sizeof(*priv->rq), + GFP_KERNEL_ACCOUNT | __GFP_RETRY_MAYFAIL); if (!priv->rq) return -ENOMEM; @@ -1477,7 +1478,7 @@ static void veth_free_queues(struct net_device *dev) { struct veth_priv *priv = netdev_priv(dev); - kfree(priv->rq); + kvfree(priv->rq); } static int veth_dev_init(struct net_device *dev)
struct veth_rq is pretty large, 832B total without debug options enabled. Since commit under Fixes we try to pre-allocate enough queues for every possible CPU. Miao Wang reports that this may lead to order-5 allocations which will fail in production. Let the allocation fallback to vmalloc() and try harder. These are the same flags we pass to netdev queue allocation. Reported-and-tested-by: Miao Wang <shankerwangmiao@gmail.com> Fixes: 9d3684c24a52 ("veth: create by default nr_possible_cpus queues") Link: https://lore.kernel.org/all/5F52CAE2-2FB7-4712-95F1-3312FBBFA8DD@gmail.com/ Signed-off-by: Jakub Kicinski <kuba@kernel.org> --- drivers/net/veth.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)