Commit bd6e43f5 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller

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: default avatarIdo Schimmel <idosch@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 163f3d2d
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/sfp.h> #include <linux/sfp.h>
#include <linux/mutex.h>
#include "core.h" #include "core.h"
#include "core_env.h" #include "core_env.h"
...@@ -19,7 +20,7 @@ struct mlxsw_env_module_info { ...@@ -19,7 +20,7 @@ struct mlxsw_env_module_info {
struct mlxsw_env { struct mlxsw_env {
struct mlxsw_core *core; struct mlxsw_core *core;
u8 module_count; u8 module_count;
spinlock_t module_info_lock; /* Protects 'module_info'. */ struct mutex module_info_lock; /* Protects 'module_info'. */
struct mlxsw_env_module_info module_info[]; struct mlxsw_env_module_info module_info[];
}; };
...@@ -507,7 +508,7 @@ static void mlxsw_env_mtwe_event_work(struct work_struct *work) ...@@ -507,7 +508,7 @@ static void mlxsw_env_mtwe_event_work(struct work_struct *work)
sensor_warning = sensor_warning =
mlxsw_reg_mtwe_sensor_warning_get(event->mtwe_pl, mlxsw_reg_mtwe_sensor_warning_get(event->mtwe_pl,
i + MLXSW_REG_MTMP_MODULE_INDEX_MIN); i + MLXSW_REG_MTMP_MODULE_INDEX_MIN);
spin_lock(&mlxsw_env->module_info_lock); mutex_lock(&mlxsw_env->module_info_lock);
is_overheat = is_overheat =
mlxsw_env->module_info[i].is_overheat; mlxsw_env->module_info[i].is_overheat;
...@@ -517,13 +518,13 @@ static void mlxsw_env_mtwe_event_work(struct work_struct *work) ...@@ -517,13 +518,13 @@ static void mlxsw_env_mtwe_event_work(struct work_struct *work)
* warning OR current state in "no warning" and MTWE * warning OR current state in "no warning" and MTWE
* does not report warning. * does not report warning.
*/ */
spin_unlock(&mlxsw_env->module_info_lock); mutex_unlock(&mlxsw_env->module_info_lock);
continue; continue;
} else if (is_overheat && !sensor_warning) { } else if (is_overheat && !sensor_warning) {
/* MTWE reports "no warning", turn is_overheat off. /* MTWE reports "no warning", turn is_overheat off.
*/ */
mlxsw_env->module_info[i].is_overheat = false; mlxsw_env->module_info[i].is_overheat = false;
spin_unlock(&mlxsw_env->module_info_lock); mutex_unlock(&mlxsw_env->module_info_lock);
} else { } else {
/* Current state is "no warning" and MTWE reports /* Current state is "no warning" and MTWE reports
* "warning", increase the counter and turn is_overheat * "warning", increase the counter and turn is_overheat
...@@ -531,7 +532,7 @@ static void mlxsw_env_mtwe_event_work(struct work_struct *work) ...@@ -531,7 +532,7 @@ static void mlxsw_env_mtwe_event_work(struct work_struct *work)
*/ */
mlxsw_env->module_info[i].is_overheat = true; mlxsw_env->module_info[i].is_overheat = true;
mlxsw_env->module_info[i].module_overheat_counter++; mlxsw_env->module_info[i].module_overheat_counter++;
spin_unlock(&mlxsw_env->module_info_lock); mutex_unlock(&mlxsw_env->module_info_lock);
} }
} }
...@@ -597,9 +598,9 @@ static void mlxsw_env_pmpe_event_work(struct work_struct *work) ...@@ -597,9 +598,9 @@ static void mlxsw_env_pmpe_event_work(struct work_struct *work)
work); work);
mlxsw_env = event->mlxsw_env; mlxsw_env = event->mlxsw_env;
spin_lock_bh(&mlxsw_env->module_info_lock); mutex_lock(&mlxsw_env->module_info_lock);
mlxsw_env->module_info[event->module].is_overheat = false; mlxsw_env->module_info[event->module].is_overheat = false;
spin_unlock_bh(&mlxsw_env->module_info_lock); mutex_unlock(&mlxsw_env->module_info_lock);
err = mlxsw_env_module_has_temp_sensor(mlxsw_env->core, event->module, err = mlxsw_env_module_has_temp_sensor(mlxsw_env->core, event->module,
&has_temp_sensor); &has_temp_sensor);
...@@ -699,9 +700,9 @@ mlxsw_env_module_overheat_counter_get(struct mlxsw_core *mlxsw_core, u8 module, ...@@ -699,9 +700,9 @@ mlxsw_env_module_overheat_counter_get(struct mlxsw_core *mlxsw_core, u8 module,
if (WARN_ON_ONCE(module >= mlxsw_env->module_count)) if (WARN_ON_ONCE(module >= mlxsw_env->module_count))
return -EINVAL; return -EINVAL;
spin_lock_bh(&mlxsw_env->module_info_lock); mutex_lock(&mlxsw_env->module_info_lock);
*p_counter = mlxsw_env->module_info[module].module_overheat_counter; *p_counter = mlxsw_env->module_info[module].module_overheat_counter;
spin_unlock_bh(&mlxsw_env->module_info_lock); mutex_unlock(&mlxsw_env->module_info_lock);
return 0; return 0;
} }
...@@ -725,7 +726,7 @@ int mlxsw_env_init(struct mlxsw_core *mlxsw_core, struct mlxsw_env **p_env) ...@@ -725,7 +726,7 @@ int mlxsw_env_init(struct mlxsw_core *mlxsw_core, struct mlxsw_env **p_env)
if (!env) if (!env)
return -ENOMEM; return -ENOMEM;
spin_lock_init(&env->module_info_lock); mutex_init(&env->module_info_lock);
env->core = mlxsw_core; env->core = mlxsw_core;
env->module_count = module_count; env->module_count = module_count;
*p_env = env; *p_env = env;
...@@ -755,6 +756,7 @@ int mlxsw_env_init(struct mlxsw_core *mlxsw_core, struct mlxsw_env **p_env) ...@@ -755,6 +756,7 @@ int mlxsw_env_init(struct mlxsw_core *mlxsw_core, struct mlxsw_env **p_env)
err_module_plug_event_register: err_module_plug_event_register:
mlxsw_env_temp_warn_event_unregister(env); mlxsw_env_temp_warn_event_unregister(env);
err_temp_warn_event_register: err_temp_warn_event_register:
mutex_destroy(&env->module_info_lock);
kfree(env); kfree(env);
return err; return err;
} }
...@@ -765,5 +767,6 @@ void mlxsw_env_fini(struct mlxsw_env *env) ...@@ -765,5 +767,6 @@ void mlxsw_env_fini(struct mlxsw_env *env)
/* Make sure there is no more event work scheduled. */ /* Make sure there is no more event work scheduled. */
mlxsw_core_flush_owq(); mlxsw_core_flush_owq();
mlxsw_env_temp_warn_event_unregister(env); mlxsw_env_temp_warn_event_unregister(env);
mutex_destroy(&env->module_info_lock);
kfree(env); kfree(env);
} }
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