Commit 7e736f9a authored by Parav Pandit's avatar Parav Pandit Committed by Saeed Mahameed

net/mlx5: E-Switch prepare functions change handler to be modular

Eswitch function change handler will service multiple type of events for
VFs and non VF functions update.
Hence, introduce and use the helper function
esw_vfs_changed_event_handler() for handling change in num VFs to improve
the code readability.
Signed-off-by: default avatarParav Pandit <parav@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent 2752b823
...@@ -2046,38 +2046,48 @@ static void esw_offloads_steering_cleanup(struct mlx5_eswitch *esw) ...@@ -2046,38 +2046,48 @@ static void esw_offloads_steering_cleanup(struct mlx5_eswitch *esw)
esw_destroy_offloads_acl_tables(esw); esw_destroy_offloads_acl_tables(esw);
} }
static void esw_functions_changed_event_handler(struct work_struct *work) static void
esw_vfs_changed_event_handler(struct mlx5_eswitch *esw, const u32 *out)
{ {
u32 out[MLX5_ST_SZ_DW(query_esw_functions_out)] = {};
struct mlx5_host_work *host_work;
struct mlx5_eswitch *esw;
bool host_pf_disabled; bool host_pf_disabled;
u16 num_vfs = 0; u16 new_num_vfs;
int err;
host_work = container_of(work, struct mlx5_host_work, work);
esw = host_work->esw;
err = mlx5_esw_query_functions(esw->dev, out, sizeof(out)); new_num_vfs = MLX5_GET(query_esw_functions_out, out,
num_vfs = MLX5_GET(query_esw_functions_out, out, host_params_context.host_num_of_vfs);
host_params_context.host_num_of_vfs);
host_pf_disabled = MLX5_GET(query_esw_functions_out, out, host_pf_disabled = MLX5_GET(query_esw_functions_out, out,
host_params_context.host_pf_disabled); host_params_context.host_pf_disabled);
if (err || host_pf_disabled || num_vfs == esw->esw_funcs.num_vfs)
goto out; if (new_num_vfs == esw->esw_funcs.num_vfs || host_pf_disabled)
return;
/* Number of VFs can only change from "0 to x" or "x to 0". */ /* Number of VFs can only change from "0 to x" or "x to 0". */
if (esw->esw_funcs.num_vfs > 0) { if (esw->esw_funcs.num_vfs > 0) {
esw_offloads_unload_vf_reps(esw, esw->esw_funcs.num_vfs); esw_offloads_unload_vf_reps(esw, esw->esw_funcs.num_vfs);
} else { } else {
err = esw_offloads_load_vf_reps(esw, num_vfs); int err;
err = esw_offloads_load_vf_reps(esw, new_num_vfs);
if (err) if (err)
goto out; return;
} }
esw->esw_funcs.num_vfs = new_num_vfs;
}
static void esw_functions_changed_event_handler(struct work_struct *work)
{
u32 out[MLX5_ST_SZ_DW(query_esw_functions_out)] = {};
struct mlx5_host_work *host_work;
struct mlx5_eswitch *esw;
int err;
host_work = container_of(work, struct mlx5_host_work, work);
esw = host_work->esw;
esw->esw_funcs.num_vfs = num_vfs; err = mlx5_esw_query_functions(esw->dev, out, sizeof(out));
if (err)
goto out;
esw_vfs_changed_event_handler(esw, out);
out: out:
kfree(host_work); kfree(host_work);
} }
......
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