[PATCH 23/33] domain_conf: format pnv-phb3-root-port empty addr

Daniel Henrique Barboza danielhb413 at gmail.com
Thu Jan 20 13:52:26 UTC 2022


Hiding the empty (0000:00:0.0) PCI address in the case of devices that
will connect to slot 0x0 can be counterintuitive to the user, which will
see something like this:

    <controller type='pci' index='0' model='pcie-root'/>
    <controller type='pci' index='1' model='pcie-root-port'>
      <model name='pnv-phb3-root-port'/>
      <target chassis='1' port='0x8'/>
    </controller>

Even if the user deliberately adds the root-port <address> element:

    <address type='pci' domain='0x0000' bus='0x00' slot='0x00' function='0x0'/>

We end up removing the <address> element after saving the domain file.
This happens because virPCIDeviceAddressIsEmpty() can't distinguish
between a zeroed address that was set by the user versus an address that
wasn't filled at all.

Given that all root-ports of PowerNV domains will connect to slot 0 of
the PHB, if the PHB controller has index = 0 this scenario will occur
every time. This patch aims to alleaviate this behavior by adding a new
virDomainDefFormatFlags that will allow an empty address to be formatted
in the XML. This flag is then used only when formatting PowerNV root
ports.

Signed-off-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
---
 src/conf/domain_conf.c | 25 ++++++++++++++++++++++++-
 src/conf/domain_conf.h |  2 ++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 1815308a8c..8e44e4b53c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2462,6 +2462,25 @@ virDomainControllerIsPowerNVPHB(const virDomainControllerDef *cont)
 }
 
 
+static bool
+virDomainControllerIsPowerNVRootPort(const virDomainControllerDef *cont)
+{
+    virDomainControllerPCIModelName name;
+
+    if (cont->type != VIR_DOMAIN_CONTROLLER_TYPE_PCI ||
+        cont->model != VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT) {
+        return false;
+    }
+
+    name = cont->opts.pciopts.modelName;
+
+    if (name != VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PNV_PHB3_ROOT_PORT)
+        return false;
+
+    return true;
+}
+
+
 virDomainFSDef *
 virDomainFSDefNew(virDomainXMLOption *xmlopt)
 {
@@ -6489,7 +6508,8 @@ virDomainDeviceInfoFormat(virBuffer *buf,
 
     switch ((virDomainDeviceAddressType) info->type) {
     case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
-        if (!virPCIDeviceAddressIsEmpty(&info->addr.pci)) {
+        if (!virPCIDeviceAddressIsEmpty(&info->addr.pci) ||
+            flags & VIR_DOMAIN_DEF_FORMAT_EMPTY_PCI_ADDR) {
             virBufferAsprintf(&attrBuf, " domain='0x%04x' bus='0x%02x' "
                               "slot='0x%02x' function='0x%d'",
                               info->addr.pci.domain,
@@ -24151,6 +24171,9 @@ virDomainControllerDefFormat(virBuffer *buf,
         }
     }
 
+    if (virDomainControllerIsPowerNVRootPort(def))
+        flags |= VIR_DOMAIN_DEF_FORMAT_EMPTY_PCI_ADDR;
+
     virDomainControllerDriverFormat(&childBuf, def);
 
     virDomainDeviceInfoFormat(&childBuf, &def->info, flags);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 4317039e8b..e4323d0e6f 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -3502,6 +3502,8 @@ typedef enum {
     VIR_DOMAIN_DEF_FORMAT_ALLOW_ROM       = 1 << 6,
     VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT      = 1 << 7,
     VIR_DOMAIN_DEF_FORMAT_CLOCK_ADJUST    = 1 << 8,
+    /* format empty PCI addr (0000:00:0.0) */
+    VIR_DOMAIN_DEF_FORMAT_EMPTY_PCI_ADDR  = 1 << 9,
 } virDomainDefFormatFlags;
 
 /* Use these flags to skip specific domain ABI consistency checks done
-- 
2.34.1




More information about the libvir-list mailing list