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.. ?
-- 
pw-bot: cr

Reply via email to