On Tue, Aug 19, 2025 at 18:22:19 +0200, Andrea Bolognani via Devel wrote:
> At the moment, we check whether the machine type supports PCI
> before attempting to allocate PCI addresses, and if it does
> not, we simply skip the step entirely.
> 
> This means that an attempt to use a PCI device with a machine
> type that has no PCI support won't be rejected by libvirt, and
> only once the QEMU process is started the problem will be made
> apparent.
> 
> Validate things ahead of time instead, rejecting any such
> configurations.
> 
> Note that we only do this for new domains, because otherwise
> existing domains that are configured incorrectly would disappear
> and we generally try really hard to avoid that.
> 
> A few tests start failing after this change, demonstrating that
> things are now working as desired.
> 
> Signed-off-by: Andrea Bolognani <abolo...@redhat.com>
> ---
>  src/qemu/qemu_domain_address.c                | 18 ++++++++---
>  ...default-fallback-nousb.aarch64-latest.args | 32 -------------------
>  ...-default-fallback-nousb.aarch64-latest.xml | 22 -------------
>  .../usb-controller-default-fallback-nousb.xml |  1 -
>  ...efault-nousb.aarch64-latest.abi-update.err |  1 +
>  ...ntroller-default-nousb.aarch64-latest.args | 32 -------------------
>  ...ontroller-default-nousb.aarch64-latest.err |  1 +
>  ...fault-unavailable-nousb.aarch64-latest.err |  1 -
>  ...fault-unavailable-nousb.aarch64-latest.xml | 22 -------------
>  ...b-controller-default-unavailable-nousb.xml |  1 -
>  tests/qemuxmlconftest.c                       | 14 ++------
>  11 files changed, 17 insertions(+), 128 deletions(-)
>  delete mode 100644 
> tests/qemuxmlconfdata/usb-controller-default-fallback-nousb.aarch64-latest.args
>  delete mode 100644 
> tests/qemuxmlconfdata/usb-controller-default-fallback-nousb.aarch64-latest.xml
>  delete mode 120000 
> tests/qemuxmlconfdata/usb-controller-default-fallback-nousb.xml
>  create mode 100644 
> tests/qemuxmlconfdata/usb-controller-default-nousb.aarch64-latest.abi-update.err
>  delete mode 100644 
> tests/qemuxmlconfdata/usb-controller-default-nousb.aarch64-latest.args
>  create mode 100644 
> tests/qemuxmlconfdata/usb-controller-default-nousb.aarch64-latest.err
>  delete mode 100644 
> tests/qemuxmlconfdata/usb-controller-default-unavailable-nousb.aarch64-latest.err
>  delete mode 100644 
> tests/qemuxmlconfdata/usb-controller-default-unavailable-nousb.aarch64-latest.xml
>  delete mode 120000 
> tests/qemuxmlconfdata/usb-controller-default-unavailable-nousb.xml
> 
> diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
> index 07d6366b1b..312ed52bbd 100644
> --- a/src/qemu/qemu_domain_address.c
> +++ b/src/qemu/qemu_domain_address.c
> @@ -2675,7 +2675,8 @@ static int
>  qemuDomainAssignPCIAddresses(virDomainDef *def,
>                               virQEMUCaps *qemuCaps,
>                               virQEMUDriver *driver,
> -                             virDomainObj *obj)
> +                             virDomainObj *obj,
> +                             bool newDomain)
>  {
>      int ret = -1;
>      virDomainPCIAddressSet *addrs = NULL;
> @@ -2843,10 +2844,17 @@ qemuDomainAssignPCIAddresses(virDomainDef *def,
>          g_clear_pointer(&addrs, virDomainPCIAddressSetFree);
>      }
>  
> -    if (!(addrs = qemuDomainPCIAddressSetCreate(def, qemuCaps, nbuses, 
> false)))
> -        goto cleanup;
> +    /* We're done collecting available information, now we're going
> +     * to allocate PCI addresses for real. We normally skip this part
> +     * for machine type that don't support PCI, but we run it for new
> +     * domains to catch situation in which the user is incorrectly
> +     * asking for PCI devices to be used. If that's the case, an
> +     * error will naturally be raised when attempting to allocate a
> +     * PCI address since no PCI buses exist */
> +    if (qemuDomainSupportsPCI(def) || newDomain) {
> +        if (!(addrs = qemuDomainPCIAddressSetCreate(def, qemuCaps, nbuses, 
> false)))
> +            goto cleanup;


Any reason why this is here and not in e.g qemuValidateDomainDef() which
based on the description seems like the proper place?



>  
> -    if (qemuDomainSupportsPCI(def)) {
>          if (qemuDomainValidateDevicePCISlotsChipsets(def, addrs) < 0)
>              goto cleanup;
>  

> --- /dev/null
> +++ 
> b/tests/qemuxmlconfdata/usb-controller-default-nousb.aarch64-latest.abi-update.err
> @@ -0,0 +1 @@
> +XML error: No PCI buses available

At this point it's IMO borderline whether it's a XML error or not. It's
a configuration error but some configurations which don't mention PCI
do get it normally.

Although this is pre-existing and cosmetic.

Reply via email to