Skip to content

Commit 92214be

Browse files
Binary-Eaterkuba-moo
authored andcommitted
net/mlx5e: Update doorbell for port timestamping CQ before the software counter
Previously, mlx5e_ptp_poll_ts_cq would update the device doorbell with the incremented consumer index after the relevant software counters in the kernel were updated. In the mlx5e_sq_xmit_wqe context, this would lead to either overrunning the device CQ or exceeding the expected software buffer size in the device CQ if the device CQ size was greater than the software buffer size. Update the relevant software counter only after updating the device CQ consumer index in the port timestamping napi_poll context. Log: mlx5_core 0000:08:00.0: cq_err_event_notifier:517:(pid 0): CQ error on CQN 0x487, syndrome 0x1 mlx5_core 0000:08:00.0 eth2: mlx5e_cq_error_event: cqn=0x000487 event=0x04 Fixes: 1880bc4 ("net/mlx5e: Add TX port timestamp support") Signed-off-by: Rahul Rameshbabu <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 7e3f3ba commit 92214be

File tree

1 file changed

+16
-4
lines changed
  • drivers/net/ethernet/mellanox/mlx5/core/en

1 file changed

+16
-4
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en/ptp.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ static void mlx5e_ptpsq_mark_ts_cqes_undelivered(struct mlx5e_ptpsq *ptpsq,
177177

178178
static void mlx5e_ptp_handle_ts_cqe(struct mlx5e_ptpsq *ptpsq,
179179
struct mlx5_cqe64 *cqe,
180+
u8 *md_buff,
181+
u8 *md_buff_sz,
180182
int budget)
181183
{
182184
struct mlx5e_ptp_port_ts_cqe_list *pending_cqe_list = ptpsq->ts_cqe_pending_list;
@@ -211,19 +213,24 @@ static void mlx5e_ptp_handle_ts_cqe(struct mlx5e_ptpsq *ptpsq,
211213
mlx5e_ptpsq_mark_ts_cqes_undelivered(ptpsq, hwtstamp);
212214
out:
213215
napi_consume_skb(skb, budget);
214-
mlx5e_ptp_metadata_fifo_push(&ptpsq->metadata_freelist, metadata_id);
216+
md_buff[*md_buff_sz++] = metadata_id;
215217
if (unlikely(mlx5e_ptp_metadata_map_unhealthy(&ptpsq->metadata_map)) &&
216218
!test_and_set_bit(MLX5E_SQ_STATE_RECOVERING, &sq->state))
217219
queue_work(ptpsq->txqsq.priv->wq, &ptpsq->report_unhealthy_work);
218220
}
219221

220-
static bool mlx5e_ptp_poll_ts_cq(struct mlx5e_cq *cq, int budget)
222+
static bool mlx5e_ptp_poll_ts_cq(struct mlx5e_cq *cq, int napi_budget)
221223
{
222224
struct mlx5e_ptpsq *ptpsq = container_of(cq, struct mlx5e_ptpsq, ts_cq);
223-
struct mlx5_cqwq *cqwq = &cq->wq;
225+
int budget = min(napi_budget, MLX5E_TX_CQ_POLL_BUDGET);
226+
u8 metadata_buff[MLX5E_TX_CQ_POLL_BUDGET];
227+
u8 metadata_buff_sz = 0;
228+
struct mlx5_cqwq *cqwq;
224229
struct mlx5_cqe64 *cqe;
225230
int work_done = 0;
226231

232+
cqwq = &cq->wq;
233+
227234
if (unlikely(!test_bit(MLX5E_SQ_STATE_ENABLED, &ptpsq->txqsq.state)))
228235
return false;
229236

@@ -234,14 +241,19 @@ static bool mlx5e_ptp_poll_ts_cq(struct mlx5e_cq *cq, int budget)
234241
do {
235242
mlx5_cqwq_pop(cqwq);
236243

237-
mlx5e_ptp_handle_ts_cqe(ptpsq, cqe, budget);
244+
mlx5e_ptp_handle_ts_cqe(ptpsq, cqe,
245+
metadata_buff, &metadata_buff_sz, napi_budget);
238246
} while ((++work_done < budget) && (cqe = mlx5_cqwq_get_cqe(cqwq)));
239247

240248
mlx5_cqwq_update_db_record(cqwq);
241249

242250
/* ensure cq space is freed before enabling more cqes */
243251
wmb();
244252

253+
while (metadata_buff_sz > 0)
254+
mlx5e_ptp_metadata_fifo_push(&ptpsq->metadata_freelist,
255+
metadata_buff[--metadata_buff_sz]);
256+
245257
mlx5e_txqsq_wake(&ptpsq->txqsq);
246258

247259
return work_done == budget;

0 commit comments

Comments
 (0)