Technical guide
PCIe Max Payload Size vs Max Read Request Size: MPS and MRRS Explained
Understand PCIe Maximum Payload Size and Maximum Read Request Size, how they differ, their 128–4096 byte settings, and why larger values are not a universal PC performance tweak.
On this page
- MPS and MRRS control different parts of PCIe transactions
- Maximum Payload Size has both a supported capability and an active setting
- MRRS controls how large a read a requester may issue
- A large MRRS does not override MPS on returned completions
- Linux PCIe bus policies show why topology matters
- Read MPS and MRRS alongside the negotiated link, not instead of it
- The useful mental model is packet payload versus read-request window
MPS and MRRS control different parts of PCIe transactions
PCI Express moves requests and completions as Transaction Layer Packets, or TLPs. Two similarly named settings describe different limits in that traffic: Maximum Payload Size (MPS) limits the data payload a Function may place in a TLP, while Maximum Read Request Size (MRRS) limits how much data a Function acting as a Requester may ask for in one Memory Read Request.
They are therefore not interchangeable bandwidth settings. MPS constrains payload carried in packets such as writes and read completions. MRRS constrains the requested byte count of a Memory Read Request. A read request itself does not carry the requested data; the Completer returns that data in one or more Completion TLPs subject to the applicable payload and completion-boundary rules.
| Setting | What it limits | PCIe/Linux-exposed values | What it does not mean |
|---|---|---|---|
| MPS | Maximum data payload in a TLP | 128, 256, 512, 1024, 2048, or 4096 bytes | Not the PCIe lane width or link speed |
| MRRS | Maximum size of a Memory Read Request issued by a Requester | 128, 256, 512, 1024, 2048, or 4096 bytes | Not a guarantee that the response arrives as one packet |
| Link speed / width | Physical-link transfer capability | Generation-dependent GT/s and negotiated lane count | Not configured by MPS or MRRS |
Maximum Payload Size has both a supported capability and an active setting
A PCIe Function advertises the largest payload size it can support. Software then configures an active MPS value that must stay within the supported topology. Linux exposes helpers for reading and setting PCIe MPS and accepts the standard power-of-two values from 128 through 4096 bytes when the device supports them.
The active value matters across a hierarchy because packets traverse bridges and links, not just one endpoint in isolation. Linux therefore has PCIe bus policies that deliberately choose MPS according to the devices and buses in a topology. Its safe policy selects the largest value supported by all devices below the root complex, while its performance-oriented policy can choose values based on the parent bus.
MRRS controls how large a read a requester may issue
MRRS is a field in PCIe Device Control for a Function acting as a Requester. Current NVM Express PCIe transport documentation describes it directly: a Function must not generate a Memory Read Request whose size exceeds the configured MRRS value. Linux likewise exposes pcie_get_readrq and pcie_set_readrq for the setting.
A larger request can reduce the number of separate read requests needed to fetch a larger region, but that does not turn MRRS into a simple throughput slider. The returned data can be split into multiple completions, and real performance also depends on device architecture, outstanding requests, latency, link capability, host behavior, workload and platform configuration.
A large MRRS does not override MPS on returned completions
Suppose a requester is allowed to issue a read larger than the payload size used for completion packets. The request can still be legal: the Completer can return the requested data through multiple Completion with Data TLPs. MRRS describes the request size; MPS still constrains packet payload.
This distinction explains why comparing the two numeric fields alone can be misleading. A system can legitimately expose an MRRS value larger than the active MPS. They govern different directions and packet roles rather than forming a rule that the two numbers must always match.
Linux PCIe bus policies show why topology matters
Linux documents several PCIe bus configuration policies. The safe policy chooses an MPS supported throughout the hierarchy below a root complex. The performance policy raises MPS according to the parent bus and also raises MRRS, while the peer-to-peer policy fixes MPS at 128 bytes so peer devices have a universally supported payload size.
Those policies are useful evidence that configuration is a system-level compatibility and performance decision. Firmware, operating systems and platform code already participate in choosing workable values. A desktop user should not assume that the largest number exposed by one endpoint is automatically the correct value for every device behind every bridge.
Read MPS and MRRS alongside the negotiated link, not instead of it
When diagnosing a PCIe device, separate transaction sizing from physical-link capability. A device can negotiate fewer lanes or a lower PCIe generation while still having valid MPS and MRRS settings. Conversely, a Gen 5 x16 link does not imply a particular transaction payload or read-request size.
For Linux diagnostics, tools such as lspci can expose PCIe capability and control fields, while kernel interfaces let drivers query MPS, MRRS, link speed and link width separately. For a practical investigation, record the endpoint, upstream bridges, negotiated speed and width, active MPS/MRRS, workload and any AER errors before changing one variable at a time.
The useful mental model is packet payload versus read-request window
Think of MPS as a ceiling on how much data one PCIe TLP may carry and MRRS as a ceiling on how much data a requester asks to read in one Memory Read Request. They can influence transaction overhead and how traffic is broken up, but neither replaces link bandwidth, latency, queueing or device-level behavior.
That model is also safer than copying tuning values from another PC. Different root complexes, switches, bridges and endpoints can advertise different capabilities, and the operating system must configure a coherent hierarchy. Use MPS and MRRS as diagnostic and architecture concepts first, not as generic optimization knobs.
Sources
Primary and technical sources
Technical details can vary by exact model, firmware, and platform. These are the sources used for the factual claims in this article.
01 Linux Kernel Documentation
PCI Support Library — PCIe MPS and read request helpers02 Linux Kernel Documentation
The kernel's command-line parameters — PCIe bus configuration policies03 NVM Express
NVM Express PCI Express Transport Specification
Related
Continue from here
Useful next steps selected from the same technical reference and publication system.
Technical guide
PCIe Bifurcation vs PCIe Switches: Lane Splitting Explained
Understand how PCIe bifurcation differs from a PCIe switch, why passive multi-device cards depend on host lane splitting, and what an active switch changes.
Tool
PCIe Link Bandwidth Calculator
Calculate theoretical one-direction PCIe link bandwidth by generation and lane width.
Technical guide
16 GB vs 32 GB vs 64 GB RAM for Gaming PCs
Choose 16 GB, 32 GB, or 64 GB of system RAM for a gaming PC by measuring the games and simultaneous workloads you actually run instead of relying on a universal capacity rule.
Tool
DDR Memory Latency Calculator
Convert DDR data rate and CAS latency cycles into CAS timing in nanoseconds.