qemu-devel
[Top][All Lists]
Advanced

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

Re: Cannot use more than one MSI interrupts


From: Alex Williamson
Subject: Re: Cannot use more than one MSI interrupts
Date: Thu, 24 Oct 2019 09:02:33 -0600

On Thu, 24 Oct 2019 14:45:28 +0000
Thanos Makatos <address@hidden> wrote:

> I have a Ubuntu VM (4.15.0-48-generic) to which I pass through a PCI device,
> specifically a virtual NVMe controller. The problem I have is that only one 
> I/O queue
> is initialized, while there should be more (e.g. four). I'm using upstream 
> QEMU
> v4.1.0 confgiured without any additional options. Most likely there's 
> something
> broken with my virtual device implementation but I can't figure out exactly
> what, I was hoping to get some debugging directions.
> 
> I run QEMU as follows:
> 
> ~/src/qemu/x86_64-softmmu/qemu-system-x86_64 \
>         -kernel bionic-server-cloudimg-amd64-vmlinuz-generic \
>         -smp cores=2,sockets=2 \
>         -nographic \
>         -append "console=ttyS0 root=/dev/sda1 single nvme.sgl_threshold=0 
> nokaslr nvme.io_queue_depth=4" \
>         -initrd bionic-server-cloudimg-amd64-initrd-generic \
>         -hda bionic-server-cloudimg-amd64.raw \
>         -hdb data.raw \
>         -m 1G \
>         -object 
> memory-backend-file,id=ram-node0,prealloc=yes,mem-path=mem,share=yes,size=1073741824
>  -numa node,nodeid=0,cpus=0-3,memdev=ram-node0 \
>         -device 
> vfio-pci,sysfsdev=/sys/bus/mdev/devices/00000000-0000-0000-0000-000000000000 \
>         -trace enable=vfio*,file=qemu.trace \
>         -net none \
>         -s
> 
> This is what QEMU thinks of the devices:
> 
> (qemu) info pci
>   Bus  0, device   0, function 0:
>     Host bridge: PCI device 8086:1237
>       PCI subsystem 1af4:1100
>       id ""
>   Bus  0, device   1, function 0:
>     ISA bridge: PCI device 8086:7000
>       PCI subsystem 1af4:1100
>       id ""
>   Bus  0, device   1, function 1:
>     IDE controller: PCI device 8086:7010
>       PCI subsystem 1af4:1100
>       BAR4: I/O at 0xc000 [0xc00f].
>       id ""
>   Bus  0, device   1, function 3:
>     Bridge: PCI device 8086:7113
>       PCI subsystem 1af4:1100
>       IRQ 9.
>       id ""
>   Bus  0, device   2, function 0:
>     VGA controller: PCI device 1234:1111
>       PCI subsystem 1af4:1100
>       BAR0: 32 bit prefetchable memory at 0xfd000000 [0xfdffffff].
>       BAR2: 32 bit memory at 0xfebf4000 [0xfebf4fff].
>       BAR6: 32 bit memory at 0xffffffffffffffff [0x0000fffe].
>       id ""
>   Bus  0, device   3, function 0:
>     Class 0264: PCI device 4e58:0001
>       PCI subsystem 0000:0000
>       IRQ 11.
>       BAR0: 32 bit memory at 0xfebf0000 [0xfebf3fff].
>       id ""
> 
> And this is what the guest thinks of the device in question:
> 
> root@ubuntu:~# lspci -vvv -s 00:03.0
> 00:03.0 Non-Volatile memory controller: Device 4e58:0001 (prog-if 02 [NVM 
> Express])
>         Physical Slot: 3
>         Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
> Stepping- SERR+ FastB2B- DisINTx+
>         Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- 
> <TAbort- <MAbort- >SERR- <PERR- INTx-
>         Latency: 0
>         Interrupt: pin A routed to IRQ 24
>         NUMA node: 0
>         Region 0: Memory at febf0000 (32-bit, non-prefetchable) [size=16K]
>         Capabilities: [40] Power Management version 0
>                 Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA 
> PME(D0-,D1-,D2-,D3hot-,D3cold-)
>                 Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
>         Capabilities: [48] MSI: Enable+ Count=1/4 Maskable- 64bit+
>                 Address: 00000000fee01004  Data: 4023
>         Capabilities: [60] Express (v1) Endpoint, MSI 00
>                 DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, 
> L1 <1us
>                         ExtTag- AttnBtn+ AttnInd- PwrInd- RBE- FLReset- 
> SlotPowerLimit 128.000W
>                 DevCtl: Report errors: Correctable- Non-Fatal- Fatal- 
> Unsupported-
>                         RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
>                         MaxPayload 128 bytes, MaxReadReq 128 bytes
>                 DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- 
> TransPend-
>                 LnkCap: Port #0, Speed unknown, Width x0, ASPM not supported, 
> Exit Latency L0s <64ns, L1 <1us
>                         ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp-
>                 LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk-
>                         ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
>                 LnkSta: Speed unknown, Width x0, TrErr- Train- SlotClk- 
> DLActive- BWMgmt- ABWMgmt-
>         Kernel driver in use: nvme
>         Kernel modules: nvme
> 
> I tried debugging the guest kernel and I think the following if is taken in
> pci_msi_domain_check_cap():
> 
> if (pci_msi_desc_is_multi_msi(desc) &&
>     !(info->flags & MSI_FLAG_MULTI_PCI_MSI))                     
>         return 1;
> 
> because flags is 0x3b (MSI_FLAG_MULTI_PCI_MSI is 0x4). And this I think means
> that MSI_FLAG_MULTI_PCI_MSI is not set for that msi_domain_info.
> 
> # grep -i msi qemu.trace
> 1327@1571926064.595365:vfio_msi_setup 00000000-0000-0000-0000-000000000000 
> PCI MSI CAP @0x48
> 1334@1571926073.489691:vfio_msi_enable  
> (00000000-0000-0000-0000-000000000000) Enabled 1 MSI vectors
> 1334@1571926073.501741:vfio_msi_disable  
> (00000000-0000-0000-0000-000000000000)
> 1334@1571926073.507127:vfio_msi_enable  
> (00000000-0000-0000-0000-000000000000) Enabled 1 MSI vectors
> 1327@1571926073.520840:vfio_msi_interrupt  
> (00000000-0000-0000-0000-000000000000) vector 0 0xfee01004/0x4023
> ... more vfio_msi_interrupt ...
> 
> How can I further debug this?

The quick answer is to implement MSI-X in your device, MSI requires a
contiguous block of vectors and there's limited support for actually
making use of more than a single vector.  There is almost no real
hardware that doesn't implement MSI-X for multiple vector support.
Thanks,

Alex




reply via email to

[Prev in Thread] Current Thread [Next in Thread]