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