On 2022/11/22 23:02, Peter Krempa wrote:
On Thu, Nov 17, 2022 at 10:05:28 +0800, Jiang Jiacheng wrote:
> Add a bool bootIndexSpecified into _virDomainDeviceInfo, which means whether
> the bootindex could be update or not. BootIndexSpecified will be set to
> true if bootindex is set in XML.
> Support set bootindex to 0, which means cancel the previous bootindex setting,
> and format boot order = '0' into XML when its bootIndexSpecified is true to
> keep its bootindex changeble.
>
> Signed-off-by: Jiang Jiacheng <jiangjiacheng(a)huawei.com>
> ---
> src/conf/device_conf.h | 3 +++
> src/conf/domain_conf.c | 9 ++++++---
> 2 files changed, 9 insertions(+), 3 deletions(-)
You'll need to note in the documentation the special 0 value and how it
behaves when updating a device.
In case where you disagree with my comment below that the bootindex
should not be in the output XML you'll also need to add XML2XML test
cases.
Well, I think I should organize and describe my patches better. My
patches only support update and cancel the bootindex which has been set
in the domain'xml, and don't support add bootindex to a device whose
bootindex hasn't been set.
The new parameter 'bootIndexSpecified' in _virDomainDeviceInfo is used
to distinguish whether the bootindex is specified or not. It is set to
true only when device's bootindex is specified in domain'xml, which
means the device's bootindex could be changed after.
The special 0 is used to cancel the bootindex setting. We get bootindex
= 0 if the bootindex isn't set or specified to 0 in the device's xml.
Update with bootindex = 0 should not effect 'bootIndexSpecified', since
the device's bootindex can still be changed after canceling.
However, we only get the 'bootIndexSpecified' when parsing the domian's
xml, to keep it true with devices whose bootindex is canceld, I format
'boot order = 0' into xml. I do need a XML2XML case here.
If all devices' bootindex is set to 0, qemu will boot in an default
sequence 'disk->cdrom->net' in those devices.
> diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h
> index f2907dc596..5259e25c10 100644
> --- a/src/conf/device_conf.h
> +++ b/src/conf/device_conf.h
> @@ -144,6 +144,9 @@ struct _virDomainDeviceInfo {
> * not formatted back. This allows HV drivers to update it if <os><boot
..
> * is present. */
> unsigned int effectiveBootIndex;
> + /* bootIndexSpecified is set to true when device's bootIndex is provided in
> + * the XML. This allows changing bootIndex online of some devices. */
> + bool bootIndexSpecified;
> /* 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 3790121cf7..dcd9696a93 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -5142,7 +5142,10 @@ virDomainDeviceInfoFormat(virBuffer *buf,
> g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
> g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
>
> - if ((flags & VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT) &&
info->bootIndex) {
> + if ((flags & VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT) &&
(info->bootIndex || info->bootIndexSpecified)) {
> + /* format the boot order = 0 in XML when its bootIndexSpecified is true,
> + * which means the boot order could be changed by virsh update-device.
> + */
I'm not persuaded that the logic here needs changing. If the boot index
is 0 and the device is not bootable we should avoid the element. This
includes cases where the device was updated in order co clear the boot
index.
As I mentioned before, the 'boot order = 0' will be format into xml only
when bootIndexSpecified is true. BootIndexSpecified is set to true only
if the device is bootable and it's bootindex is specified when starting
the domain, and it could not be changed after the domain started.
> virBufferAsprintf(buf, "<boot
order='%u'", info->bootIndex);
>
> if (info->loadparm)
> @@ -5304,12 +5307,12 @@ virDomainDeviceBootParseXML(xmlNodePtr node,
> {
> g_autofree char *loadparm = NULL;
>
> - if (virXMLPropUInt(node, "order", 10,
> - VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO,
> + if (virXMLPropUInt(node, "order", 10, VIR_XML_PROP_REQUIRED,
> &info->bootIndex) < 0)
> return -1;
>
> info->effectiveBootIndex = info->bootIndex;
> + info->bootIndexSpecified = true;
>
> loadparm = virXMLPropString(node, "loadparm");
> if (loadparm) {
> --
> 2.33.0
>