On 2022/11/22 22:36, Peter Krempa Wrote:
> On Thu, Nov 17, 2022 at 10:05:27 +0800, Jiang Jiacheng wrote:
>> Introduce qemuDomainChangeBootIndex api to support update device's bootindex.
>> These function will be used in following patches to support change device's
>> (support cdrom, disk and net) bootindex with virsh command like
>> 'virsh update-device <domain> <file> [--flag]'.
>>
>> Signed-off-by: Jiang Jiacheng <jiangjiach...@huawei.com>
>> ---
>> src/qemu/qemu_conf.c | 40 ++++++++++++++++++++++++++++++++++++
>> src/qemu/qemu_conf.h | 5 +++++
>> src/qemu/qemu_monitor.c | 20 ++++++++++++++++++
>> src/qemu/qemu_monitor.h | 6 ++++++
>> src/qemu/qemu_monitor_json.c | 33 +++++++++++++++++++++++++++++
>> src/qemu/qemu_monitor_json.h | 6 ++++++
>> 6 files changed, 110 insertions(+)
>>
>> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
>> index ae5bbcd138..0071a95cb6 100644
>> --- a/src/qemu/qemu_conf.c
>> +++ b/src/qemu/qemu_conf.c
>> @@ -1641,3 +1641,43 @@ qemuHugepageMakeBasedir(virQEMUDriver *driver,
>>
>> return 0;
>> }
>> +
>> +/**
>> + * qemuDomainChangeBootIndex:
>> + * @vm: domain object
>> + * @devInfo: origin device info
>> + * @newBootIndex: new bootIndex
>> + *
>> + * check the alias and bootindex before send the command
>
> This description doesn't make sense. Please describe what effect the
> function is supposed to have on the VM, not that it does checks. Readers
> of the code would have to dig deep to figure out what is going on.
>
> Example:
>
> Live-update the bootindex of device @devInfo. @newBootIndex of 0
> disables booting of the given device.
>
I see, I'll better describe my functions in the next patch.
>> + *
>> + * Returns: 0 on success,
>> + * -1 otherwise.
>
> Generally this behaviour is assumed, so there's no specific need for
> this part of the comment.
>
>> + */
>> +int
>> +qemuDomainChangeBootIndex(virDomainObj *vm,
>> + virDomainDeviceInfo *devInfo,
>> + int newBootIndex)
>> +{
>> + int ret = -1;
>> + int dummyIndex = -1;
>
> This variable is not needed. You can either pass the constant directly
> or overwrite teh 'newBootIndex' argument.
>
>> + qemuDomainObjPrivate *priv = vm->privateData;
>> +
>> + if (!devInfo->alias) {
>> + virReportError(VIR_ERR_OPERATION_FAILED, "%s",
>> + _("cannot change boot index: device alias not
>> found"));
>> + return -1;
>
> Previously I mentioned that using the shortcut of alias as qom path is
> not something we do normally. I didn't get to check why libvirt is
> looking up the full qom path in most cases. Perhaps you can explain why
> using an alias is sufficient. (E.g. by checking that qemu-4.2 and newer
> supported it).
>
>
I have tried it on qemu-4.1 and qemu-6.2 and they both work will. And
the alias of device is unique to the domain, so I think it's okay to use
alias here.
>> + }
>> +
>> + VIR_DEBUG("Change dev: %s boot index from %d to %d", devInfo->alias,
>> + devInfo->bootIndex, newBootIndex);
>
> Replace the below by:
>
> /* To clear the boot index in qemu we must set it to -1 */
> if (newBootIndex == 0)
> newBootIndex = -1;
>
> qemuDomainObjEnterMonitor(vm);
> ret = qemuMonitorSetBootIndex(priv->mon, devInfo->alias, newBootIndex);
> qemuDomainObjExitMonitor(vm);
>
>
Thanks for your suggestion, I will modify it in next version.
>> +
>> + qemuDomainObjEnterMonitor(vm);
>> + /* newBootIndex = 0 means cancel the specified bootIndex, send -1 to
>> qemu instead */
>> + if (!newBootIndex)
>> + ret = qemuMonitorSetBootIndex(priv->mon, devInfo->alias,
>> dummyIndex);
>> + else
>> + ret = qemuMonitorSetBootIndex(priv->mon, devInfo->alias,
>> newBootIndex);
>> + qemuDomainObjExitMonitor(vm);
>> +
>> + return ret;
>> +}
>
> [...]
>
>> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
>> index 80f262cec7..2b89d9bdae 100644
>> --- a/src/qemu/qemu_monitor.c
>> +++ b/src/qemu/qemu_monitor.c
>> @@ -4491,3 +4491,23 @@ qemuMonitorGetStatsByQOMPath(virJSONValue *arr,
>>
>> return NULL;
>> }
>> +
>> +/**
>> + * qemuMonitorSetBootIndex:
>> + * @mon: monitor object
>> + * @alias: device's alias
>> + * @bootIndex: new boot index
>> + *
>> + * Returns data from a call to 'qom-set'
>
> Once again, this description doesn't explain anything here. You either
> omit it or explain what the actual effect is.
>
>> + */
>> +int
>> +qemuMonitorSetBootIndex(qemuMonitor *mon,
>> + const char *alias,
>> + int bootIndex)
>> +{
>> + VIR_DEBUG("name=%s, bootIndex=%d", alias, bootIndex);
>> +
>> + QEMU_CHECK_MONITOR(mon);
>> +
>> + return qemuMonitorJSONSetBootIndex(mon, alias, bootIndex);
>> +}
>
> [...]
>
>> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
>> index f4e942a32f..75de73e61b 100644
>> --- a/src/qemu/qemu_monitor_json.c
>> +++ b/src/qemu/qemu_monitor_json.c
>> @@ -8890,3 +8890,36 @@ qemuMonitorJSONQueryStats(qemuMonitor *mon,
>>
>> return virJSONValueObjectStealArray(reply, "return");
>> }
>> +
>> +/**
>> + * qemuMonitorSetBootIndex:
>> + * @mon: monitor object
>> + * @alias: device's alias
>> + * @bootIndex: new boot index
>> + *
>> + * Set the bootindex of device to new bootIndex
>> + *
>> + * Returns: 0 on success,
>> + * -1 otherwise.
>
> See above.
>
>> + */
>> +int
>> +qemuMonitorJSONSetBootIndex(qemuMonitor *mon,
>> + const char *alias,
>> + int bootIndex)
>> +{
>> + g_autoptr(virJSONValue) cmd = NULL;
>> + g_autoptr(virJSONValue) reply = NULL;
>> +
>> + if (!(cmd = qemuMonitorJSONMakeCommand("qom-set", "s:path", alias,
>> + "s:property", "bootindex",
>> + "i:value", bootIndex, NULL)))
>> + return -1;
>> +
>> + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
>> + return -1;
>> +
>> + if (qemuMonitorJSONCheckError(cmd, reply) < 0)
>> + return -1;
>> +
>> + return 0;
>> +}
>