mlx5: postpone freeing the completed command entity to taskqueue

because cancel_delayed_work_sync() might need to sleep, which cannot be
done in the interrupt thread where the completion runs.

Sponsored by:	Nvidia networking
MFC after:	1 week
This commit is contained in:
Konstantin Belousov
2026-03-10 09:32:00 +02:00
parent 434e1c3d84
commit f0d5f46a1e
2 changed files with 12 additions and 1 deletions
+1
View File
@@ -890,6 +890,7 @@ struct mlx5_cmd_work_ent {
u16 op;
u8 busy;
bool polling;
struct work_struct freew;
};
struct mlx5_pas {
+11 -1
View File
@@ -802,6 +802,15 @@ static void cb_timeout_handler(struct work_struct *work)
mlx5_cmd_comp_handler(dev, 1UL << ent->idx, MLX5_CMD_MODE_EVENTS);
}
static void
cmd_free_work(struct work_struct *work)
{
struct mlx5_cmd_work_ent *ent = container_of(work,
struct mlx5_cmd_work_ent, freew);
free_cmd(ent);
}
static void complete_command(struct mlx5_cmd_work_ent *ent)
{
struct mlx5_cmd *cmd = ent->cmd;
@@ -856,7 +865,8 @@ static void complete_command(struct mlx5_cmd_work_ent *ent)
free_msg(dev, ent->in);
err = err ? err : ent->status;
free_cmd(ent);
INIT_WORK(&ent->freew, cmd_free_work);
schedule_work(&ent->freew);
callback(err, context);
} else {
complete(&ent->done);