Skip to content

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

S2·E5Evaluate~35 minsources checked todaylab mutates hardwareverified 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

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 situation · Building D conference room, the Monday after acceptance

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]

switch untouched
RoCEv2 · UDP 4791RTT probe ↔ four hardware timestampsRP · sender NICr_roce_ecn_rpCP · switch TC3 queuepriority 3 · DSCP 26NP · receiver NICr_roce_ecn_npNeighbour flow, priority 3paused too — head-of-line blocking25,000 B · 0.5 µs queuing delay
stage 1 / 4
no CE markingno pauseno losssender did not reactgoodput ≈ 90% ⚠

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.

ZTR-RTT (NIC-side) · stage 1 of 4

1. Sender transmits and timestamps

The NIC starts the hardware timestamp sequence. No switch configuration is involved anywhere in this loop.

Reaction Point (RP) — sender NIC

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.

Counters — which one is still moving?
  • np_ecn_marked_roce_packetsflatreceiver · hw_countersCE 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_countersCNPs 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_countersCNPs 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_countersCNPs 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 -SThe switch is pausing you on priority 3. Direction identifies the victim.
    ethtool -S <if> | grep -E "prio3_pause"
  • tx_prio3_pauseflatreceiver · ethtool -SYou 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_countersThe 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 -SPackets 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"
ZTR-RTT (NIC-side)

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

Run the same offered load through ecn and then ztr and compare where each mechanism reacts: queue occupancy the switch reports, versus delay the sender measures.

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 injection

The 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]

ProductSpeedPCIeRoleGPU 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.

Before promising ZTR-RTT, pin the platform. The verified floor here is DOCA PCC's - BlueField-3 or later, Ethernet only, firmware 32.38.1000 and higher - and the algorithm pages add nothing to it.
Evaluate a no-PFC request from a Dell customer

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.

  1. 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.
  2. 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]
  3. Inventory the customer’s hardware before writing anything:[6][4]
    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"
    Expected on an unprepared host: USER_PROGRAMMABLE_CC false. That is a next-boot change, so the recommendation carries a reboot.
  4. 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]
  5. Give them a measurable acceptance test rather than a promise. Enable debug counters, reset, run the 64-node job, query:[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"
    # 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"
    Acceptance: ZTR_CC_NUM_RTT climbing, a plausible ZTR_CC_MIN_RTT, and ZTR_CC_DEC_COUNTER non-zero under load. Failure signature: ZTR_CC_NUM_RTT and ZTR_CC_RTT_TIMEOUT_COUNTER both flat - loaded but blind.[2]
  6. Offer one tuning lever with its justification, not a parameter sweep. If the pod’s measured ZTR_CC_MIN_RTT is far below 15 microseconds, either lower CONGESTION_DELAY_THRESHOLD toward the documented 2-microsecond end of its range, or enable TOPOLOGY_AWARE so the comparison is against measured minimum RTT instead of a constant.[2]
  7. 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]

Episode 5 — What goes in the recommendation

How it ended

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

Mutating steps ahead. Needs a maintenance window, out-of-band access (BMC/iDRAC/rshim console) and a rollback path. Record the pre-flight inventory before changing anything. Never on a production host.

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.

  1. Pre-flight, read-only:
    sudo 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.txt
    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] If USER_PROGRAMMABLE_CC is absent from the query, this card or firmware does not expose PCC and the rest of the lab is read-only reasoning.
  2. 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]
  3. Read-only PPCC query to confirm the register is reachable before changing anything:[2]
    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"
    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.
  4. Mutating - enable debug mode and counters. Rollback: cmd_type=1 with counter_en=0 on the same indexes, or cmd_type=2 on algo_slot=0 to 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"
  5. Generate load and query. Server ib_write_bw -d mlx5_0 -b -q 8 --tclass=104; client ib_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]
    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"
    Expected on a working loop: ZTR_CC_NUM_RTT non-zero with a plausible ZTR_CC_MIN_RTT. Flat ZTR_CC_NUM_RTT together with flat ZTR_CC_RTT_TIMEOUT_COUNTER means the algorithm is loaded but blind - record it as a finding rather than tuning around it.[2]
  6. Firmware-level changes are out of scope for this lab unless a maintenance window exists. If one does: the full mlxconfig query from step 1 is the restore point, every change is staged for next boot, and the reset path is mlxfwreset -d <dev> -l 3 -y r or a power cycle.[6] Never make a USER_PROGRAMMABLE_CC change without that captured query and a named rollback command.
  7. Close out: restore debug mode to its step-1 state, re-run the step-3 read-only query, and confirm mlxconfig -d <dev> q still matches /tmp/mlxconfig-full-before.txt.

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.

14 flashcards for this lesson — 0 in deck. Spaced review lives at /review.

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.

  1. ZTR-RTT CC Algorithm - DOCA 3.5.0 · fetched 2026-09-07 · DOCA 3.5.0
  2. ZTR-RTT CC Parameter and Counter Configuration - DOCA-Host · fetched 2026-09-07 · DOCA 3.5.0
  3. Scaling Zero Touch RoCE Technology with Round Trip Time Congestion Control (NVIDIA Technical Blog) · fetched 2026-09-07
  4. DOCA PCC (Programmable Congestion Control) - DOCA-Host · fetched 2026-09-07 · DOCA 3.5.0
  5. Spectrum-X Configuration - NVIDIA NIC Configuration Operator · fetched 2026-09-07
  6. Using mlxconfig - NVIDIA Firmware Tools (MFT) 4.36.0 · fetched 2026-09-07
  7. RDMA over Converged Ethernet - RoCE (Cumulus Linux 5.18) · fetched 2026-09-07
  8. NVIDIA Spectrum-X Ethernet Platform (product page) · fetched 2026-09-07
  9. Ethernet Network - NVIDIA WinOF-2 v25.7.50000 (RttResponseDscp) · fetched 2026-09-07
  10. RDMA over Converged Ethernet (DOCA-Host) - generated PDF · fetched 2026-09-07 · DOCA 3.5.0
  11. 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.