net/mlx5: Set command entry semaphore up once got index free
Avoid a race where command work handler may fail to allocate command
entry index, by holding the command semaphore down till command entry
index is being freed.
Fixes: 410bd754cd
("net/mlx5: Add retry mechanism to the command entry index allocation")
Signed-off-by: Moshe Shemesh <moshe@nvidia.com>
Reviewed-by: Eran Ben Elisha <eranbe@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
parent
07f6dc4024
commit
8e715cd613
1 changed files with 6 additions and 9 deletions
|
@ -148,8 +148,12 @@ static void cmd_ent_put(struct mlx5_cmd_work_ent *ent)
|
||||||
if (!refcount_dec_and_test(&ent->refcnt))
|
if (!refcount_dec_and_test(&ent->refcnt))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (ent->idx >= 0)
|
if (ent->idx >= 0) {
|
||||||
cmd_free_index(ent->cmd, ent->idx);
|
struct mlx5_cmd *cmd = ent->cmd;
|
||||||
|
|
||||||
|
cmd_free_index(cmd, ent->idx);
|
||||||
|
up(ent->page_queue ? &cmd->pages_sem : &cmd->sem);
|
||||||
|
}
|
||||||
|
|
||||||
cmd_free_ent(ent);
|
cmd_free_ent(ent);
|
||||||
}
|
}
|
||||||
|
@ -1602,8 +1606,6 @@ static void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, u64 vec, bool force
|
||||||
vector = vec & 0xffffffff;
|
vector = vec & 0xffffffff;
|
||||||
for (i = 0; i < (1 << cmd->log_sz); i++) {
|
for (i = 0; i < (1 << cmd->log_sz); i++) {
|
||||||
if (test_bit(i, &vector)) {
|
if (test_bit(i, &vector)) {
|
||||||
struct semaphore *sem;
|
|
||||||
|
|
||||||
ent = cmd->ent_arr[i];
|
ent = cmd->ent_arr[i];
|
||||||
|
|
||||||
/* if we already completed the command, ignore it */
|
/* if we already completed the command, ignore it */
|
||||||
|
@ -1626,10 +1628,6 @@ static void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, u64 vec, bool force
|
||||||
dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR)
|
dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR)
|
||||||
cmd_ent_put(ent);
|
cmd_ent_put(ent);
|
||||||
|
|
||||||
if (ent->page_queue)
|
|
||||||
sem = &cmd->pages_sem;
|
|
||||||
else
|
|
||||||
sem = &cmd->sem;
|
|
||||||
ent->ts2 = ktime_get_ns();
|
ent->ts2 = ktime_get_ns();
|
||||||
memcpy(ent->out->first.data, ent->lay->out, sizeof(ent->lay->out));
|
memcpy(ent->out->first.data, ent->lay->out, sizeof(ent->lay->out));
|
||||||
dump_command(dev, ent, 0);
|
dump_command(dev, ent, 0);
|
||||||
|
@ -1683,7 +1681,6 @@ static void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, u64 vec, bool force
|
||||||
*/
|
*/
|
||||||
complete(&ent->done);
|
complete(&ent->done);
|
||||||
}
|
}
|
||||||
up(sem);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue