Skip to content

Commit 78387a8

Browse files
tbv: data-credit leak reconciliation counters (localize 768-window stall)
The credit-return threshold fix is a no-op at the default window (768), so a hang there is a slow leak (consumed-but-never-returned), not batch withholding. Add two atomic64 counters per path and globally, exposed in debugfs: data_tx_credit_consumed - every data frame charged a credit (TX charge site) data_rx_credit_eligible - every received credit-consuming frame (RX) Reconciliation: across a link, sender consumed == receiver eligible; locally, eligible == credit_sent + rx_credit_pending. A persistent gap localizes the leak (transit loss -> consumed > peer eligible; return-side drop -> eligible > sent+pending). Read on 021/022 after a 16K ping-pong stall.
1 parent c1ab69d commit 78387a8

3 files changed

Lines changed: 37 additions & 2 deletions

File tree

drivers/thunderbolt_ibverbs/kernel/debugfs.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,10 @@ static int tbv_debugfs_summary_show(struct seq_file *s, void *unused)
193193
atomic64_read(&state->data_tx_credit_stalls));
194194
seq_printf(s, "data_tx_credit_received: %lld\n",
195195
atomic64_read(&state->data_tx_credit_received));
196+
seq_printf(s, "data_tx_credit_consumed: %lld\n",
197+
atomic64_read(&state->data_tx_credit_consumed));
198+
seq_printf(s, "data_rx_credit_eligible: %lld\n",
199+
atomic64_read(&state->data_rx_credit_eligible));
196200
seq_printf(s, "data_rx_completed: %lld\n",
197201
atomic64_read(&state->data_rx_completed));
198202
seq_printf(s, "data_rx_credit_sent: %lld\n",
@@ -400,12 +404,13 @@ static int tbv_debugfs_peers_show(struct seq_file *s, void *unused)
400404
rail->remote_tx_hop,
401405
rail->remote_rx_hop);
402406
seq_printf(s,
403-
" data_tx_enqueued=%lld data_tx_posted=%lld data_tx_completed=%lld data_tx_credit_stalls=%lld data_tx_credit_received=%lld tx_credits=%u/%u\n",
407+
" data_tx_enqueued=%lld data_tx_posted=%lld data_tx_completed=%lld data_tx_credit_stalls=%lld data_tx_credit_received=%lld data_tx_credit_consumed=%lld tx_credits=%u/%u\n",
404408
atomic64_read(&rail->path.data_tx_enqueued),
405409
atomic64_read(&rail->path.data_tx_posted),
406410
atomic64_read(&rail->path.data_tx_completed),
407411
atomic64_read(&rail->path.data_tx_credit_stalls),
408412
atomic64_read(&rail->path.data_tx_credit_received),
413+
atomic64_read(&rail->path.data_tx_credit_consumed),
409414
rail->path.tx_remote_data_credits,
410415
rail->path.tx_remote_data_credit_max);
411416
seq_printf(s,
@@ -425,9 +430,10 @@ static int tbv_debugfs_peers_show(struct seq_file *s, void *unused)
425430
rail->path.cfg.sof_mask,
426431
rail->path.cfg.eof_mask);
427432
seq_printf(s,
428-
" data_rx_completed=%lld data_rx_credit_sent=%lld data_rx_credit_send_error=%lld data_rx_repost_failed=%lld rx_credit_pending=%u\n",
433+
" data_rx_completed=%lld data_rx_credit_sent=%lld data_rx_credit_eligible=%lld data_rx_credit_send_error=%lld data_rx_repost_failed=%lld rx_credit_pending=%u\n",
429434
atomic64_read(&rail->path.data_rx_completed),
430435
atomic64_read(&rail->path.data_rx_credit_sent),
436+
atomic64_read(&rail->path.data_rx_credit_eligible),
431437
atomic64_read(&rail->path.data_rx_credit_send_error),
432438
atomic64_read(&rail->path.data_rx_repost_failed),
433439
rail->path.rx_data_credit_pending);

drivers/thunderbolt_ibverbs/kernel/path.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -987,6 +987,12 @@ static void tbv_path_rx_complete(struct tb_ring *ring, struct ring_frame *frame,
987987
atomic64_inc(&state->data_rx_bad_frame);
988988
}
989989

990+
if (return_rx_credits) {
991+
if (state)
992+
atomic64_inc(&state->data_rx_credit_eligible);
993+
atomic64_inc(&path->data_rx_credit_eligible);
994+
}
995+
990996
if (path->state == TBV_PATH_RING_STARTED ||
991997
path->state == TBV_PATH_TUNNEL_ENABLED) {
992998
int ret = tbv_path_post_rx_frame(f);
@@ -1864,6 +1870,9 @@ static void tbv_path_schedule_tx(struct tbv_path *path)
18641870
}
18651871
path->tx_remote_data_credits--;
18661872
charged_data_credit = true;
1873+
if (state)
1874+
atomic64_inc(&state->data_tx_credit_consumed);
1875+
atomic64_inc(&path->data_tx_credit_consumed);
18671876
}
18681877
packet->start_credit_group_frames = 0;
18691878

drivers/thunderbolt_ibverbs/kernel/tbv.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,16 @@ struct tbv_path {
218218
atomic64_t control_tx_queue_max_ms;
219219
atomic64_t data_tx_credit_stalls;
220220
atomic64_t data_tx_credit_received;
221+
/*
222+
* Leak reconciliation for the software data-credit window. Across a link
223+
* the sender's consumed (every charged data frame) must equal the
224+
* receiver's eligible (every received credit-consuming frame); locally
225+
* the receiver's eligible must equal credit_sent + rx_data_credit_pending.
226+
* A persistent divergence localizes a credit leak (frames lost in transit
227+
* -> consumed > peer eligible; return-side drop -> eligible > sent+pending).
228+
*/
229+
atomic64_t data_tx_credit_consumed;
230+
atomic64_t data_rx_credit_eligible;
221231
atomic64_t data_rx_completed;
222232
atomic64_t data_rx_credit_sent;
223233
atomic64_t data_rx_credit_send_error;
@@ -578,6 +588,16 @@ struct tbv_state {
578588
atomic64_t data_tx_errors;
579589
atomic64_t data_tx_credit_stalls;
580590
atomic64_t data_tx_credit_received;
591+
/*
592+
* Leak reconciliation for the software data-credit window. Across a link
593+
* the sender's consumed (every charged data frame) must equal the
594+
* receiver's eligible (every received credit-consuming frame); locally
595+
* the receiver's eligible must equal credit_sent + rx_data_credit_pending.
596+
* A persistent divergence localizes a credit leak (frames lost in transit
597+
* -> consumed > peer eligible; return-side drop -> eligible > sent+pending).
598+
*/
599+
atomic64_t data_tx_credit_consumed;
600+
atomic64_t data_rx_credit_eligible;
581601
atomic64_t data_rx_completed;
582602
atomic64_t data_rx_credit_sent;
583603
atomic64_t data_rx_credit_send_error;

0 commit comments

Comments
 (0)