Commit 8f0d1451 authored by Shay Drory's avatar Shay Drory Committed by Saeed Mahameed

net/mlx5: Serialize module cleanup with reload and remove

Currently, remove and reload flows can run in parallel to module cleanup.
This design is error prone. For example: aux_drivers callbacks are called
from both cleanup and remove flows with different lockings, which can
cause a deadlock[1].
Hence, serialize module cleanup with reload and remove.

[1]
       cleanup                        remove
       -------                        ------
   auxiliary_driver_unregister();
                                     devl_lock()
                                      auxiliary_device_delete(mlx5e_aux)
    device_lock(mlx5e_aux)
     devl_lock()
                                       device_lock(mlx5e_aux)

Fixes: 912cebf4 ("net/mlx5e: Connect ethernet part to auxiliary bus")
Signed-off-by: default avatarShay Drory <shayd@nvidia.com>
Reviewed-by: default avatarMoshe Shemesh <moshe@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 184e1e44
...@@ -2110,7 +2110,7 @@ static int __init mlx5_init(void) ...@@ -2110,7 +2110,7 @@ static int __init mlx5_init(void)
mlx5_core_verify_params(); mlx5_core_verify_params();
mlx5_register_debugfs(); mlx5_register_debugfs();
err = pci_register_driver(&mlx5_core_driver); err = mlx5e_init();
if (err) if (err)
goto err_debug; goto err_debug;
...@@ -2118,16 +2118,16 @@ static int __init mlx5_init(void) ...@@ -2118,16 +2118,16 @@ static int __init mlx5_init(void)
if (err) if (err)
goto err_sf; goto err_sf;
err = mlx5e_init(); err = pci_register_driver(&mlx5_core_driver);
if (err) if (err)
goto err_en; goto err_pci;
return 0; return 0;
err_en: err_pci:
mlx5_sf_driver_unregister(); mlx5_sf_driver_unregister();
err_sf: err_sf:
pci_unregister_driver(&mlx5_core_driver); mlx5e_cleanup();
err_debug: err_debug:
mlx5_unregister_debugfs(); mlx5_unregister_debugfs();
return err; return err;
...@@ -2135,9 +2135,9 @@ static int __init mlx5_init(void) ...@@ -2135,9 +2135,9 @@ static int __init mlx5_init(void)
static void __exit mlx5_cleanup(void) static void __exit mlx5_cleanup(void)
{ {
mlx5e_cleanup();
mlx5_sf_driver_unregister();
pci_unregister_driver(&mlx5_core_driver); pci_unregister_driver(&mlx5_core_driver);
mlx5_sf_driver_unregister();
mlx5e_cleanup();
mlx5_unregister_debugfs(); mlx5_unregister_debugfs();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment