On Fri, Sep 19, 2025 at 04:28:03PM +0200, Peter Krempa wrote:
> On Fri, Sep 19, 2025 at 08:28:38 -0500, Andrea Bolognani wrote:
> > On Thu, Sep 18, 2025 at 03:04:28PM +0200, Peter Krempa wrote:
> > > On Tue, Aug 19, 2025 at 18:22:22 +0200, Andrea Bolognani via Devel wrote:
> > > > +    /* Sanity check. If the machine type supports PCI, we need to 
> > > > reflect
> > > > +     * that fact in the XML or other parts of the machine handling code
> > > > +     * might misbehave */
> > >
> > > This one is a bit borderline. IMO you can have machine with no default
> > > PCI but the possibility to explicily add such a bus.
> >
> > Can you point to a specific example? I'm not aware of any.
>
> I don't have a specific example for this, but I have a example where the
> sanity check breaks loading config of one of VMs I had defined before:
>
> <domain type='kvm'>
>   <name>microvm</name>
>   <uuid>e739ac15-61b5-48c2-acc8-e7fb2b79774f</uuid>
>   <memory unit='KiB'>1024000</memory>
>   <currentMemory unit='KiB'>1024000</currentMemory>
>   <vcpu placement='static'>1</vcpu>
>   <os>
>     <type arch='x86_64' machine='microvm'>hvm</type>
>     <boot dev='hd'/>
>   </os>
>   <cpu mode='custom' match='exact' check='none'>
>     <model fallback='forbid'>qemu64</model>
>   </cpu>
>   <clock offset='utc'/>
>   <on_poweroff>destroy</on_poweroff>
>   <on_reboot>restart</on_reboot>
>   <on_crash>destroy</on_crash>
>   <devices>
>     <emulator>/usr/bin/qemu-system-x86_64</emulator>
>     <disk type='file' device='disk'>
>       <driver name='qemu' type='qcow2'/>
>       <source file='/var/lib/libvirt/images/alpine.qcow2'/>
>       <target dev='vda' bus='virtio'/>
>       <address type='virtio-mmio'/>
>     </disk>
>     <controller type='usb' index='0' model='none'/>
>     <audio id='1' type='none'/>
>     <memballoon model='none'/>
>   </devices>
> </domain>
>
> ... will after this patch be rejected at load time:
>
> 2025-09-19 14:16:28.132+0000: 214862: info : 
> virDomainObjListLoadAllConfigs:601 : Loading config file 'microvm.xml'
> 2025-09-19 14:16:28.132+0000: 214862: debug : 
> virDomainControllerDefParseXML:9008 : Ignoring device address for none model 
> usb controller
> 2025-09-19 14:16:28.132+0000: 214862: debug : 
> virDomainMemballoonDefParseXML:12948 : Ignoring device address for none model 
> Memballoon
> 2025-09-19 14:16:28.132+0000: 214862: debug : virCPUDataIsIdentical:1285 : 
> a=0x7fffac30c7f0, b=0x7fffac523430
> 2025-09-19 14:16:28.132+0000: 214862: debug : virArchFromHost:236 : Mapped 
> x86_64 to 35 (x86_64)
> 2025-09-19 14:16:28.132+0000: 214862: debug : virQEMUCapsCacheLookup:5996 : 
> Returning caps 0x7fffac022ad0 for /usr/bin/qemu-system-x86_64
> 2025-09-19 14:16:28.132+0000: 214862: error : 
> qemuDomainDefAddDefaultDevices:1343 : internal error: Machine type 'microvm' 
> supports PCI but no PCI controller added
> 2025-09-19 14:16:28.132+0000: 214862: error : 
> virDomainObjListLoadAllConfigs:622 : Failed to load config for domain 
> 'microvm'
>
> > To the best of my knowledge, all machines that are PCI-capable come
> > with a root PCI controller out of the gate.
> >
> > There is no QEMU device corresponding to the root PCI controller
> > either, so I don't know how you would even go about adding it if it
> > were opt-in. Perhaps a machine type flag but again, I'm not aware of
> > that actually being a thing.
>
> IIUC 'microvm' doesn't support PCI, which shows that this check itself
> is broken not that there isn't merit in the check itself.

Yup, qemuDomainSupportsPCI() needs to be tweaked further to account
for this.

> > > > +    /* Sanity check. USB controllers are PCI devices, so asking for a
> > > > +     * USB controller to be added but not for a PCI(e) root to be
> > > > +     * added at the same time is likely an oversight */
> > >
> > > I'm fairly sure there are non-PCI USB controllers so this one is
> > > definitely false. It's just that libvirt supports only USB controllers
> > > which are on PCI.
> > >
> > > IMO this assumption should be validated with the USB controller itself.
> >
> > I'm not aware of any non-PCI USB controller out there, certainly not
> > in QEMU. Can you point to one?
>
> One example is the USB controller in older raspberry-pis, which is
> embedded in the SoC. I presume it's accessed via MMIO. QEMU claims
> support for rpis at least.
>
> As said this is something that ought to be validated when validating the
> USB controller device, rather than here.

Oh yeah, here it is:

  dev: dwc2-usb, id ""
    gpio-out "sysbus-irq" 1
    usb_version = 2 (0x2)
    mmio ffffffffffffffff/0000000000011000
    bus: usb-bus.0
      type usb-bus

Point taken, this check is incorrect.

-- 
Andrea Bolognani / Red Hat / Virtualization

Reply via email to