[PATCH 5/7] qemu: Support set bootindex to -1

Jiang Jiacheng jiangjiacheng at huawei.com
Tue Oct 11 13:38:31 UTC 2022


Enable bootindex can be set to -1, it means cancel the device's bootindex.
Change bootindex's type from unsigned int to int and modify other related
codes concered with type.

Signed-off-by: Jiang Jiacheng <jiangjiacheng at huawei.com>
---
 src/conf/device_conf.h      |  4 ++--
 src/conf/domain_conf.c      | 15 ++++++++++-----
 src/conf/domain_postparse.c |  2 +-
 src/qemu/qemu_command.c     | 38 ++++++++++++++++++-------------------
 src/qemu/qemu_process.c     |  8 ++++----
 src/qemu/qemu_validate.c    |  6 +++---
 6 files changed, 39 insertions(+), 34 deletions(-)

diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h
index f2907dc596..a9df2e6e5d 100644
--- a/src/conf/device_conf.h
+++ b/src/conf/device_conf.h
@@ -139,11 +139,11 @@ struct _virDomainDeviceInfo {
     char *romfile;
     /* bootIndex is only used for disk, network interface, hostdev
      * and redirdev devices */
-    unsigned int bootIndex;
+    int bootIndex;
     /* 'effectiveBootIndex' is same as 'bootIndex' (if provided in the XML) but
      * not formatted back. This allows HV drivers to update it if <os><boot ..
      * is present. */
-    unsigned int effectiveBootIndex;
+    int effectiveBootIndex;
     /* Valid for any PCI device. Can be used for NIC to get
      * stable numbering in Linux */
     unsigned int acpiIndex;
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c904d9c63d..fe7e5f9116 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -5093,7 +5093,7 @@ virDomainDeviceInfoFormat(virBuffer *buf,
     g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
 
     if ((flags & VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT) && info->bootIndex) {
-        virBufferAsprintf(buf, "<boot order='%u'", info->bootIndex);
+        virBufferAsprintf(buf, "<boot order='%d'", info->bootIndex);
 
         if (info->loadparm)
             virBufferAsprintf(buf, " loadparm='%s'", info->loadparm);
@@ -5254,10 +5254,15 @@ virDomainDeviceBootParseXML(xmlNodePtr node,
 {
     g_autofree char *loadparm = NULL;
 
-    if (virXMLPropUInt(node, "order", 10,
-                       VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO,
-                       &info->bootIndex) < 0)
+    if (virXMLPropInt(node, "order", 10,
+                      VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO,
+                      &info->bootIndex, -1) < 0)
         return -1;
+    if (info->bootIndex == 0 || info->bootIndex < -1) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("incorrect boot order '%d', expecting positive integer or -1"),
+                       info->bootIndex);
+    }
 
     info->effectiveBootIndex = info->bootIndex;
 
@@ -27652,7 +27657,7 @@ virDomainDeviceInfoCheckBootIndex(virDomainDef *def G_GNUC_UNUSED,
 
     if (info->bootIndex == data->newInfo->bootIndex) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                       _("boot order %u is already used by another device"),
+                       _("boot order %d is already used by another device"),
                        data->newInfo->bootIndex);
         return -1;
     }
diff --git a/src/conf/domain_postparse.c b/src/conf/domain_postparse.c
index df59de2d0d..9810de7437 100644
--- a/src/conf/domain_postparse.c
+++ b/src/conf/domain_postparse.c
@@ -1041,7 +1041,7 @@ virDomainDefCollectBootOrder(virDomainDef *def G_GNUC_UNUSED,
          */
         return 0;
     }
-    order = g_strdup_printf("%u", info->bootIndex);
+    order = g_strdup_printf("%d", info->bootIndex);
 
     if (virHashLookup(bootHash, order)) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index a31b8ee438..e124800bcc 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1765,7 +1765,7 @@ qemuBuildDiskDeviceProps(const virDomainDef *def,
     virTristateSwitch shareRW = VIR_TRISTATE_SWITCH_ABSENT;
     g_autofree char *chardev = NULL;
     g_autofree char *drive = NULL;
-    unsigned int bootindex = 0;
+    int bootindex = 0;
     unsigned int logical_block_size = 0;
     unsigned int physical_block_size = 0;
     g_autoptr(virJSONValue) wwn = NULL;
@@ -1951,7 +1951,7 @@ qemuBuildDiskDeviceProps(const virDomainDef *def,
                               "S:drive", drive,
                               "S:chardev", chardev,
                               "s:id", disk->info.alias,
-                              "p:bootindex", bootindex,
+                              "z:bootindex", bootindex,
                               "p:logical_block_size", logical_block_size,
                               "p:physical_block_size", physical_block_size,
                               "A:wwn", &wwn,
@@ -2019,25 +2019,25 @@ qemuCommandAddExtDevice(virCommand *cmd,
 
 static void
 qemuBuildFloppyCommandLineControllerOptionsImplicit(virCommand *cmd,
-                                                    unsigned int bootindexA,
-                                                    unsigned int bootindexB)
+                                                    int bootindexA,
+                                                    int bootindexB)
 {
     if (bootindexA > 0) {
         virCommandAddArg(cmd, "-global");
-        virCommandAddArgFormat(cmd, "isa-fdc.bootindexA=%u", bootindexA);
+        virCommandAddArgFormat(cmd, "isa-fdc.bootindexA=%d", bootindexA);
     }
 
     if (bootindexB > 0) {
         virCommandAddArg(cmd, "-global");
-        virCommandAddArgFormat(cmd, "isa-fdc.bootindexB=%u", bootindexB);
+        virCommandAddArgFormat(cmd, "isa-fdc.bootindexB=%d", bootindexB);
     }
 }
 
 
 static int
 qemuBuildFloppyCommandLineControllerOptionsExplicit(virCommand *cmd,
-                                                    unsigned int bootindexA,
-                                                    unsigned int bootindexB,
+                                                    int bootindexA,
+                                                    int bootindexB,
                                                     const virDomainDef *def,
                                                     virQEMUCaps *qemuCaps)
 {
@@ -2045,8 +2045,8 @@ qemuBuildFloppyCommandLineControllerOptionsExplicit(virCommand *cmd,
 
     if (virJSONValueObjectAdd(&props,
                               "s:driver", "isa-fdc",
-                              "p:bootindexA", bootindexA,
-                              "p:bootindexB", bootindexB,
+                              "z:bootindexA", bootindexA,
+                              "z:bootindexB", bootindexB,
                               NULL) < 0)
         return -1;
 
@@ -2062,8 +2062,8 @@ qemuBuildFloppyCommandLineControllerOptions(virCommand *cmd,
                                             const virDomainDef *def,
                                             virQEMUCaps *qemuCaps)
 {
-    unsigned int bootindexA = 0;
-    unsigned int bootindexB = 0;
+    int bootindexA = 0;
+    int bootindexB = 0;
     bool hasfloppy = false;
     size_t i;
 
@@ -2286,7 +2286,7 @@ qemuBuildVHostUserFsDevProps(virDomainFSDef *fs,
                               "s:chardev", chardev_alias,
                               "P:queue-size", fs->queue_size,
                               "s:tag", fs->dst,
-                              "p:bootindex", fs->info.bootIndex,
+                              "z:bootindex", fs->info.bootIndex,
                               NULL) < 0)
         return NULL;
 
@@ -3762,7 +3762,7 @@ qemuBuildNicDevProps(virDomainDef *def,
                               "s:netdev", netdev,
                               "s:id", net->info.alias,
                               "s:mac", macaddr,
-                              "p:bootindex", net->info.effectiveBootIndex,
+                              "z:bootindex", net->info.effectiveBootIndex,
                               NULL) < 0)
         return NULL;
 
@@ -4576,7 +4576,7 @@ qemuBuildPCIHostdevDevProps(const virDomainDef *def,
                               "s:driver", "vfio-pci",
                               "s:host", host,
                               "s:id", dev->info->alias,
-                              "p:bootindex", dev->info->effectiveBootIndex,
+                              "z:bootindex", dev->info->effectiveBootIndex,
                               "S:failover_pair_id", failover_pair_id,
                               NULL) < 0)
         return NULL;
@@ -4643,7 +4643,7 @@ qemuBuildUSBHostdevDevProps(const virDomainDef *def,
                               "p:hostbus", hostbus,
                               "p:hostaddr", hostaddr,
                               "s:id", dev->info->alias,
-                              "p:bootindex",  dev->info->bootIndex,
+                              "z:bootindex",  dev->info->bootIndex,
                               "T:guest-reset", guestReset,
                               "T:guest-resets-all", guestResetsAll,
                               NULL) < 0)
@@ -4733,7 +4733,7 @@ qemuBuildSCSIHostdevDevProps(const virDomainDef *def,
                               "s:driver", "scsi-generic",
                               "s:drive", backendAlias,
                               "s:id", dev->info->alias,
-                              "p:bootindex", dev->info->bootIndex,
+                              "z:bootindex", dev->info->bootIndex,
                               NULL) < 0)
         return NULL;
 
@@ -4831,7 +4831,7 @@ qemuBuildHostdevMediatedDevProps(const virDomainDef *def,
                               "s:sysfsdev", mdevPath,
                               "S:display", qemuOnOffAuto(mdevsrc->display),
                               "B:ramfb", ramfb,
-                              "p:bootindex", dev->info->bootIndex,
+                              "z:bootindex", dev->info->bootIndex,
                               NULL) < 0)
         return NULL;
 
@@ -9022,7 +9022,7 @@ qemuBuildRedirdevDevProps(const virDomainDef *def,
                               "s:chardev", chardev,
                               "s:id", dev->info.alias,
                               "S:filter", filter,
-                              "p:bootindex", dev->info.bootIndex,
+                              "z:bootindex", dev->info.bootIndex,
                               NULL) < 0)
         return NULL;
 
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 32f03ff79a..327307de9c 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6264,10 +6264,10 @@ static void
 qemuProcessPrepareDeviceBootorder(virDomainDef *def)
 {
     size_t i;
-    unsigned int bootCD = 0;
-    unsigned int bootFloppy = 0;
-    unsigned int bootDisk = 0;
-    unsigned int bootNetwork = 0;
+    int bootCD = 0;
+    int bootFloppy = 0;
+    int bootDisk = 0;
+    int bootNetwork = 0;
 
     if (def->os.nBootDevs == 0)
         return;
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 6403266559..c3ecd03dfb 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -2520,7 +2520,7 @@ qemuValidateDomainMdevDefVFIOPCI(const virDomainHostdevDef *hostdev,
     }
 
     /* VFIO-PCI does not support boot */
-    if (hostdev->info->bootIndex) {
+    if (hostdev->info->bootIndex > 0) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("booting from assigned devices is not "
                          "supported by mediated devices of "
@@ -2576,7 +2576,7 @@ qemuValidateDomainMdevDefVFIOAP(const virDomainHostdevDef *hostdev,
     }
 
     /* VFIO-AP does not support boot */
-    if (hostdev->info->bootIndex) {
+    if (hostdev->info->bootIndex > 0) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("booting from assigned devices is not "
                          "supported by mediated devices of "
@@ -2687,7 +2687,7 @@ qemuValidateDomainDeviceDefHostdev(const virDomainHostdevDef *hostdev,
             break;
 
         case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
-            if (hostdev->info->bootIndex) {
+            if (hostdev->info->bootIndex > 0) {
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                                _("booting from assigned devices is not "
                                  "supported by vhost SCSI devices"));
-- 
2.33.0



More information about the libvir-list mailing list