PFC headroom and cyclic waiting
Separate per-priority link pausing from end-to-end congestion control and reason about resource-dependency cycles.
On this page
The question for today
What you’ll understand
- Explain the scope of a priority pause and its collateral effects.
- Estimate in-flight headroom using an explicitly declared reaction interval.
- Distinguish congestion, head-of-line blocking, and deadlock.
Priority-based Flow Control asks an upstream link partner to pause transmission for selected priorities before protected buffers overflow. It can help a deliberately configured traffic class avoid congestion drops, but it moves waiting upstream rather than removing excess demand. The resulting dependencies can spread beyond the original congested destination. To reason safely, identify exactly which priority, link, buffer, and release condition each pause affects.
A priority is broader than a flow
PFC operates on individual priorities of a full-duplex Ethernet link, unlike a pause that stops all ordinary traffic on that link. Several unrelated flows can share a paused priority, so one congested destination may delay another flow that would otherwise have a clear path. Classification, queue mapping, and trust settings must agree across endpoints and switches. A DSCP or VLAN-priority label is not by itself proof that all hops place packets in the intended protected buffer.
The pause takes time to affect arrivals. Packets already transmitted, the pause frame's travel, reaction time, and serialization contribute to the bytes that can still arrive. Reserve headroom for the declared link and implementation rather than equating total shared switch memory with guaranteed space for every paused port and priority. Multiple protected priorities and simultaneous congested ports compete for real resources. Threshold design must account for those allocations and their failure or reconfiguration behavior.
Backpressure can form a waiting cycle
A queue can be congested yet still make progress as downstream service drains it. Deadlock requires a stronger failure of progress: resources wait on one another in a dependency cycle with no enabled drain or independent escape. PFC can participate in such cycles when traffic occupying one buffer depends on another paused buffer that eventually depends back on the first. A momentary pause or a high queue watermark alone does not prove a deadlock.
Analyze the channel and buffer dependency graph together with routing, priority mapping, and actual escape behavior. A directed cycle is a warning, not an unconditional proof that every traffic trace deadlocks; occupancy and blocking conditions must materialize. Watchdogs may break a stall by dropping or disabling protection, changing the losslessness promise. End-to-end congestion control and disciplined topology or buffer design reduce risks, but no single checkbox substitutes for a progress argument and failure tests.
Measure paused work and its neighbors
Correlate pause duration by priority with queue occupancy, receiver progress, drops, and application completion. A device may report frames, time, or transitions under a counter containing the word pause; these are different units. Persistent upstream waiting can originate from a slow receiver or local PCIe pressure rather than a purely fabric-wide load increase. Test whether unrelated flows in the same priority stall and whether independent priorities keep progressing under the same event.
The queue lab illustrates only fixed-rate backlog. Reset and set both λ=4, μ=2, predict growth, then Step; for a separate case Reset and re-set λ=2, μ=4 before stepping. It has no pause frames, finite shared pools, dependency graph, or deadlock detector. Even λ=μ is merely constant fluid backlog, not evidence of a cyclic wait. Explain which downstream release conditions and dependencies would be needed before calling a real paused system deadlocked.
Work it through
Headroom after a pause request
For one declared ingress link, arrivals continue at 400 Gbit/s for a total 3 microsecond pause reaction interval. Add a stated 12,000-byte margin; exclude other ingress traffic.
Convert bits to bytes:400×10⁹/8=50×10⁹bytes/s. The reaction interval includes all propagation and response components specified by this hypothetical example.
Multiply 50×10⁹ by 3×10⁻⁶ to obtain 150,000 bytes still arriving. Add 12,000 bytes to get 162,000 bytes of modeled headroom.
This budget applies to this one ingress and chosen margin. It does not establish safe switch thresholds across multiple ports, shared-pool allocations, jumbo frames, changed link speeds, or a persistent pause cycle.
In-flight bytes require explicit headroom even after pausing is requested. Adequate headroom does not itself prove deadlock freedom.
The living notebook
Explore the model
Interactive lab · queue
Backlog is not a dependency cycle
For independent fixed-rate runs Reset, set both rates, predict, then Step: λ=4, μ=2 grows; λ=2, μ=4 declines. The fluid model has no PFC, finite buffer, or resource graph and cannot diagnose deadlock.
- Fluid backlog
- 4
- Net rate · λ − μ
- −1 /s
- M/M/1 mean residence
- 1 s
Fluid backlog starts at 4 and follows max(0, 4 + (λ − μ)t). The separate M/M/1 residence-time formula assumes Poisson arrivals, exponential service and λ < μ. Parameter changes pause playback and recompute the model at the current elapsed time. Reset restores both parameters and returns time to zero. Playback starts paused. Adjust either parameter, then choose Play or Step.
Look forA queue waiting under load and a set of resources unable to make progress require different explanations.
Pause & reason
Check your understanding
Your turn
Try it yourself
A 200 Gbit/s ingress has a 4 microsecond total reaction interval and a 20,000-byte margin. Calculate the simplified headroom, then state why constant queue occupancy is insufficient evidence of deadlock.
Take a moment to make a prediction or work it out on paper. Open a hint when you need one.
Give me a hint
Convert the rate to bytes/s and distinguish a time-invariant backlog from absence of progress.
Compare with the solution
The rate is 25×10⁹bytes/s, producing 100,000 in-flight bytes over 4 microseconds. Including the margin gives 120,000 bytes. A constant queue can still transmit and receive at equal rates, so it may make continual progress. Deadlock requires occupied resource dependencies that prevent progress without an external intervention or available escape.
Keep the idea
Take it with you
- PFC pauses a priority on a link, not just one congested flow.
- Reaction-time headroom and deadlock freedom are separate requirements.
- Progress needs dependency and release-condition evidence, not just pause counts.
Read further
Original sources and deeper explanations to follow at your own pace.
Optional progress, saved in this browser when available. Revisit any lesson at any time.
Lesson not marked complete.