Skip to content

Reviving at the end of a receive pass, on the XGS 136: no difference, 2026-10-27

717: a stream whose data comes from the far side still went through the XGS 136's host for part of some runs. The page of 2026-10-24 named what to try next (revive-hold-136-2026-10-24.md): reviving a connection at the end of a receive pass, with few frames in the host's path, since one revived from inside a pass overtakes the frames still in it. It was built and measured, and it made no difference.

What was built

npuep.ko 63408083, built from the branch npuep-717-revive-after-batch, which is not merged. npuflow_cand_push, called for every punted frame, no longer kicks the let-go pass itself. It marks the kick wanted, and npuflow_rx_done, called once a pass has handed its frames up, gives it - and only if the pass left the rings empty. A sysctl, flow.revive_after, chose between that (1) and the kick from inside the pass as before (0), so one build measured both.

How it was measured

As on 2026-10-24 (images/deploy/lab-717b.sh, made from lab-717.sh): a 15-second iperf3 stream with the data from the far side - the second XGS 3300 behind the XGS 136's Port8 sending - with the setting in turn, each run's pf states killed first, and the XGS 136's fast-path and driver counters read across each run. One change of bench: the PC's end was on the XGS 136's F1, routed, at 1 Gbit/s. Its Port3, bridged, which the runs of 2026-10-24 used, now links at 100 Mbit/s. Two sets of 16 runs made over it first, at 95 Mbit/s, never met a give-back to speak of, and are left out.

The far side sending, the setting in turn

Sixteen runs, flow.revive_after 0 and 1 in turn, the PC on the XGS 136's F1: 246 to 551,446 frames to the host either way, 904 to 949 Mbit/s, kicks kept 0 in every run

Sixteen more, the same: 3,921 to 528,923 frames to the host either way, kicks kept 0 in every run

flow.revive_after runs frames to the host, mean median runs above 300,000 revivals processors, mean rate, mean
0, the kick from inside the pass 16 234,415 175,741 6 43 6.0 % 933 Mbit/s
1, the kick at the pass's end 16 239,122 145,290 7 56 6.6 % 933 Mbit/s

No difference. And kicks kept was 0 in all 32 runs: every pass that asked for a kick ended with the rings empty, so the change only moved the kick to the end of passes that were short anyway.

What the runs show instead

Every run that sent the host 300,000 frames or more had both directions of its connection taken out and held (held 2). Given back under a new identity soon after it was made, a connection is taken out and stays with the host for a wait, a second doubling each time (npuflow_letgo, NPUFLOW_REMAKE_WAIT_MIN). At 930 Mbit/s a stream is about 78,000 frames a second, so a wait of one second and then two would account for the mean above; that is arithmetic, not a measurement of the waits. The rule came in on 2026-10-19 because making such a connection again at once gave it back again (xgs136-giveback-2026-10-19.md). A shorter first wait is what to measure next. The branch is not merged, and 717 stays open.

Discussion

The discussion of this page is held in the project's GitHub Discussions. Showing it here loads giscus from giscus.app and GitHub, and writing in it needs a GitHub account - what that means.