src - FreeBSD source tree

1 min read Original article ↗
authorKonstantin Belousov <kib@FreeBSD.org>2026-03-10 07:32:00 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2026-03-23 00:23:53 +0000
commitf0d5f46a1e42b801d96447e544cc3820612748b1 (patch)
tree8f29372609faf622f67b78c9abf08018b51c850f
parent434e1c3d84135d1c3a6e578fdfa4b508f0914494 (diff)

mlx5: postpone freeing the completed command entity to taskqueueHEADmain

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

-rw-r--r--sys/dev/mlx5/driver.h1
-rw-r--r--sys/dev/mlx5/mlx5_core/mlx5_cmd.c12

2 files changed, 12 insertions, 1 deletions

diff --git a/sys/dev/mlx5/driver.h b/sys/dev/mlx5/driver.h
index cdefe7e013f6..ba6714c5c7b6 100644
--- a/sys/dev/mlx5/driver.h
+++ b/sys/dev/mlx5/driver.h

@@ -890,6 +890,7 @@ struct mlx5_cmd_work_ent {

u16 op;

u8 busy;

bool polling;

+ struct work_struct freew;

};

struct mlx5_pas {

diff --git a/sys/dev/mlx5/mlx5_core/mlx5_cmd.c b/sys/dev/mlx5/mlx5_core/mlx5_cmd.c
index 86c721a83cb7..e314a04c294f 100644
--- a/sys/dev/mlx5/mlx5_core/mlx5_cmd.c
+++ b/sys/dev/mlx5/mlx5_core/mlx5_cmd.c

@@ -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);