Skip to content

Commit

Permalink
net/mlx5: fix timestamp initialization on empty clock queue
Browse files Browse the repository at this point in the history
[ upstream commit dab07e4 ]

The committing completions by clock queue might be delayed
after queue initialization is done and the only Clock Queue
completion entry (CQE) might keep the invalid status till
the CQE first update happens.

The mlx5_txpp_update_timestamp() wrongly recognized invalid
status as error and reported about lost synchronization.

The patch recognizes the invalid status as "not updated yet"
and accurate scheduling initialization routine waits till
CQE first update happens.

Some collateral typos in comment are fixed as well.

Fixes: 77522be ("net/mlx5: introduce clock queue service routine")

Signed-off-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
  • Loading branch information
viacheslavo authored and bluca committed Aug 3, 2021
1 parent 0564825 commit f46e2c7
Showing 1 changed file with 15 additions and 6 deletions.
21 changes: 15 additions & 6 deletions drivers/net/mlx5/mlx5_txpp.c
Expand Up @@ -676,8 +676,8 @@ mlx5_atomic_read_cqe(rte_int128_t *from, rte_int128_t *ts)
{
/*
* The only CQE of Clock Queue is being continuously
* update by hardware with soecified rate. We have to
* read timestump and WQE completion index atomically.
* updated by hardware with specified rate. We must
* read timestamp and WQE completion index atomically.
*/
#if defined(RTE_ARCH_X86_64)
rte_int128_t src;
Expand Down Expand Up @@ -738,15 +738,24 @@ mlx5_txpp_update_timestamp(struct mlx5_dev_ctx_shared *sh)
} to;
uint64_t ts;
uint16_t ci;
uint8_t opcode;

static_assert(sizeof(struct mlx5_cqe_ts) == sizeof(rte_int128_t),
"Wrong timestamp CQE part size");
mlx5_atomic_read_cqe((rte_int128_t *)&cqe->timestamp, &to.u128);
if (to.cts.op_own >> 4) {
DRV_LOG(DEBUG, "Clock Queue error sync lost.");
__atomic_fetch_add(&sh->txpp.err_clock_queue,
opcode = MLX5_CQE_OPCODE(to.cts.op_own);
if (opcode) {
if (opcode != MLX5_CQE_INVALID) {
/*
* Commit the error state if and only if
* we have got at least one actual completion.
*/
DRV_LOG(DEBUG,
"Clock Queue error sync lost (%X).", opcode);
__atomic_fetch_add(&sh->txpp.err_clock_queue,
1, __ATOMIC_RELAXED);
sh->txpp.sync_lost = 1;
sh->txpp.sync_lost = 1;
}
return;
}
ci = rte_be_to_cpu_16(to.cts.wqe_counter);
Expand Down

0 comments on commit f46e2c7

Please sign in to comment.