Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: 912cebf420c2 ("net/mlx5e: Connect ethernet part to auxiliary bus")
Signed-off-by: Shay Drory <shayd@nvidia.com>
Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>

authored by

Shay Drory and committed by
Saeed Mahameed
8f0d1451 184e1e44

+7 -7
+7 -7
drivers/net/ethernet/mellanox/mlx5/core/main.c
··· 2110 2110 mlx5_core_verify_params(); 2111 2111 mlx5_register_debugfs(); 2112 2112 2113 - err = pci_register_driver(&mlx5_core_driver); 2113 + err = mlx5e_init(); 2114 2114 if (err) 2115 2115 goto err_debug; 2116 2116 ··· 2118 2118 if (err) 2119 2119 goto err_sf; 2120 2120 2121 - err = mlx5e_init(); 2121 + err = pci_register_driver(&mlx5_core_driver); 2122 2122 if (err) 2123 - goto err_en; 2123 + goto err_pci; 2124 2124 2125 2125 return 0; 2126 2126 2127 - err_en: 2127 + err_pci: 2128 2128 mlx5_sf_driver_unregister(); 2129 2129 err_sf: 2130 - pci_unregister_driver(&mlx5_core_driver); 2130 + mlx5e_cleanup(); 2131 2131 err_debug: 2132 2132 mlx5_unregister_debugfs(); 2133 2133 return err; ··· 2135 2135 2136 2136 static void __exit mlx5_cleanup(void) 2137 2137 { 2138 - mlx5e_cleanup(); 2139 - mlx5_sf_driver_unregister(); 2140 2138 pci_unregister_driver(&mlx5_core_driver); 2139 + mlx5_sf_driver_unregister(); 2140 + mlx5e_cleanup(); 2141 2141 mlx5_unregister_debugfs(); 2142 2142 } 2143 2143