Re: [PATCH net-next v3 10/23] net: move netdev_config manipulation to dedicated helpers
From: Mina Almasry <hidden>
Date: 2025-08-19 20:15:53
Also in:
io-uring, lkml
On Mon, Aug 18, 2025 at 6:56 AM Pavel Begunkov [off-list ref] wrote:
quoted hunk ↗ jump to hunk
From: Jakub Kicinski <kuba@kernel.org> netdev_config manipulation will become slightly more complicated soon and we will need to call if from ethtool as well as queue API. Encapsulate the logic into helper functions. Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> --- net/core/Makefile | 2 +- net/core/dev.c | 7 ++----- net/core/dev.h | 5 +++++ net/core/netdev_config.c | 43 ++++++++++++++++++++++++++++++++++++++++ net/ethtool/netlink.c | 14 ++++++------- 5 files changed, 57 insertions(+), 14 deletions(-) create mode 100644 net/core/netdev_config.cdiff --git a/net/core/Makefile b/net/core/Makefile index b2a76ce33932..4db487396094 100644 --- a/net/core/Makefile +++ b/net/core/Makefile@@ -19,7 +19,7 @@ obj-$(CONFIG_NETDEV_ADDR_LIST_TEST) += dev_addr_lists_test.o obj-y += net-sysfs.o obj-y += hotdata.o -obj-y += netdev_rx_queue.o +obj-y += netdev_config.o netdev_rx_queue.o obj-$(CONFIG_PAGE_POOL) += page_pool.o page_pool_user.o obj-$(CONFIG_PROC_FS) += net-procfs.o obj-$(CONFIG_NET_PKTGEN) += pktgen.odiff --git a/net/core/dev.c b/net/core/dev.c index 5a3c0f40a93f..7cd4e5eab441 100644 --- a/net/core/dev.c +++ b/net/core/dev.c@@ -11873,10 +11873,8 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, if (!dev->ethtool) goto free_all; - dev->cfg = kzalloc(sizeof(*dev->cfg), GFP_KERNEL_ACCOUNT); - if (!dev->cfg) + if (netdev_alloc_config(dev)) goto free_all; - dev->cfg_pending = dev->cfg; dev->num_napi_configs = maxqs; napi_config_sz = array_size(maxqs, sizeof(*dev->napi_config));@@ -11947,8 +11945,7 @@ void free_netdev(struct net_device *dev) return; } - WARN_ON(dev->cfg != dev->cfg_pending); - kfree(dev->cfg); + netdev_free_config(dev); kfree(dev->ethtool); netif_free_tx_queues(dev); netif_free_rx_queues(dev);diff --git a/net/core/dev.h b/net/core/dev.h index d6b08d435479..7041c8bd2a0f 100644 --- a/net/core/dev.h +++ b/net/core/dev.h@@ -92,6 +92,11 @@ extern struct rw_semaphore dev_addr_sem; extern struct list_head net_todo_list; void netdev_run_todo(void); +int netdev_alloc_config(struct net_device *dev); +void __netdev_free_config(struct netdev_config *cfg); +void netdev_free_config(struct net_device *dev); +int netdev_reconfig_start(struct net_device *dev); + /* netdev management, shared between various uAPI entry points */ struct netdev_name_node { struct hlist_node hlist;diff --git a/net/core/netdev_config.c b/net/core/netdev_config.c new file mode 100644 index 000000000000..270b7f10a192 --- /dev/null +++ b/net/core/netdev_config.c@@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include <linux/netdevice.h> +#include <net/netdev_queues.h> + +#include "dev.h" + +int netdev_alloc_config(struct net_device *dev) +{ + struct netdev_config *cfg; + + cfg = kzalloc(sizeof(*dev->cfg), GFP_KERNEL_ACCOUNT); + if (!cfg) + return -ENOMEM; + + dev->cfg = cfg; + dev->cfg_pending = cfg; + return 0; +} + +void __netdev_free_config(struct netdev_config *cfg) +{ + kfree(cfg); +} + +void netdev_free_config(struct net_device *dev) +{ + WARN_ON(dev->cfg != dev->cfg_pending); + __netdev_free_config(dev->cfg); +} + +int netdev_reconfig_start(struct net_device *dev) +{ + struct netdev_config *cfg; + + WARN_ON(dev->cfg != dev->cfg_pending); + cfg = kmemdup(dev->cfg, sizeof(*dev->cfg), GFP_KERNEL_ACCOUNT); + if (!cfg) + return -ENOMEM; + + dev->cfg_pending = cfg; + return 0;
There are a couple of small behavior changes in this code. (a) the WARN_ON is new, and (b) this helper retains dev->cfg_pending on error while the old code would clear it. But both seem fine to me, so, Reviewed-by: Mina Almasry <redacted> -- Thanks, Mina