Skip to content

Commit bd6e43f

Browse files
idoschdavem330
authored andcommitted
mlxsw: core_env: Convert 'module_info_lock' to a mutex
After the previous patch, the lock is always taken in process context so it can be converted to a mutex. It is needed for future changes where we will need to be able to sleep when holding the lock. Convert the lock to a mutex. Signed-off-by: Ido Schimmel <idosch@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 163f3d2 commit bd6e43f

File tree

1 file changed

+13
-10
lines changed

1 file changed

+13
-10
lines changed

drivers/net/ethernet/mellanox/mlxsw/core_env.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <linux/err.h>
66
#include <linux/ethtool.h>
77
#include <linux/sfp.h>
8+
#include <linux/mutex.h>
89

910
#include "core.h"
1011
#include "core_env.h"
@@ -19,7 +20,7 @@ struct mlxsw_env_module_info {
1920
struct mlxsw_env {
2021
struct mlxsw_core *core;
2122
u8 module_count;
22-
spinlock_t module_info_lock; /* Protects 'module_info'. */
23+
struct mutex module_info_lock; /* Protects 'module_info'. */
2324
struct mlxsw_env_module_info module_info[];
2425
};
2526

@@ -507,7 +508,7 @@ static void mlxsw_env_mtwe_event_work(struct work_struct *work)
507508
sensor_warning =
508509
mlxsw_reg_mtwe_sensor_warning_get(event->mtwe_pl,
509510
i + MLXSW_REG_MTMP_MODULE_INDEX_MIN);
510-
spin_lock(&mlxsw_env->module_info_lock);
511+
mutex_lock(&mlxsw_env->module_info_lock);
511512
is_overheat =
512513
mlxsw_env->module_info[i].is_overheat;
513514

@@ -517,21 +518,21 @@ static void mlxsw_env_mtwe_event_work(struct work_struct *work)
517518
* warning OR current state in "no warning" and MTWE
518519
* does not report warning.
519520
*/
520-
spin_unlock(&mlxsw_env->module_info_lock);
521+
mutex_unlock(&mlxsw_env->module_info_lock);
521522
continue;
522523
} else if (is_overheat && !sensor_warning) {
523524
/* MTWE reports "no warning", turn is_overheat off.
524525
*/
525526
mlxsw_env->module_info[i].is_overheat = false;
526-
spin_unlock(&mlxsw_env->module_info_lock);
527+
mutex_unlock(&mlxsw_env->module_info_lock);
527528
} else {
528529
/* Current state is "no warning" and MTWE reports
529530
* "warning", increase the counter and turn is_overheat
530531
* on.
531532
*/
532533
mlxsw_env->module_info[i].is_overheat = true;
533534
mlxsw_env->module_info[i].module_overheat_counter++;
534-
spin_unlock(&mlxsw_env->module_info_lock);
535+
mutex_unlock(&mlxsw_env->module_info_lock);
535536
}
536537
}
537538

@@ -597,9 +598,9 @@ static void mlxsw_env_pmpe_event_work(struct work_struct *work)
597598
work);
598599
mlxsw_env = event->mlxsw_env;
599600

600-
spin_lock_bh(&mlxsw_env->module_info_lock);
601+
mutex_lock(&mlxsw_env->module_info_lock);
601602
mlxsw_env->module_info[event->module].is_overheat = false;
602-
spin_unlock_bh(&mlxsw_env->module_info_lock);
603+
mutex_unlock(&mlxsw_env->module_info_lock);
603604

604605
err = mlxsw_env_module_has_temp_sensor(mlxsw_env->core, event->module,
605606
&has_temp_sensor);
@@ -699,9 +700,9 @@ mlxsw_env_module_overheat_counter_get(struct mlxsw_core *mlxsw_core, u8 module,
699700
if (WARN_ON_ONCE(module >= mlxsw_env->module_count))
700701
return -EINVAL;
701702

702-
spin_lock_bh(&mlxsw_env->module_info_lock);
703+
mutex_lock(&mlxsw_env->module_info_lock);
703704
*p_counter = mlxsw_env->module_info[module].module_overheat_counter;
704-
spin_unlock_bh(&mlxsw_env->module_info_lock);
705+
mutex_unlock(&mlxsw_env->module_info_lock);
705706

706707
return 0;
707708
}
@@ -725,7 +726,7 @@ int mlxsw_env_init(struct mlxsw_core *mlxsw_core, struct mlxsw_env **p_env)
725726
if (!env)
726727
return -ENOMEM;
727728

728-
spin_lock_init(&env->module_info_lock);
729+
mutex_init(&env->module_info_lock);
729730
env->core = mlxsw_core;
730731
env->module_count = module_count;
731732
*p_env = env;
@@ -755,6 +756,7 @@ int mlxsw_env_init(struct mlxsw_core *mlxsw_core, struct mlxsw_env **p_env)
755756
err_module_plug_event_register:
756757
mlxsw_env_temp_warn_event_unregister(env);
757758
err_temp_warn_event_register:
759+
mutex_destroy(&env->module_info_lock);
758760
kfree(env);
759761
return err;
760762
}
@@ -765,5 +767,6 @@ void mlxsw_env_fini(struct mlxsw_env *env)
765767
/* Make sure there is no more event work scheduled. */
766768
mlxsw_core_flush_owq();
767769
mlxsw_env_temp_warn_event_unregister(env);
770+
mutex_destroy(&env->module_info_lock);
768771
kfree(env);
769772
}

0 commit comments

Comments
 (0)