[libvirt PATCH 1/6] conf: add support for <acpi index='NNN'/> for PCI devices

Peter Krempa pkrempa at redhat.com
Wed Apr 7 07:17:36 UTC 2021


On Tue, Apr 06, 2021 at 16:31:32 +0100, Daniel Berrange wrote:
> PCI devices can be associated with a unique integer index that is
> exposed via ACPI. In Linux OS with systemd, this value is used for
> provide a NIC device naming scheme that is stable across changes
> in PCI slot configuration.
> 
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
>  docs/formatdomain.rst         |  6 +++
>  docs/schemas/domaincommon.rng | 73 +++++++++++++++++++++++++++++++++++
>  src/conf/device_conf.h        |  3 ++
>  src/conf/domain_conf.c        | 12 ++++++
>  4 files changed, 94 insertions(+)
> 
> diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
> index 7ba32ea9c1..5db0aac77a 100644
> --- a/docs/formatdomain.rst
> +++ b/docs/formatdomain.rst
> @@ -4363,6 +4363,7 @@ Network interfaces
>         <mac address='52:54:00:5d:c7:9e'/>
>         <boot order='1'/>
>         <rom bar='off'/>
> +       <acpi index='4'/>
>       </interface>
>     </devices>
>     ...
> @@ -4389,6 +4390,11 @@ when it's in the reserved VMware range by adding a ``type="static"`` attribute
>  to the ``<mac/>`` element. Note that this attribute is useless if the provided
>  MAC address is outside of the reserved VMWare ranges.
>  
> +:since:`Since 7.3.0`, one can set the ACPI index against network interfaces.
> +With some operating systems (eg Linux with systemd), the ACPI index is used
> +to provide network interface device naming, that is stable across changes
> +in PCI addresses assigned to the device.

Any range limits or uniqueness requirements worth mentioning?

> +
>  :anchor:`<a id="elementsNICSVirtual"/>`
>  
>  Virtual network


[...]

> diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h
> index a51bdf10ee..af9a43bff2 100644
> --- a/src/conf/device_conf.h
> +++ b/src/conf/device_conf.h
> @@ -159,6 +159,9 @@ struct _virDomainDeviceInfo {
>      /* bootIndex is only used for disk, network interface, hostdev
>       * and redirdev devices */
>      unsigned int bootIndex;
> +    /* Valid for any PCI device. Can be used for NIC to get
> +     * stable numbering in Linux */
> +    unsigned int acpiIndex;
>  
>      /* pciConnectFlags is only used internally during address
>       * assignment, never saved and never reported.
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 1e72171586..ef921ae41a 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -6335,6 +6335,9 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
>          virBufferAddLit(buf, "/>\n");
>      }
>  
> +    if (info->acpiIndex != 0)
> +        virBufferAsprintf(buf, "<acpi index='%u'/>\n", info->acpiIndex);
> +
>      if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE ||
>          info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390)
>          /* We're done here */
> @@ -6661,6 +6664,7 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt,
>      g_autofree char *romenabled = NULL;
>      g_autofree char *rombar = NULL;
>      g_autofree char *aliasStr = NULL;
> +    g_autofree char *acpiIndex = NULL;
>      VIR_XPATH_NODE_AUTORESTORE(ctxt)
>  
>      virDomainDeviceInfoClear(info);
> @@ -6709,6 +6713,14 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt,
>          }
>      }
>  
> +    acpiIndex = virXPathString("string(./acpi/@index)", ctxt);
> +    if (acpiIndex &&
> +        virStrToLong_ui(acpiIndex, NULL, 10, &info->acpiIndex) < 0) {
> +        virReportError(VIR_ERR_XML_ERROR,
> +                       _("Cannot parse ACPI index value '%s'"), acpiIndex);
> +        goto cleanup;
> +    }
> +
>      if ((address = virXPathNode("./address", ctxt)) &&
>          virDomainDeviceAddressParseXML(address, info) < 0)
>          goto cleanup;

ABI stability check is missing.




More information about the libvir-list mailing list