On Thu, 10 Jul 2025 08:22:45 +0200 Maxime Chevallier wrote:
@@ -1098,6 +1101,10 @@ static int __init nsim_module_init(void) { int err;
- err = nsim_phy_drv_register();
 - if (err)
 return err;- err = nsim_dev_init(); if (err) return err;
 
I think you're missing error handling in this function if something after drv_register fails.
@@ -1124,6 +1131,7 @@ static void __exit nsim_module_exit(void) rtnl_link_unregister(&nsim_link_ops); nsim_bus_exit(); nsim_dev_exit();
- nsim_phy_drv_unregister();
 }
+free_mdiobus:
- atomic_dec(&bus_num);
 - mdiobus_free(mb->mii);
 +free_pdev:
- platform_device_unregister(mb->pdev);
 +free_mb:
Others have added netdevsim code so the entire code base doesn't follow what I'm about to say, but if you dont mind indulging my personal coding style - error handling labels on a path disjoint from the success path should be prefixed with err_$first-undo-action. If the error handling shares the path with success the label prefix should be exit_$.. You can look at drivers/net/netdevsim/bpf.c for examples
- kfree(mb);
 - return NULL;
 +}
+static ssize_t +nsim_phy_add_write(struct file *file, const char __user *data,
size_t count, loff_t *ppos)+{
- struct net_device *dev = file->private_data;
 - struct netdevsim *ns = netdev_priv(dev);
 - struct nsim_phy_device *ns_phy;
 - struct phy_device *pphy;
 - u32 parent_id;
 - char buf[10];
 - ssize_t ret;
 - int err;
 - if (*ppos != 0)
 return 0;- if (count >= sizeof(buf))
 return -ENOSPC;- ret = copy_from_user(buf, data, count);
 - if (ret)
 return -EFAULT;- buf[count] = '\0';
 - ret = kstrtouint(buf, 10, &parent_id);
 - if (ret)
 return -EINVAL;- ns_phy = nsim_phy_register();
 - if (IS_ERR(ns_phy))
 return PTR_ERR(ns_phy);- if (!parent_id) {
 if (!dev->phydev) {err = phy_connect_direct(dev, ns_phy->phy, nsim_adjust_link,PHY_INTERFACE_MODE_NA);if (err)return err;phy_attached_info(ns_phy->phy);phy_start(ns_phy->phy);} else {phy_link_topo_add_phy(dev, ns_phy->phy, PHY_UPSTREAM_MAC, dev);}- } else {
 pphy = phy_link_topo_get_phy(dev, parent_id);if (!pphy)return -EINVAL;phy_link_topo_add_phy(dev, ns_phy->phy, PHY_UPSTREAM_PHY, pphy);- }
 - nsim_phy_debugfs_create(ns->nsim_dev_port, ns_phy);
 - list_add(&ns_phy->node, &ns->nsim_dev->phy_list);
 
No locks needed.. for any of this.. ?