Lightweight netdevices are not added to sysfs; bypass kobject initialization.
Signed-off-by: David Ahern <dsah...@gmail.com> --- include/linux/netdevice.h | 3 +++ net/core/dev.c | 9 ++++++--- net/core/net-sysfs.c | 14 +++++++++++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 08151fd34973..4ddd0ac7e1cb 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -4282,6 +4282,9 @@ static inline const char *netdev_reg_state(const struct net_device *dev) static inline struct kobject *netdev_kobject(struct net_device *dev) { + if (netif_is_lwd(dev)) + return NULL; + return &dev->dev.kobj; } diff --git a/net/core/dev.c b/net/core/dev.c index 48a0252037d5..52bb01041d12 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -7993,7 +7993,8 @@ void free_netdev(struct net_device *dev) dev->reg_state = NETREG_RELEASED; /* will free via device release */ - put_device(&dev->dev); + if (!netif_is_lwd(dev)) + put_device(&dev->dev); } EXPORT_SYMBOL(free_netdev); @@ -8179,8 +8180,10 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char netdev_adjacent_add_links(dev); /* Fixup kobjects */ - err = device_rename(&dev->dev, dev->name); - WARN_ON(err); + if (!netif_is_lwd(dev)) { + err = device_rename(&dev->dev, dev->name); + WARN_ON(err); + } /* Add the device back in the hashes */ list_netdevice(dev); diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 9df53b688f5b..725348cdeb3b 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c @@ -1559,18 +1559,22 @@ EXPORT_SYMBOL(of_find_net_device_by_node); */ void netdev_unregister_kobject(struct net_device *ndev) { + struct kobject *kobj = netdev_kobject(ndev); struct device *dev = &(ndev->dev); if (!atomic_read(&dev_net(ndev)->count)) dev_set_uevent_suppress(dev, 1); - kobject_get(&dev->kobj); + if (kobj) + kobject_get(kobj); - remove_queue_kobjects(ndev); + if (!netif_is_lwd(ndev)) + remove_queue_kobjects(ndev); pm_runtime_set_memalloc_noio(dev, false); - device_del(dev); + if (!netif_is_lwd(ndev)) + device_del(dev); } /* Create sysfs entries for network device. */ @@ -1580,6 +1584,9 @@ int netdev_register_kobject(struct net_device *ndev) const struct attribute_group **groups = ndev->sysfs_groups; int error = 0; + if (netif_is_lwd(ndev)) + goto pm; + device_initialize(dev); dev->class = &net_class; dev->platform_data = ndev; @@ -1614,6 +1621,7 @@ int netdev_register_kobject(struct net_device *ndev) return error; } +pm: pm_runtime_set_memalloc_noio(dev, true); return error; -- 2.11.0 (Apple Git-81)