Re: [GIT PULL v2] PCI changes for v6.17
From: Nam Cao
Date: Sat Aug 09 2025 - 10:49:49 EST
On Sat, Aug 09, 2025 at 08:28:39PM +0700, Ammar Faizi wrote:
> On Sat, Aug 09, 2025 at 06:34:29AM +0200, Nam Cao wrote:
> > On Sat, Aug 09, 2025 at 07:52:30AM +0900, Ammar Faizi wrote:
> > > I can do that. Send me a git diff. I'll test it and back with the dmesg
> > > output.
> >
> > That would be very helpful, thanks!
> >
> > Please bear with me, this may take a few iterations.
> >
> > Let's first try the below.
>
> I just got home from a family outing. A bit slow response.
>
> Here's the result:
>
> https://gist.github.com/ammarfaizi2/ef5f98123ed3868f8d64ed41662edd63#file-dmesg_pci_debug_001-txt-L853
Thanks! Here's the problem:
[ 1.037223] pcieport 10000:e0:1d.0: __pci_enable_msix_range:840 err=hwsize
The PCIe port driver enables interrupt, trying MSI-X first. However, the
device does not support MSI-X, so it tries MSI instead, which triggers
the WARN_ON() in VMD driver.
What's strange is that, the VMD doc says:
"Intel VMD only supports MSIx Interrupts from child devices and
therefore the BIOS must enable PCIe Hot Plug and MSIx interrups"
Is it lying to us?
Can you please try:
Revert d5c647b08ee0 ("PCI: vmd: Fix wrong kfree() in vmd_msi_free()")
Revert d7d8ab87e3e7 ("PCI: vmd: Switch to msi_create_parent_irq_domain()")
So that the driver is back to the original state before I touched it.
And apply the diff below. This will tell us if my commit breaks the driver
somehow, or VMD has been allowing MSI all this time.
diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
index d9b893bf4e45..e99d8cefb78d 100644
--- a/drivers/pci/controller/vmd.c
+++ b/drivers/pci/controller/vmd.c
@@ -255,9 +255,15 @@ static int vmd_msi_init(struct irq_domain *domain, struct msi_domain_info *info,
msi_alloc_info_t *arg)
{
struct msi_desc *desc = arg->desc;
+ struct pci_dev *pci_dev = msi_desc_to_pci_dev(desc);
struct vmd_dev *vmd = vmd_from_bus(msi_desc_to_pci_dev(desc)->bus);
struct vmd_irq *vmdirq = kzalloc(sizeof(*vmdirq), GFP_KERNEL);
+ if (!pci_msix_vec_count(pci_dev))
+ pr_err("But VMD only supports MSIx Interrupts from child devices!\n");
+ else
+ pr_err("MSI-X, looking good...\n");
+ dump_stack();
if (!vmdirq)
return -ENOMEM;