Zero Touch RoCE, ZTR-RTT CC and DOCA PCC
S2·E5The line item they refuse to buy · Building D conference room, the Monday after acceptance
Builds on: ECN, CNP and DCQCN: closing the loop
Before you read: what do you already know?
3 quick questions. Wrong answers are fine and expected; trying first makes the lesson stick.
After this lesson you can
- Explain how ZTR-RTT congestion control reacts to measured delay and CNPs and how that differs from a queue-occupancy signal.
- Read the published ZTR-RTT parameter table and justify which parameter to move for a fabric whose base RTT differs from the default.
- Evaluate a customer request to run RoCE without PFC against the verified hardware and firmware floors and state what is not published.
- Judge whether a set of ZTR counters shows a working control loop or an algorithm that is loaded but blind.
Episode 5 — The line item they refuse to buy
The Monday after acceptance, a quote for the second 64-node pod on the table, and a network team that will not deploy PFC on it. They lost a week to pause behaviour they could not explain and will not repeat it. Procurement wants to know only whether the answer changes the bill of materials or the lead time. The question then arrives at you: does NVIDIA have something that needs nothing from the switches?
It does, and it lives on the NIC. Zero Touch RoCE is described as letting data centers deploy RDMA over Converged Ethernet without requiring any special switch configuration, and the mechanism behind that claim is ZTR-RTT CC, a congestion control mechanism within the DOCA Programmable Congestion Control framework.[3][1] It watches measured round-trip time and CNPs, increases additively, decreases multiplicatively, and measures RTT with a hardware-assisted timestamping sequence of four timestamps.[1]
That is why a delay-based algorithm exists beside the loop you repaired at 02:10. ECN needs a switch that was told about RoCE, given a threshold, and given the traffic in the right class; a switch told nothing still adds queueing delay, and delay is a physical consequence of a full buffer rather than a feature anyone enables.[1] The sender measures it end to end and asks nobody’s permission.
On the call the NVIDIA PM answers the obvious question — which cards — with “not announced”, and the pages agree: neither the algorithm page nor the parameter page states supported devices or firmware.[2] Promise the framework’s floor, never the algorithm’s silence.[4] Start with the claim itself.
1The product answer to 'we will not configure PFC'
Zero Touch RoCE is a claim about deployment: it “enables data centers to seamlessly deploy RDMA over Converged Ethernet (RoCE) without requiring any special switch configuration”.[3] The mechanism behind that claim is ZTR-RTT CC, which NVIDIA describes as “a congestion control (CC) mechanism within the DOCA Programmable Congestion Control (PCC) framework”.[1] Everything in this lesson therefore lives on the NIC. If a customer asks which switch feature to enable, the honest answer is none — that is the point.
The algorithm watches two indicators. RTT is the “Real-time measurement of the delay between sending a packet and receiving its acknowledgment”; CNPs are the “Explicit notifications sent by the network or receiver when congestion is encountered”.[1] Rate control is “Additive Increase” and “Multiplicative Decrease”, and the RTT measurement uses “a highly synchronized, hardware-assisted timestamping sequence” with four timestamps: request-send, request-receive, response-send and final-receive.[1] Four timestamps rather than two is what lets the NIC subtract the responder’s own turnaround time and attribute the remainder to the fabric.
Contrast that with the previous lesson’s loop. DCQCN reacts to a switch’s opinion of its own queue, expressed as a CE mark, and requires the switch to be configured with a threshold. ZTR-RTT reacts to a measurement the sender makes itself. A switch that was never told about RoCE will not mark, but it will still add queueing delay, and delay is what ZTR-RTT reads. That is the whole argument for the “zero touch” name.
The published performance framing is from the 2021-12-14 launch blog by Aviv Barnea, Itay Ozery and Barbara Claman: “ZTR-RTTCC extends DCQCN in RoCE networks with a hardware RTT-based congestion control algorithm”, claiming “superb RoCE performance at data center scale, without any special configuration of the switch infrastructure” and without enabling PFC, at 99 percent of conventional RoCE performance at 256 connections and 98 percent of conventional RoCE throughput at over 16,000 connections.[3] Note what the blog does not say: it names no ConnectX generation.[3]
⚠ Model only: a 4 MB TC3 pool at 400 Gb/s (50,000 B/µs). The shape is right; the numbers are not a simulation of your fabric.
1. Sender transmits and timestamps
The NIC starts the hardware timestamp sequence. No switch configuration is involved anywhere in this loop.
The sending NIC. On the host this is the r_roce_ecn_rp algorithm, enabled per priority: echo 1 > /sys/class/net/<if>/ecn/roce_rp/enable/3.
It is the only element that can lower the offered load. Marking and CNPs are worth nothing if the RP never acts: the rate stays flat and the queue keeps growing.
Tooling: Counter: rp_cnp_handled (sender). Read with rdma statistic show link mlx5_0/1, or straight from hw_counters.
FAE angle: when np_cnp_sent climbs on the receiver and rp_cnp_handled stays flat on the sender, stop tuning thresholds. The CNPs are being lost or misclassified on the way back.
- Two host algorithms: r_roce_ecn_rp (reaction point) and r_roce_ecn_np (notification point), per device/port/priority
- ⚠ np_cnp_sent = CNPs sent by the notification point after seeing CE; rp_cnp_handled = CNPs handled by the reaction point to throttle — not confirmed on a fetched NVIDIA page
- Every current NVIDIA ECN page ends the parameter section with the literal string "requested attributes: Next Slide" — the tables were lost converting slides to docs
np_ecn_marked_roce_packetsflatreceiver · hw_counters — CE seen in the RoCEv2 IP header. Flat while the queue is deep = the switch is not marking your queue.cat /sys/class/infiniband/mlx5_0/ports/1/hw_counters/np_ecn_marked_roce_packets
np_cnp_sentflatreceiver · hw_counters — CNPs the notification point put back on the wire, DSCP 48 / priority 6.cat /sys/class/infiniband/mlx5_0/ports/1/hw_counters/np_cnp_sent
rp_cnp_handledflatsender · hw_counters — CNPs the reaction point acted on. Moves on a different host from np_cnp_sent — read both.cat /sys/class/infiniband/mlx5_0/ports/1/hw_counters/rp_cnp_handled
rp_cnp_ignoredflatsender · hw_counters — CNPs that arrived and were dropped on the floor — r_roce_ecn_rp is not enabled for this priority.cat /sys/class/infiniband/mlx5_0/ports/1/hw_counters/rp_cnp_ignored
rx_prio3_pauseflatsender · ethtool -S — The switch is pausing you on priority 3. Direction identifies the victim.ethtool -S <if> | grep -E "prio3_pause"
tx_prio3_pauseflatreceiver · ethtool -S — You pausing the network. Flat here: the receiver NIC is not the bottleneck in this scenario.ethtool -S <if> | grep -E "prio3_pause"
packet_seq_errflatsender · hw_counters — The fabric dropped or reordered RoCE. On a lossless design this number should stay at zero.cat /sys/class/infiniband/mlx5_0/ports/1/hw_counters/packet_seq_err
rx_prio3_buf_discardflatreceiver · ethtool -S — Packets discarded for lack of per-host receive buffers on priority 3.ethtool -S <if> | grep -E "prio3_(buf_)?discard"
ZTR_CC_NUM_RTTmovingsender · PPCC (mlxreg) — RTT measurements taken. Flat = the algorithm is loaded but blind; you are running open loop.mlxreg -d <dev> -y --set "cmd_type=12" --reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=1,algo_param_index=10"
ZTR_CC_DEC_COUNTERflatsender · PPCC (mlxreg) — Multiplicative decreases. Moves when the measured RTT passes CONGESTION_DELAY_THRESHOLD.mlxreg -d <dev> -y --set "cmd_type=12" --reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=1,algo_param_index=4"
ZTR_CC_RTT_TIMEOUT_COUNTERflatsender · PPCC (mlxreg) — RTT probe timeouts. Non-zero means probes are being lost — suspect the return path.mlxreg -d <dev> -y --set "cmd_type=12" --reg_name PPCC --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=1,algo_param_index=15"
Congestion control inside the NIC: hardware-timestamped RTT plus CNPs, additive increase / multiplicative decrease. It reacts to measured delay, so it needs nothing from the fabric.
mlxconfig -d <dev> s USER_PROGRAMMABLE_CC=1 PCC_INT_EN=0 \ FLEX_PARSER_PROFILE_ENABLE=10 REAL_TIME_CLOCK_ENABLE=1 ROCE_CC_RTT_TIMESTAMP_FORMAT=2 mlxconfig -d <dev> q | grep -E "USER_PROGRAMMABLE_CC|ROCE_CC"
Queue is shallow; no mechanism has anything to do yet. Raise the offered load.
Cumulus RoCE (NVUE) · ECN sysfs · ZTR-RTT parameters · mlx5 counters · rdma statistic
2The parameter table, and how to reason about it
NVIDIA publishes seventeen parameters, indexes 0 through 16. The ones that matter for a tuning conversation, re-read on 2026-09-07:[2]
| Index | Name | Units | Default | Documented tuning range |
|---|---|---|---|---|
| 0 | BW_G - NIC port bandwidth |
Gb/s | Auto config by device bandwidth | Auto config by device bandwidth (valid range 100-800) |
| 1 | ALPHA - RTT target factor |
fxp16 | 6553 (0.1) | 0 to 2^16 |
| 2 | MAX_DEC - maximal multiplicative decrement |
fxp16 | 63570 (0.97) | 45875-64880 |
| 3 | MAX_INC |
fxp16 | 69468 (1.06) | 2^16 to 2^18 |
| 4 | AI - additive increase |
Bytes per 100 Gb/s | 9 | 5-100 |
| 5 | HAI - hyper additive increase |
Bytes per 100 Gb/s | 300 | 200-2000 |
| 6 | HAI_PERIOD_NS - period without any decrement |
ns | 7000000 | 100 us to 20 ms |
| 7 | CONGESTION_DELAY_THRESHOLD - react only above this MIN RTT |
ns | 15000 | 2 us to 15 us |
| 8 | MAX_DELAY - react more aggressively above this |
ns | 250000 | 30 us to 1 ms |
| 9 | RATE_ON_FIRST_CONGESTION |
fxp20 | 65536 (0.0625) | 10485 to 2^20 |
| 10 | DELAY_ONLY - use only RTT as congestion indication |
boolean | 0 | 0 |
| 11 | CNP_VLD_RTT - CNP validates the RTT measurement |
boolean | 0 | 0 or 1 |
| 12 | TX_DEC - react in TX events on measured delay |
boolean | 1 | 0 or 1 |
| 15 | TOPOLOGY_AWARE - compare RTT to the minimum measured RTT |
boolean | 0 | 0 or 1 |
Two of these carry the whole tuning story. CONGESTION_DELAY_THRESHOLD is the floor below which measured delay is treated as the fabric’s baseline rather than as congestion; its default of 15000 ns is 15 microseconds, and its documented tuning range starts at 2 microseconds.[2] On a tight single-rail fabric whose base RTT is a few microseconds, a 15-microsecond floor means the algorithm tolerates queues several times the fabric’s own latency before it does anything — which is a defensible default for a large multi-tier network and a poor one for a small tight pod. MAX_DELAY, at 250000 ns, is the point above which the algorithm reacts more aggressively.[2]
TOPOLOGY_AWARE is the parameter that makes the threshold question partly self-solving, since it compares measured RTT to the minimum RTT the NIC has actually observed rather than to a fixed number.[2] It defaults to off, so on a fabric with a base RTT far from the default you are choosing between moving the threshold and turning this on.
3Reading it: PPCC, cmd_type, and the counters that say blind
Everything is read and written through one firmware register, PPCC, with mlxreg. Setting a parameter:[2]
mlxreg -d <dev> -y --set "cmd_type=8,value=<parameter value>" --reg_name PPCC \
--indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=1,algo_param_index=<parameter index>"The counters are a debug-mode facility, so the session has a shape. Enable debug mode and counters with cmd_type=1,counter_en=1, reset with cmd_type=13, query with cmd_type=12, all on algo_slot=1; a separate cmd_type=2 on algo_slot=0 disables deployment mode.[2] The mt4129 in NVIDIA’s examples is a ConnectX-7 MST device id — substitute your own from sudo mst status -v.[2]
sudo mlxreg -d /dev/mst/mt4129_pciconf0 -y --set "cmd_type=1,counter_en=1" --reg_name PPCC \
--indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=1,algo_param_index=0"Sixteen counters are published. The rate-action group is ZTR_CC_CNP_HANDLE_COUNTER, ZTR_CC_NACK_HANDLE_COUNTER, ZTR_CC_AI_INC_COUNTER, ZTR_CC_HAI_INC_COUNTER, ZTR_CC_DEC_COUNTER, ZTR_CC_HYPER_DEC_COUNTER and ZTR_CC_TX_DEC_COUNTER.[2] The measurement group is ZTR_CC_MAX_RTT, ZTR_CC_MIN_RTT, ZTR_CC_SUM_RTT, ZTR_CC_NUM_RTT and ZTR_CC_NOT_VLD_RTT_COUNTER.[2] The rate and diagnostic group is ZTR_CC_MAX_RATE, ZTR_CC_MIN_RATE, ZTR_CC_EMPTY_SYS_RTT_COUNTER for global minimum RTT detections and ZTR_CC_RTT_TIMEOUT_COUNTER for RTT probe timeouts.[2]
The diagnosis that matters is the blind state. If ZTR_CC_NUM_RTT is flat, the algorithm is taking no measurements; if ZTR_CC_RTT_TIMEOUT_COUNTER is also flat, probes are not being sent rather than failing. A loaded algorithm with no RTT input is running open-loop on whatever CNPs happen to arrive, which is the one configuration strictly worse than either DCQCN or ZTR-RTT alone — you have given up the switch-side threshold and gained no delay signal.[2] The counter that says the opposite — a healthy loop — is ZTR_CC_NUM_RTT climbing with a plausible ZTR_CC_MIN_RTT and a non-trivial ZTR_CC_DEC_COUNTER under load.
4The framework underneath, and its verified floor
ZTR-RTT is one algorithm inside DOCA PCC, and PCC is where the verified support statements live. “The DOCA PCC library offers a high-level programming interface that enables users to implement customized congestion control (CC) algorithms”; “DOCA PCC-based applications can run on either the host machine or the NVIDIA BlueField-3 Platform (or later) target”; “Currently, DOCA PCC is supported only for the ETHERNET link type”; and “The library requires firmware version 32.38.1000 and higher.”[4] Two mode rules ride along and matter in a Dell lab: for BlueField-3 in DPU mode the NP process may not be executed on the x86 host, and running from an x86 host in NIC mode requires privileged permissions.[4] Two roles are modelled, matching the DCQCN vocabulary from the previous lesson: the Reaction Point “Monitors network conditions actively, dynamically adjusting data transmission rates”, with RP context global per NIC; the Notification Point “Passively receives congestion notifications from external sources”, with NP context global per e-switch owner.[4]
The firmware prerequisites are mlxconfig settings, staged for next boot:[4][6]
mlxconfig -d <mlx_device> -y s USER_PROGRAMMABLE_CC=1 # RP: enable programmable CC
mlxconfig -d <mlx_device> -y s PCC_INT_EN=0 # NP: disable the legacy notification point
mlxconfig -d <mlx_device> -y s REAL_TIME_CLOCK_ENABLE=1 # RP and NP: real-time-clock timestamps
mlxconfig -d <mlx_device> -y s ROCE_CC_RTT_TIMESTAMP_FORMAT=2 # RP: RTC timestamp format
mlxconfig -d <mlx_device> -y s FLEX_PARSER_PROFILE_ENABLE=10 # NP: response timestamp injectionThe two timestamp settings are what make ZTR-RTT’s RTT probes measurable, so a card missing them is the loaded-but-blind case in segment 3; all five are staged for next boot and NVIDIA requires a graceful shutdown then a power cycle.[4]
Custom algorithms are built with DPACC, which “compiles and links user algorithms and device code with the DOCA PCC device library to create loadable applications”, and the device code runs on the DPA while a host library manages the context.[4] For an FAE the relevant point is not that you will write one, but that ZTR-RTT is delivered through the same machinery a customer could use to write their own — which is what “programmable” means in the product name.
Now the honest gap. Neither the ZTR-RTT algorithm page nor the parameter page states supported devices or a minimum firmware version, re-checked on 2026-09-07.[2][1] The only verified floor is PCC’s, above, and it belongs to the framework. Extending “BlueField-3 or later” silently to a ConnectX part, in either direction, is an unsupported claim; the correct move in front of a customer is to read their cards.
The strongest available evidence that NVIDIA ships this by default on Spectrum-X hosts is circumstantial but specific. The NIC Configuration Operator’s Spectrum-X profile sets programmable congestion control true and DCQCN false, with CC slot 0 parameters of bandwidth 400, responsiveness alpha 6553, maximum decrease factor 63570, base round-trip time 15000 and maximum queuing delay 250000.[5] Those four values are exactly the published defaults for ALPHA, MAX_DEC, CONGESTION_DELAY_THRESHOLD and MAX_DELAY.[2] The same profile sets trust dscp, a ToS of 96 and a PFC bitmap of "00010000".[5]
| Product | Speed | PCIe | Role | GPU generation |
|---|---|---|---|---|
NIC | ||||
SuperNIC (no Arm) | ||||
SuperNIC (no Arm) | ||||
DPU | ||||
DPU | ||||
SuperNIC (Arm inactive) | ||||
DPU / storage processor | ||||
Ethernet switch | ||||
Ethernet switch | ||||
InfiniBand switch | ||||
InfiniBand switch |
⚠ = not confirmed on a fetched primary source (hover for why). Facts as of DOCA 3.5.0 (Sep 2026). Selections are saved.
Request: a Dell OEM customer building a 64-node Ethernet AI pod says their network team will not deploy PFC. They want a written recommendation.
- Separate the three claims in the request. “No PFC on the switch” is a fabric decision; “RoCE still works” is a NIC capability question; “no special switch configuration” is NVIDIA’s Zero Touch RoCE claim.[3] Answer them in that order and do not let the first drag the other two along.
- Establish what you can support. The verified floor is DOCA PCC’s: BlueField-3 or later, Ethernet link type only, firmware 32.38.1000 and higher.[4] Record explicitly that NVIDIA publishes no supported-device or firmware statement for the ZTR-RTT algorithm itself, so any claim beyond the PCC floor is yours, not the vendor’s.[2]
- Inventory the customer’s hardware before writing anything:[6][4]
Expected on an unprepared host:sudo mst status -v sudo mlxconfig -d /dev/mst/<mtdev>_pciconf0 q | grep -E "USER_PROGRAMMABLE_CC|PCC_INT_EN|REAL_TIME_CLOCK_ENABLE|ROCE_CC_RTT_TIMESTAMP_FORMAT|FLEX_PARSER_PROFILE_ENABLE|ROCE_CC"USER_PROGRAMMABLE_CCfalse. That is a next-boot change, so the recommendation carries a reboot. - State what they still have to configure even in the zero-touch case. Two things do not go away: the marking chain, because traffic still has to land in a class the fabric treats sensibly, and the CNP path, because ZTR-RTT uses CNPs as its second indicator.[1] A fabric with no RoCE configuration at all still has a default queue, and NVIDIA’s own switch defaults put RoCE on DSCP 26 / priority 3 and CNP on DSCP 48 / priority 6 for good reasons.[7]
- Give them a measurable acceptance test rather than a promise. Enable debug counters, reset, run the 64-node job, query:[2]
Acceptance:sudo mlxreg -d /dev/mst/<mtdev>_pciconf0 -y --set "cmd_type=1,counter_en=1" --reg_name PPCC \ --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=1,algo_param_index=0" sudo mlxreg -d /dev/mst/<mtdev>_pciconf0 -y --set "cmd_type=13" --reg_name PPCC \ --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=1,algo_param_index=0" # run the workload, then: sudo mlxreg -d /dev/mst/<mtdev>_pciconf0 -y --set "cmd_type=12" --reg_name PPCC \ --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=1,algo_param_index=0"ZTR_CC_NUM_RTTclimbing, a plausibleZTR_CC_MIN_RTT, andZTR_CC_DEC_COUNTERnon-zero under load. Failure signature:ZTR_CC_NUM_RTTandZTR_CC_RTT_TIMEOUT_COUNTERboth flat - loaded but blind.[2] - Offer one tuning lever with its justification, not a parameter sweep. If the pod’s measured
ZTR_CC_MIN_RTTis far below 15 microseconds, either lowerCONGESTION_DELAY_THRESHOLDtoward the documented 2-microsecond end of its range, or enableTOPOLOGY_AWAREso the comparison is against measured minimum RTT instead of a constant.[2] - Write the caveats into the recommendation: the published scaling numbers are from a 2021 blog and name no hardware generation, and the “ships by default on Spectrum-X” reading rests on a NIC profile that sets DCQCN false with ZTR-RTT default values rather than on a direct statement.[3][5]
- Split the request into three claims: a ____ decision, a ____ capability question, and NVIDIA’s ____ claim.
- Verified floor comes from ____ : BlueField-____ or later, ____ link type only, firmware ____ and higher. The algorithm pages state ____ about devices and firmware.
- Inventory:
sudo mst status -v, thenmlxconfig -d <dev> q | grep -E "____|PCC_INT_EN|FLEX_PARSER_PROFILE_ENABLE". A change here takes effect on ____ . - Still required even with zero touch: the ____ chain and the ____ return path, because the algorithm uses CNPs as its second indicator.
- Acceptance test:
cmd_type=____with counter_en=1 to enable,cmd_type=____to reset, run the job,cmd_type=____to query. Pass if____climbs; fail if it andZTR_CC_RTT_TIMEOUT_COUNTERare both ____ . - One lever: lower
____toward 2 microseconds, or enable____so the comparison is relative. - Caveats: the scaling numbers come from a ____ blog naming no hardware generation, and the default-on-Spectrum-X reading is ____ rather than stated.
A second Dell customer is further along. They already run ZTR-RTT on BlueField-3 hosts with USER_PROGRAMMABLE_CC=1, no PFC anywhere, and a Cumulus fabric left at NVUE defaults. Their symptom: at 32 nodes throughput is good, at 64 it drops by a third, ZTR_CC_NUM_RTT is climbing healthily, ZTR_CC_DEC_COUNTER is climbing, and ZTR_CC_CNP_HANDLE_COUNTER is near zero. ZTR_CC_MIN_RTT reads about 4 microseconds.
Write the evaluation and the change plan. Acceptance criteria: (a) explain what a near-zero CNP handle count means given that the fabric is at NVUE defaults, and whether it is a fault; (b) argue from the parameter table which single parameter is most likely mis-fitted to a 4-microsecond fabric and give its default its units and the tuning range you would move within; (c) name the alternative to changing that parameter and say when you would prefer it; (d) state which piece of your recommendation is not supported by any NVIDIA-published device or firmware statement and how you will caveat it; (e) give the mlxreg command shape you would use to make the change and the counter comparison that would prove or disprove it.
Episode 5 — What goes in the recommendation
You read their cards rather than the slide: mlxconfig query for the programmable-CC and timestamp settings, then the debug counters under load.[6][2] ZTR_CC_NUM_RTT climbing with a plausible ZTR_CC_MIN_RTT is a working loop; both RTT counters flat is an algorithm loaded but blind, which is worse than the PFC design they were avoiding.[2] The recommendation ships with the verified floor written into it — the framework’s, not the algorithm’s — and phase two is signed with a reboot in the plan.[4] The notebook ends with a section titled “things that were never the switch”, five entries long, and the operator tapes one last label to the rack door: MARKED, TRUSTED, PAUSED, SIGNALLED, MEASURED.
Lab
Goal: on the Dell-lab BlueField-3 or ConnectX host, inventory the PCC prerequisites and run one counter session. Steps 4 and 5 are mutating; both name their rollback, and the firmware step captures a full restore point first.
- Pre-flight, read-only:
Expected: the full query captured to a file - this is the restore point for anything firmware-level - and the four settings visible with their current values.[6][4] Ifsudo mst status -v ibdev2netdev sudo mlxconfig -d /dev/mst/<mtdev>_pciconf0 q | tee /tmp/mlxconfig-full-before.txt grep -E "USER_PROGRAMMABLE_CC|PCC_INT_EN|REAL_TIME_CLOCK_ENABLE|ROCE_CC_RTT_TIMESTAMP_FORMAT|FLEX_PARSER_PROFILE_ENABLE|ROCE_CC" /tmp/mlxconfig-full-before.txtUSER_PROGRAMMABLE_CCis absent from the query, this card or firmware does not expose PCC and the rest of the lab is read-only reasoning. - Record the hardware against the verified floor. Note the device generation and firmware and compare to DOCA PCC’s stated BlueField-3-or-later, Ethernet-only, firmware 32.38.1000-and-higher.[4] Write down whether the host is inside the floor - and write down that the algorithm pages add no floor of their own.[2]
- Read-only PPCC query to confirm the register is reachable before changing anything:[2]
Expected: a counter block, or an error naming the slot. An error here means step 4 will not work and the cause is above it.sudo mlxreg -d /dev/mst/<mtdev>_pciconf0 -y --set "cmd_type=12" --reg_name PPCC \ --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=1,algo_param_index=0" - Mutating - enable debug mode and counters. Rollback:
cmd_type=1withcounter_en=0on the same indexes, orcmd_type=2onalgo_slot=0to leave deployment mode as you found it; either way re-run the step-3 query afterwards to confirm the state.[2]sudo mlxreg -d /dev/mst/<mtdev>_pciconf0 -y --set "cmd_type=1,counter_en=1" --reg_name PPCC \ --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=1,algo_param_index=0" sudo mlxreg -d /dev/mst/<mtdev>_pciconf0 -y --set "cmd_type=13" --reg_name PPCC \ --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=1,algo_param_index=0" - Generate load and query. Server
ib_write_bw -d mlx5_0 -b -q 8 --tclass=104; clientib_write_bw -d mlx5_0 -b -q 8 --tclass=104 <server-ip>- if the client aborts with a parameter-mismatch error, the two command lines differ, and perftest states that mode-specific options (-b,-q,-c,-m) must be identical on both sides.[11] Then:[2]
Expected on a working loop:sudo mlxreg -d /dev/mst/<mtdev>_pciconf0 -y --set "cmd_type=12" --reg_name PPCC \ --indexes "local_port=1,pnat=0,lp_msb=0,algo_slot=1,algo_param_index=0"ZTR_CC_NUM_RTTnon-zero with a plausibleZTR_CC_MIN_RTT. FlatZTR_CC_NUM_RTTtogether with flatZTR_CC_RTT_TIMEOUT_COUNTERmeans the algorithm is loaded but blind - record it as a finding rather than tuning around it.[2] - Firmware-level changes are out of scope for this lab unless a maintenance window exists. If one does: the full
mlxconfigquery from step 1 is the restore point, every change is staged for next boot, and the reset path ismlxfwreset -d <dev> -l 3 -y ror a power cycle.[6] Never make aUSER_PROGRAMMABLE_CCchange without that captured query and a named rollback command. - Close out: restore debug mode to its step-1 state, re-run the step-3 read-only query, and confirm
mlxconfig -d <dev> qstill matches/tmp/mlxconfig-full-before.txt.
Goal: reason about ZTR-RTT with no hardware. Entirely paper and simulator.
- Comparative run in the interactive. Set the same offered load and run mechanism
ecn, thenztr. Write one sentence each on where the reaction is triggered and what the sender knows at that moment. Expected: ECN reacts after the switch’s configured threshold on a class the traffic must be in; ZTR-RTT reacts on delay the sender measured itself, which needs no switch configuration.[1][7] - Tuning exercise. Given a fabric whose measured minimum RTT is 4 microseconds, state which parameter is mis-fitted, its default and units, and the documented tuning range you would move inside.[2] Expected:
CONGESTION_DELAY_THRESHOLD, default 15000 ns, tuning range 2 to 15 microseconds - the default tolerates nearly four times the fabric’s own baseline before reacting. - Alternative lever. Explain when you would enable
TOPOLOGY_AWAREinstead of moving the threshold, and what it changes about the comparison.[2] Expected: it compares RTT against the minimum measured RTT rather than a constant, which is the better answer when the same image ships to fabrics of different diameters. - Read the transcripts and name each
cmd_type:[2]
Expected: A sets parameter index 7 to 4000 ns; B enables debug mode with counters; C resets counters; D queries counters; E disables deployment mode on slot 0.A: --set "cmd_type=8,value=4000" ... algo_slot=1,algo_param_index=7 B: --set "cmd_type=1,counter_en=1" ... algo_slot=1,algo_param_index=0 C: --set "cmd_type=13" ... algo_slot=1,algo_param_index=0 D: --set "cmd_type=12" ... algo_slot=1,algo_param_index=0 E: --set "cmd_type=2" ... algo_slot=0,algo_param_index=0 - Support-boundary drill. Write the two sentences you would put in a customer email: one stating the verified DOCA PCC floor, one stating precisely what NVIDIA does not publish about the algorithm.[4][2] Compare against the FAE framing in segment 4.
Retrieval check
10 questions from memory. Answer before looking anything up; misses become flashcards.
Explain it to a Dell SE
A Dell customer says they will not configure PFC on their fabric. Explain in five sentences what NVIDIA offers instead, what it actually measures, and the one thing you must confirm before you promise it will work on their hardware.
Sources
Facts in this lesson were checked against ZTR-RTT CC Parameter and Counter Configuration page re-fetched 2026-09-07 (17 parameters, 16 counters, mlxreg cmd_type 1/2/8/12/13; page states no supported devices or firmware), DOCA PCC page re-fetched 2026-09-07 (BlueField-3 or later, ETHERNET only, firmware 32.38.1000 and higher), NIC Configuration Operator Spectrum-X profile re-fetched 2026-09-07. Dates are when each page was fetched.
- ZTR-RTT CC Algorithm - DOCA 3.5.0 · fetched 2026-09-07 · DOCA 3.5.0
- ZTR-RTT CC Parameter and Counter Configuration - DOCA-Host · fetched 2026-09-07 · DOCA 3.5.0
- Scaling Zero Touch RoCE Technology with Round Trip Time Congestion Control (NVIDIA Technical Blog) · fetched 2026-09-07
- DOCA PCC (Programmable Congestion Control) - DOCA-Host · fetched 2026-09-07 · DOCA 3.5.0
- Spectrum-X Configuration - NVIDIA NIC Configuration Operator · fetched 2026-09-07
- Using mlxconfig - NVIDIA Firmware Tools (MFT) 4.36.0 · fetched 2026-09-07
- RDMA over Converged Ethernet - RoCE (Cumulus Linux 5.18) · fetched 2026-09-07
- NVIDIA Spectrum-X Ethernet Platform (product page) · fetched 2026-09-07
- Ethernet Network - NVIDIA WinOF-2 v25.7.50000 (RttResponseDscp) · fetched 2026-09-07
- RDMA over Converged Ethernet (DOCA-Host) - generated PDF · fetched 2026-09-07 · DOCA 3.5.0
- perftest(1) man page (linux-rdma/perftest master) · fetched 2026-09-07
The same idea elsewhere
Other lessons that cover this ground, sometimes from another course's angle.