Re: [PATCH] PCI: Fix Intel Xeon 6 x2 quirk collateral damage on adjacent x4 endpoints

Rick Warner <[email protected]> Tue, 4 Aug 2026 09:55:23 -0400
Newsgroups org.kernel.vger.linux-pci,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
This is a multi-part message in MIME format.
--------------CdDPXzSeKXdyhaFKr3Yv8mqU
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit

Hi All,

Here's an updated version of the fix.  Now in the early setup it sets 
no_inc_mrrs on the entire bridge instead of disabling ext tags and 
limiting mrrs for the entire root bridge.  Then it uses 
DECLARE_PCI_FIXUP_HEADER to check every registering pci device to see if 
it's a descendant of an x2 port, and if so, disables ext tags and limits 
mrrs for that device.  This should properly handle hotplugging now.

This has been tested on a Gigabyte MS74-HB0 motherboard with a Seagate 
ZP4000GM30063 M.2 drive. With the stock kernel, that drive fails to 
initialize and is unavailable once booted. Testing showed that extended 
tags are required for it to work.  The drive works properly with this 
patch.  Concerns were mentioned about vfio/VM usage being able to 
re-enable extended tags if bridge->no_ext_tags is not set.  I'm not sure 
how to address that without adding additional a flag to pci device 
structures that individually blocks extended tags per device instead of 
relying on the bridge flag for it. I'm open to suggestions for that.

Thanks,
Rick Warner

On 7/29/26 2:43 PM, Lukas Wunner wrote:
> On Wed, Jul 29, 2026 at 10:45:08AM -0400, Rick Warner wrote:
>> commit a22250fe933d ("PCI: Add Extended Tag + MRRS quirk for Xeon 6")
>> introduced a traffic mitigation quirk for Intel Xeon 6 root ports that
>> negotiate down to an x2 lane width. However, that patch manipulated host
>> bridge properties globally via 'bridge->no_ext_tags = 1' and by hooking
>> 'bridge->enable_device'.
>>
>> Because multiple unrelated root ports can reside under the exact same
>> global pci_host_bridge domain structure, this overly aggressive mitigation
>> causes severe collateral damage. When a low-speed or bifurcated secondary
>> device (such as an onboard ASMedia SATA controller or BMC graphics link)
>> matches the x2 condition, the kernel strips away Extended Tags and forces
>> a 128B MRRS restriction across that ENTIRE host bridge. This instantly
>> breaks or starves adjacent high-performance, unrelated x4 endpoints
>> (such as NVMe drives), resulting in controller timeouts, initialization
>> failures, and missing drives at boot.
>>
>> Fix this by refactoring the quirk logic to be completely per-device and
>> downstream-isolated. Remove the broad host bridge structure assignments
>> entirely. Instead, convert the hook to an explicit
>> 'DECLARE_PCI_FIXUP_FINAL' sweep. When an x2 bifurcated root port is
>> discovered, leverage 'pci_walk_bus()' to step down only that specific root
>> port's subordinate tree, manually clearing 'PCI_EXP_DEVCTL_EXT_TAG' and
>> 'PCI_EXP_DEVCTL_READRQ' directly in the endpoint Device Control
>> configuration registers.
> One problem I see with this approach is that it won't work for hotplugged
> devices below a bifurcated Root Port:  You're only adjusting Extended Tags
> and MRRS once on enumeration of the Root Ports, leaving devices that are
> hotplugged later at incorrect settings.
>
> But perhaps you could simply amend limit_mrrs_to_128() to walk up to the
> Root Port, check whether it is bifurcated, and bail out if it's not?
>
> Thanks,
>
> Lukas
--------------CdDPXzSeKXdyhaFKr3Yv8mqU
Content-Type: text/x-patch; charset=UTF-8;
 name="x2-quirk-disable-extended-tags-and-limit-mrrs-per-device.patch"
Content-Disposition: attachment;
 filename*0="x2-quirk-disable-extended-tags-and-limit-mrrs-per-device.pat";
 filename*1="ch"
Content-Transfer-Encoding: base64

ZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9maXh1cC5jIGIvYXJjaC94ODYvcGNpL2ZpeHVw
LmMKaW5kZXggYjMwMWM2YzhkZjc1Li4wYWI5MmE1Y2MwZDEgMTAwNjQ0Ci0tLSBhL2FyY2gv
eDg2L3BjaS9maXh1cC5jCisrKyBiL2FyY2gveDg2L3BjaS9maXh1cC5jCkBAIC0zMDEsMTUg
KzMwMSw2IEBAIERFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfSU5URUws
CVBDSV9ERVZJQ0VfSURfSU5URUxfTUNIX1BDMSwJcGNpZV9yCiAgKgogICogaHR0cHM6Ly9j
ZHJkdjIuaW50ZWwuY29tL3YxL2RsL2dldENvbnRlbnQvODM3MTc2CiAgKi8KLXN0YXRpYyBp
bnQgbGltaXRfbXJyc190b18xMjgoc3RydWN0IHBjaV9ob3N0X2JyaWRnZSAqYiwgc3RydWN0
IHBjaV9kZXYgKnBkZXYpCi17Ci0JaW50IHJlYWRycSA9IHBjaWVfZ2V0X3JlYWRycShwZGV2
KTsKLQotCWlmIChyZWFkcnEgPiAxMjgpCi0JCXBjaWVfc2V0X3JlYWRycShwZGV2LCAxMjgp
OwotCi0JcmV0dXJuIDA7Ci19CiAKIHN0YXRpYyB2b2lkIHBjaV94ZW9uX3gyX2JpZnVyY19x
dWlyayhzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKQEAgLTMyMCw5ICszMTEsOCBAQCBzdGF0
aWMgdm9pZCBwY2lfeGVvbl94Ml9iaWZ1cmNfcXVpcmsoc3RydWN0IHBjaV9kZXYgKnBkZXYp
CiAJaWYgKEZJRUxEX0dFVChQQ0lfRVhQX0xOS0NBUF9NTFcsIGxpbmtjYXApICE9IDB4MikK
IAkJcmV0dXJuOwogCi0JYnJpZGdlLT5ub19leHRfdGFncyA9IDE7Ci0JYnJpZGdlLT5lbmFi
bGVfZGV2aWNlID0gbGltaXRfbXJyc190b18xMjg7Ci0JcGNpX2luZm8ocGRldiwgIkRpc2Fi
bGluZyBFeHRlbmRlZCBUYWdzIGFuZCBsaW1pdGluZyBNUlJTIHRvIDEyOEIgKHBlcmZvcm1h
bmNlIHJlYXNvbnMgZHVlIHRvIHgyIFBDSWUgbGluaylcbiIpOworCWJyaWRnZS0+bm9faW5j
X21ycnMgPSAxOworCXBjaV9pbmZvKHBkZXYsICJCbG9ja2luZyBkZXZpY2VzIG9uIHRoaXMg
YnJpZGdlIGZyb20gaW5jcmVhc2luZyBNUlJTIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIGR1
ZSB0byB4MiBQQ0llIGxpbmspXG4iKTsKIH0KIAogREVDTEFSRV9QQ0lfRklYVVBfRUFSTFko
UENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwZGIwLCBwY2lfeGVvbl94Ml9iaWZ1cmNfcXVpcmsp
OwpAQCAtMzM0LDYgKzMyNCw1MCBAQCBERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVO
RE9SX0lEX0lOVEVMLCAweDBkYjcsIHBjaV94ZW9uX3gyX2JpZnVyY19xdWlyayk7CiBERUNM
QVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDBkYjgsIHBjaV94
ZW9uX3gyX2JpZnVyY19xdWlyayk7CiBERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVO
RE9SX0lEX0lOVEVMLCAweDBkYjksIHBjaV94ZW9uX3gyX2JpZnVyY19xdWlyayk7CiAKKy8q
IEhlbHBlciB0byBjaGVjayBpZiBhIGRldmljZSBkZXNjZW5kcyBmcm9tIGFuIGFmZmVjdGVk
IFhlb24gNiB4MiBSb290IFBvcnQgKi8KK3N0YXRpYyBib29sIGlzX2Rlc2NlbmRhbnRfb2Zf
eGVvbjZfeDJfcnAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTMyIGxpbmtjYXA7CisJ
c3RydWN0IHBjaV9kZXYgKnVwc3RyZWFtID0gcGNpX3Vwc3RyZWFtX2JyaWRnZShwZGV2KTsK
KworCXdoaWxlICh1cHN0cmVhbSkgeworCQlpZiAodXBzdHJlYW0tPnZlbmRvciA9PSBQQ0lf
VkVORE9SX0lEX0lOVEVMICYmCisJCSAgICB1cHN0cmVhbS0+ZGV2aWNlID49IDB4MGRiMCAm
JgorCQkgICAgdXBzdHJlYW0tPmRldmljZSA8PSAweDBkYjkgKSB7CisJCQlwY2llX2NhcGFi
aWxpdHlfcmVhZF9kd29yZCh1cHN0cmVhbSwgUENJX0VYUF9MTktDQVAsICZsaW5rY2FwKTsK
KwkJCWlmIChGSUVMRF9HRVQoUENJX0VYUF9MTktDQVBfTUxXLCBsaW5rY2FwKSAhPSAweDIp
CisJCQkJcmV0dXJuIGZhbHNlOworCQkJZWxzZQorCQkJCXJldHVybiB0cnVlOworCQl9CisJ
CXVwc3RyZWFtID0gcGNpX3Vwc3RyZWFtX2JyaWRnZSh1cHN0cmVhbSk7CisJfQorCXJldHVy
biBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgcGNpX3hlb242X3gyX2xvY2FsX2VuZHBvaW50
X2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCS8qIFNraXAgYnJpZGdlcy9zd2l0
Y2hlczsgb25seSB0YXJnZXQgYWN0dWFsIGVuZHBvaW50cyAqLworCWlmIChwY2lfaXNfYnJp
ZGdlKHBkZXYpKQorCQlyZXR1cm47CisKKwkvKiBPbmx5IGFwcGx5IHRvIGRldmljZXMgdW5k
ZXIgdGhlIHgyIGJyYW5jaDsgbGVhdmVzIHg0IGJyYW5jaGVzIGNvbXBsZXRlbHkgdW50b3Vj
aGVkICovCisJaWYgKCFpc19kZXNjZW5kYW50X29mX3hlb242X3gyX3JwKHBkZXYpKQorCQly
ZXR1cm47CisKKwlwY2lfaW5mbyhwZGV2LCAiQXBwbHlpbmcgbG9jYWwgWGVvbiA2IHgyIHF1
aXJrOiBEaXNhYmxpbmcgRXh0ZW5kZWQgVGFncyBhbmQgbG9ja2luZyBNUlJTIHRvIDEyOEJc
biIpOworCisJcGNpZV9jYXBhYmlsaXR5X2NsZWFyX3dvcmQocGRldiwgUENJX0VYUF9ERVZD
VEwsIFBDSV9FWFBfREVWQ1RMX0VYVF9UQUcpOworCXBjaWVfY2FwYWJpbGl0eV9jbGVhcl93
b3JkKHBkZXYsIFBDSV9FWFBfREVWQ1RMLCBQQ0lfRVhQX0RFVkNUTF9SRUFEUlEpOworfQor
CisvKgorICogSEVBREVSIGZpeHVwcyBydW4gZm9yIEVWRVJZIGVuZHBvaW50IGR1cmluZyBp
dHMgaW5pdGlhbCBkaXNjb3ZlcnkgcGhhc2UuCisgKiBUaGlzIG5hdGl2ZWx5IGNhdGNoZXMg
Ym9vdCBkZXZpY2VzLCBob3RwbHVnZ2VkIGRldmljZXMsIGFuZCBTUi1JT1YgVkZzLgorICov
CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNp
X3hlb242X3gyX2xvY2FsX2VuZHBvaW50X2ZpeHVwKTsKKworCiAvKgogICogRml4dXAgdG8g
bWFyayBib290IEJJT1MgdmlkZW8gc2VsZWN0ZWQgYnkgQklPUyBiZWZvcmUgaXQgY2hhbmdl
cwogICoK

--------------CdDPXzSeKXdyhaFKr3Yv8mqU--