[libvirt] [PATCH 7/8] qemu: support updating interface with boot index
John Ferlan
jferlan at redhat.com
Tue Feb 3 01:41:43 UTC 2015
On 01/05/2015 02:29 AM, Wang Rui wrote:
> QEMU supported to set device's boot index online recently(since QEMU 2.2.0).
> This patch implements the interface's boot index update lively.
>
> If PCI address is not specified in the new xml, we can also update boot
> index. If boot order is not specified in the new xml, we take it as canceling
> boot index. So pass "value":-1 to qmp command("qom-set") to cancel boot index.
>
> Signed-off-by: Wang Rui <moon.wangrui at huawei.com>
> Signed-off-by: Zhou Yimin <zhouyimin at huawei.com>
> ---
> src/qemu/qemu_hotplug.c | 35 ++++++++++++++++++++++++++++++-----
> 1 file changed, 30 insertions(+), 5 deletions(-)
>
So now we're adding the same functionality to a network interface?
Maybe a better description above would help me understand what you're
trying to accomplish.
Perhaps let's get the disk devices to be all set before taking this path
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 5eacfce..4c86370 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -1814,6 +1814,7 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
> bool needLinkStateChange = false;
> bool needReplaceDevDef = false;
> bool needBandwidthSet = false;
> + bool needBootIndexChange = false;
> int ret = -1;
>
> if (!devslot || !(olddev = *devslot)) {
> @@ -1909,6 +1910,19 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
> goto cleanup;
> }
>
> + /* If(and olny if) PCI adderss is not specified in the new xml, newdev->info.type
s/If(and olny if)/If (and only if) a
s/adderss/address
Going back a few patches for attach & update and my concern over whether
the XML has an address already or not - this shows why I was concerned.
If you don't yet have an address you could possibly match something
that you weren't expecting to or not match something...
I didn't look too much deeper here.
BTW: If you're adding network, you'll need to document that.
John
> + * here is NONE. We can copy the old device's PCI address to the new one. We can't
> + * copy olddev->info to newdev->info, because other members in newdev->info(such
> + * as bootIndex) should not be overridden.
> + */
> + if (newdev->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
> + newdev->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
> + newdev->info.addr.pci.domain = olddev->info.addr.pci.domain;
> + newdev->info.addr.pci.bus = olddev->info.addr.pci.bus;
> + newdev->info.addr.pci.slot = olddev->info.addr.pci.slot;
> + newdev->info.addr.pci.function = olddev->info.addr.pci.function;
> + }
> +
> /* info: if newdev->info is empty, fill it in from olddev,
> * otherwise verify that it matches - nothing is allowed to
> * change. (There is no helper function to do this, so
> @@ -1945,11 +1959,6 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
> _("cannot modify network rom file"));
> goto cleanup;
> }
> - if (olddev->info.bootIndex != newdev->info.bootIndex) {
> - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
> - _("cannot modify network device boot index setting"));
> - goto cleanup;
> - }
> /* (end of device info checks) */
>
> if (STRNEQ_NULLABLE(olddev->filter, newdev->filter) ||
> @@ -2101,6 +2110,9 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
> virDomainNetGetActualBandwidth(newdev)))
> needBandwidthSet = true;
>
> + if (olddev->info.bootIndex != newdev->info.bootIndex)
> + needBootIndexChange = true;
> +
> /* FINALLY - actually perform the required actions */
>
> if (needReconnect) {
> @@ -2141,6 +2153,19 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
> goto cleanup;
> }
>
> + if (needBootIndexChange) {
> + /* If boot index is to be changed to 0, we can pass "value":-1 to
> + qmp command("qom-set") to cancel boot index. */
> + if (qemuDomainChangeBootIndex(driver, vm, &olddev->info,
> + newdev->info.bootIndex ?
> + newdev->info.bootIndex : -1) < 0)
> + goto cleanup;
> + /* we successfully switched to the new boot index, and we've
> + * determined that the rest of newdev is equivalent to olddev,
> + * so move newdev into place */
> + needReplaceDevDef = true;
> + }
> +
> if (needReplaceDevDef) {
> /* the changes above warrant replacing olddev with newdev in
> * the domain's nets list.
>
More information about the libvir-list
mailing list