# hp physical-NIC revalidation — 2026-09-30

This is a hardware test of the C++ transport paths, not an A/B verdict on a
latency optimisation or a replacement for the multi-flavour load matrix.

## Provenance and method

- Source for the rebuilt FIX-session binaries: `96f6d487cce53df44385051bdad28164805952c9`.
  GCC 14.2.1, `-O3 -flto=auto -march=native -mtune=native`, profile-free
  (`tuned_build=0`). The installed C++ FIX binaries were replaced from those
  builds, and their hashes matched the build outputs.
- Host: `hp`, Xeon Gold 6254, SMT off, Linux
  `5.14.0-687.44.1.el9_8.x86_64`; isolated server/client cores 8/9. VMA's
  maintenance core is reserved separately as 13 by the hp machine file.
- Solarflare: Onload `dde226d7 2026-08-07`; Mellanox: libvma
  `9.8.80-4.el9`. Both namespace rigs reported link and passed their physical
  port preflight.
- Each of the six arms per card ran serially for three repeats, each with
  20,000 warm-up and 200,000 measured round trips. `ping_pong` and the full
  FIX-session `bench_roundtrip` both ran kernel, preload and native-stack arms.
  Every repeat emitted exactly 200,000 samples. The figures below are the
  median of the three reported per-repeat percentiles, in microseconds; they
  are not percentiles recomputed from pooled raw samples.
- The matrix launcher was repaired before this run. It now fails on missing
  binaries, client errors, missing or short sample rows, and too-small physical
  TX deltas. Its previous post-arm `verify` call sent its *own* ping, so that
  check could pass even if an Onload arm had stayed off the wire. The new check
  brackets **each** arm with physical-port counter reads, excluding the
  verifier's own ping packets.

| Card | Workload | Transport | p50 | p99 | p99.9 | Physical TX delta during arm |
| --- | --- | --- | ---: | ---: | ---: | ---: |
| Solarflare | wire floor | kernel | 11.512 | 12.390 | 13.700 | 1,320,013 |
| Solarflare | wire floor | Onload | 3.504 | 4.055 | 4.199 | 1,320,013 |
| Solarflare | wire floor | TCPDirect | 3.107 | 3.178 | 3.260 | 660,010 |
| Solarflare | FIX session | kernel | 12.790 | 13.646 | 14.461 | 660,019 |
| Solarflare | FIX session | Onload | 4.852 | 5.219 | 5.378 | 660,016 |
| Solarflare | FIX session | TCPDirect | 4.237 | 4.420 | 4.599 | 660,013 |
| Mellanox | wire floor | kernel | 11.087 | 13.500 | 14.689 | 1,320,013 |
| Mellanox | wire floor | VMA | 3.379 | 3.564 | 4.901 | 1,320,013 |
| Mellanox | wire floor | SocketXtreme | 3.339 | 3.922 | 5.306 | 1,320,015 |
| Mellanox | FIX session | kernel | 12.794 | 14.277 | 16.415 | 660,019 |
| Mellanox | FIX session | VMA | 5.470 | 6.024 | 6.212 | 1,320,018 |
| Mellanox | FIX session | SocketXtreme | 5.117 | 5.726 | 7.087 | 1,320,020 |

The counter deltas include the benchmark warm-up and measured traffic, but not
the counter-check pings. These are same-host, separate network namespaces joined
by a DAC. They establish live physical traffic, not cross-host latency.

## Other NIC checks

- Solarflare `test_fix_efvi_live` opened a live VI on `ens5f0`, received five
  multicast UDP payloads from the opposite namespace, and returned a non-zero
  hardware RX timestamp (`997693667112223`). Its sender reported 10,000/10,000
  datagrams sent.
- Mellanox `test_fix_ibv_live` opened a raw-packet QP on `ens4f0np0`, received
  five matching payloads, and returned a non-zero hardware RX timestamp
  (`155891328070331`). Its sender also reported 10,000/10,000 sent.
- The current-source `test_fix_zf_lifecycle_fake` passed, including the case
  that skips packet timestamp lookup after an idle reactor pass. The current-source
  `nictime-recv-test` passed both live receive paths with its 64-byte control
  buffer.

The installed ef_vi/ibverbs test executables were built in August; their source
has not changed since then. The full FIX-session binaries above were freshly
built for this run. The installed `bench-run` dispatcher differed from current
source only in comments during measurement and was refreshed afterwards.

## Historical commands and recovered artifacts

The commands below describe the 2026-09-30 run, which predates the new
session-worktree policy. Future runs must be launched from their own
`~/code/wt/<session>/libhft` checkout, with build products under
`~/build/<session>/libhft` where supported and retained evidence under
`~/archive/libhft/`; the shared `~/code/libhft` checkout is pull-only.

```sh
make -C engine/cpp bench_roundtrip zf_session vma_session
sudo -n /usr/local/sbin/libhft-bench-install bench_roundtrip
sudo -n /usr/local/sbin/libhft-bench-install bench_roundtrip_zf
sudo -n /usr/local/sbin/libhft-bench-install bench_roundtrip_vma_sx
REPS=3 ITERS=200000 WARMUP=20000 RIG_NIC=sfc private/ops/scripts/run-wire-matrix.sh
REPS=3 ITERS=200000 WARMUP=20000 RIG_NIC=mlx5 private/ops/scripts/run-wire-matrix.sh
```

The actual runs set `OUT` to `/tmp`. Those files had disappeared by the time
the workspace was migrated. The two per-repeat CSVs below were reconstructed
from the exact lines captured in the session output and verified against the
SHA-256 values recorded at run time. They are byte-identical to the original
CSVs, but are recovered artifacts, not files moved from `/tmp`.

| Artifact | SHA-256 |
| --- | --- |
| `~/archive/libhft/nic-20260930/libhft-wire-sfc-final-20260930.csv` | `b9c9ddbcc95a990f153e6c5a6b53986862e9018be96b24c604efc2e140353e93` |
| `~/archive/libhft/nic-20260930/libhft-wire-mlx5-final-20260930.csv` | `96b8e9fd3520b4944fe62e9aa60cac3737b58abb85e5ac12716efe3c7065f2e5` |

The full command logs and the sender/receiver logs were **not** recovered.
The original full-log hashes were
`89ab04cad37cce436e999959d7240675cbb81f9e41658c6864b5b2bda736289b`
(Solarflare) and
`a45d939123885d0245b1f2454f7493b2a361a3fc125856c55ae2a8eeca5884a1`
(Mellanox); these identify missing files, not currently available artifacts.

No latency candidate was changed or promoted from this test. Any optimisation
claim needs a pinned before/after build pair, interleaved repeats, raw samples
and a host-interference audit. Java, .NET and Rust NIC load cells were not part
of this C++ transport revalidation.
