tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: biowait for seconds



On Wed, Apr 30, 2025 at 04:48:10PM +0000, Emmanuel Dreyfus wrote:
>   PCI Message Signaled Interrupt
>     Message Control register: 0x0100
>       MSI Enabled: off
> 
> Hence the question is now how to enable MSI?

MSI is not enabled because the kernel did not found a host
bridge that support MSI. To be precise, it did not found a
host bridge.

Code in sys/arch/x86/pci/pci_machdep.c looks for the host
bridge at bus 0, device 0, function 0 to 6. On this machine,
the host bridge is at bus 0, device 20, function 4.

$ pcictl pci0 list|grep 'host bridge'
000:20:4: Intel product 1bfe (host bridge, revision 0x11)
254:00:3: Intel Snow Ridge IEH (host bridge)

The patch below fixes everything. ALl PCI devices now use MSI or
MSIX instead of ioapic, the nvme I/O do not lag in biowait 
anymore. The machine boots at normal pace.

How should this be properly handled? Should we iterate 
on all buses, devices and functions? Or keep it as a
special case like I did? 

And I wondder what 254:0:1 is.

--- sys/arch/x86/pci/pci_machdep.c.orig
+++ sys/arch/x86/pci/pci_machdep.c
@@ -519,8 +519,21 @@
                        havehb = true;
                        break;
                }
        }
+
+       /* Intel Snow Ridge */
+       if (havehb == false) {
+               tag = pci_make_tag(pc, 0, 20, 4);
+               id = pci_conf_read(pc, tag, PCI_ID_REG);
+               class = pci_conf_read(pc, tag, PCI_CLASS_REG);
+
+               if (PCI_CLASS(class) == PCI_CLASS_BRIDGE &&
+                   PCI_SUBCLASS(class) == PCI_SUBCLASS_BRIDGE_HOST) {
+                       havehb = true;
+               }
+       }
+
        if (havehb == false)
                return;
 
        /* VMware and KVM use old chipset, but they can use MSI/MSI-X */


-- 
Emmanuel Dreyfus
manu%netbsd.org@localhost


Home | Main Index | Thread Index | Old Index