netdevsim: move devlink registration under the instance lock
authorJakub Kicinski <kuba@kernel.org>
Fri, 6 Jan 2023 06:34:02 +0000 (22:34 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 6 Jan 2023 12:56:19 +0000 (12:56 +0000)
To prevent races with netdev code accessing free devlink instances
move the registration under the devlink instance lock.
Core now waits for the instance to be registered before accessing it.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/netdevsim/dev.c

index d25f6e8..738784f 100644 (file)
@@ -1556,10 +1556,14 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev)
                goto err_devlink_unlock;
        }
 
-       err = nsim_dev_resources_register(devlink);
+       err = devl_register(devlink);
        if (err)
                goto err_vfc_free;
 
+       err = nsim_dev_resources_register(devlink);
+       if (err)
+               goto err_dl_unregister;
+
        err = devlink_params_register(devlink, nsim_devlink_params,
                                      ARRAY_SIZE(nsim_devlink_params));
        if (err)
@@ -1607,7 +1611,6 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev)
        nsim_dev->esw_mode = DEVLINK_ESWITCH_MODE_LEGACY;
        devlink_set_features(devlink, DEVLINK_F_RELOAD);
        devl_unlock(devlink);
-       devlink_register(devlink);
        return 0;
 
 err_hwstats_exit:
@@ -1631,6 +1634,8 @@ err_params_unregister:
                                  ARRAY_SIZE(nsim_devlink_params));
 err_resource_unregister:
        devl_resources_unregister(devlink);
+err_dl_unregister:
+       devl_unregister(devlink);
 err_vfc_free:
        kfree(nsim_dev->vfconfigs);
 err_devlink_unlock:
@@ -1668,7 +1673,6 @@ void nsim_drv_remove(struct nsim_bus_dev *nsim_bus_dev)
        struct nsim_dev *nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev);
        struct devlink *devlink = priv_to_devlink(nsim_dev);
 
-       devlink_unregister(devlink);
        devl_lock(devlink);
        nsim_dev_reload_destroy(nsim_dev);
 
@@ -1677,6 +1681,7 @@ void nsim_drv_remove(struct nsim_bus_dev *nsim_bus_dev)
        devlink_params_unregister(devlink, nsim_devlink_params,
                                  ARRAY_SIZE(nsim_devlink_params));
        devl_resources_unregister(devlink);
+       devl_unregister(devlink);
        kfree(nsim_dev->vfconfigs);
        kfree(nsim_dev->fa_cookie);
        devl_unlock(devlink);