Each time we need to check whether a given migration capability is
supported by QEMU, we call query-migrate-capabilities QMP command and
lookup the capability in the returned list. Asking for the list of
supported capabilities once when we connect to QEMU and storing the
result in a bitmap is much better and we don't need to enter a monitor
just to check whether a migration capability is supported.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
src/qemu/qemu_domain.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_domain.h | 9 +++++++
src/qemu/qemu_process.c | 13 +---------
3 files changed, 78 insertions(+), 12 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 05e8b96aa4..a8cabc5727 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1767,6 +1767,9 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivatePtr priv)
priv->namespaces = NULL;
priv->reconnectBlockjobs = VIR_TRISTATE_BOOL_ABSENT;
+
+ virBitmapFree(priv->migrationCaps);
+ priv->migrationCaps = NULL;
}
@@ -10122,3 +10125,68 @@ qemuDomainGetMachineName(virDomainObjPtr vm)
return ret;
}
+
+
+int
+qemuDomainCheckMigrationCapabilities(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ qemuDomainAsyncJob asyncJob)
+{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ char **caps = NULL;
+ char **capStr;
+ int ret = -1;
+ int rc;
+
+ if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
+ return -1;
+
+ rc = qemuMonitorGetMigrationCapabilities(priv->mon, &caps);
+
+ if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
+ goto cleanup;
+
+ if (!caps) {
+ ret = 0;
+ goto cleanup;
+ }
+
+ priv->migrationCaps = virBitmapNew(QEMU_MONITOR_MIGRATION_CAPS_LAST);
+ if (!priv->migrationCaps)
+ goto cleanup;
+
+ for (capStr = caps; *capStr; capStr++) {
+ int cap = qemuMonitorMigrationCapsTypeFromString(*capStr);
+
+ if (cap < 0) {
+ VIR_DEBUG("Unknown migration capability: '%s'", *capStr);
+ } else {
+ ignore_value(virBitmapSetBit(priv->migrationCaps, cap));
+ VIR_DEBUG("Found migration capability: '%s'", *capStr);
+ }
+ }
+
+ if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT)) {
+ if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
+ goto cleanup;
+
+ rc = qemuMonitorSetMigrationCapability(priv->mon,
+ QEMU_MONITOR_MIGRATION_CAPS_EVENTS,
+ true);
+
+ if (qemuDomainObjExitMonitor(driver, vm) < 0)
+ goto cleanup;
+
+ if (rc < 0) {
+ virResetLastError();
+ VIR_DEBUG("Cannot enable migration events; clearing capability");
+ virQEMUCapsClear(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT);
+ }
+ }
+
+ ret = 0;
+
+ cleanup:
+ virStringListFree(caps);
+ return ret;
+}
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 5201c6a0ac..fb20d8ea63 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -323,6 +323,10 @@ struct _qemuDomainObjPrivate {
/* Tracks blockjob state for vm. Valid only while reconnecting to qemu. */
virTristateBool reconnectBlockjobs;
+
+ /* Migration capabilities. Rechecked on reconnect, not to be saved in
+ * private XML. */
+ virBitmapPtr migrationCaps;
};
# define QEMU_DOMAIN_PRIVATE(vm) \
@@ -978,4 +982,9 @@ qemuDomainFixupCPUs(virDomainObjPtr vm,
char *
qemuDomainGetMachineName(virDomainObjPtr vm);
+int
+qemuDomainCheckMigrationCapabilities(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ qemuDomainAsyncJob asyncJob);
+
#endif /* __QEMU_DOMAIN_H__ */
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 24675498a2..cea2f90ce1 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -1816,18 +1816,7 @@ qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm, int asyncJob,
if (qemuProcessInitMonitor(driver, vm, asyncJob) < 0)
return -1;
- if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
- return -1;
-
- if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT) &&
- qemuMonitorSetMigrationCapability(priv->mon,
- QEMU_MONITOR_MIGRATION_CAPS_EVENTS,
- true) < 0) {
- VIR_DEBUG("Cannot enable migration events; clearing capability");
- virQEMUCapsClear(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT);
- }
-
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
+ if (qemuDomainCheckMigrationCapabilities(driver, vm, asyncJob) < 0)
return -1;
return 0;
--
2.14.2
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On 10/18/2017 07:29 AM, Jiri Denemark wrote: > Each time we need to check whether a given migration capability is > supported by QEMU, we call query-migrate-capabilities QMP command and > lookup the capability in the returned list. Asking for the list of > supported capabilities once when we connect to QEMU and storing the > result in a bitmap is much better and we don't need to enter a monitor > just to check whether a migration capability is supported. > > Signed-off-by: Jiri Denemark <jdenemar@redhat.com> > --- > src/qemu/qemu_domain.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ > src/qemu/qemu_domain.h | 9 +++++++ > src/qemu/qemu_process.c | 13 +--------- > 3 files changed, 78 insertions(+), 12 deletions(-) > There's no corresponding adjustment to qemuDomainObjPrivateXMLFormat and qemuDomainObjPrivateXMLParse in order to handle the restart scenario. The rest of this looks OK, but do you need the Format/Parse logic for the bitmap? It was late in my day and I was too lazy to go chase seeing as I already did the merging ;-) John > diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c > index 05e8b96aa4..a8cabc5727 100644 > --- a/src/qemu/qemu_domain.c > +++ b/src/qemu/qemu_domain.c > @@ -1767,6 +1767,9 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivatePtr priv) > priv->namespaces = NULL; > > priv->reconnectBlockjobs = VIR_TRISTATE_BOOL_ABSENT; > + > + virBitmapFree(priv->migrationCaps); > + priv->migrationCaps = NULL; > } > > > @@ -10122,3 +10125,68 @@ qemuDomainGetMachineName(virDomainObjPtr vm) > > return ret; > } > + > + > +int > +qemuDomainCheckMigrationCapabilities(virQEMUDriverPtr driver, > + virDomainObjPtr vm, > + qemuDomainAsyncJob asyncJob) > +{ > + qemuDomainObjPrivatePtr priv = vm->privateData; > + char **caps = NULL; > + char **capStr; > + int ret = -1; > + int rc; > + > + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) > + return -1; > + > + rc = qemuMonitorGetMigrationCapabilities(priv->mon, &caps); > + > + if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) > + goto cleanup; > + > + if (!caps) { > + ret = 0; > + goto cleanup; > + } > + > + priv->migrationCaps = virBitmapNew(QEMU_MONITOR_MIGRATION_CAPS_LAST); > + if (!priv->migrationCaps) > + goto cleanup; > + > + for (capStr = caps; *capStr; capStr++) { > + int cap = qemuMonitorMigrationCapsTypeFromString(*capStr); > + > + if (cap < 0) { > + VIR_DEBUG("Unknown migration capability: '%s'", *capStr); > + } else { > + ignore_value(virBitmapSetBit(priv->migrationCaps, cap)); > + VIR_DEBUG("Found migration capability: '%s'", *capStr); > + } > + } > + > + if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT)) { > + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) > + goto cleanup; > + > + rc = qemuMonitorSetMigrationCapability(priv->mon, > + QEMU_MONITOR_MIGRATION_CAPS_EVENTS, > + true); > + > + if (qemuDomainObjExitMonitor(driver, vm) < 0) > + goto cleanup; > + > + if (rc < 0) { > + virResetLastError(); > + VIR_DEBUG("Cannot enable migration events; clearing capability"); > + virQEMUCapsClear(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT); > + } > + } > + > + ret = 0; > + > + cleanup: > + virStringListFree(caps); > + return ret; > +} > diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h > index 5201c6a0ac..fb20d8ea63 100644 > --- a/src/qemu/qemu_domain.h > +++ b/src/qemu/qemu_domain.h > @@ -323,6 +323,10 @@ struct _qemuDomainObjPrivate { > > /* Tracks blockjob state for vm. Valid only while reconnecting to qemu. */ > virTristateBool reconnectBlockjobs; > + > + /* Migration capabilities. Rechecked on reconnect, not to be saved in > + * private XML. */ > + virBitmapPtr migrationCaps; > }; > > # define QEMU_DOMAIN_PRIVATE(vm) \ > @@ -978,4 +982,9 @@ qemuDomainFixupCPUs(virDomainObjPtr vm, > char * > qemuDomainGetMachineName(virDomainObjPtr vm); > > +int > +qemuDomainCheckMigrationCapabilities(virQEMUDriverPtr driver, > + virDomainObjPtr vm, > + qemuDomainAsyncJob asyncJob); > + > #endif /* __QEMU_DOMAIN_H__ */ > diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c > index 24675498a2..cea2f90ce1 100644 > --- a/src/qemu/qemu_process.c > +++ b/src/qemu/qemu_process.c > @@ -1816,18 +1816,7 @@ qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm, int asyncJob, > if (qemuProcessInitMonitor(driver, vm, asyncJob) < 0) > return -1; > > - if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) > - return -1; > - > - if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT) && > - qemuMonitorSetMigrationCapability(priv->mon, > - QEMU_MONITOR_MIGRATION_CAPS_EVENTS, > - true) < 0) { > - VIR_DEBUG("Cannot enable migration events; clearing capability"); > - virQEMUCapsClear(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT); > - } > - > - if (qemuDomainObjExitMonitor(driver, vm) < 0) > + if (qemuDomainCheckMigrationCapabilities(driver, vm, asyncJob) < 0) > return -1; > > return 0; > -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
On Thu, Oct 19, 2017 at 18:30:53 -0400, John Ferlan wrote: > > > On 10/18/2017 07:29 AM, Jiri Denemark wrote: > > Each time we need to check whether a given migration capability is > > supported by QEMU, we call query-migrate-capabilities QMP command and > > lookup the capability in the returned list. Asking for the list of > > supported capabilities once when we connect to QEMU and storing the > > result in a bitmap is much better and we don't need to enter a monitor > > just to check whether a migration capability is supported. > > > > Signed-off-by: Jiri Denemark <jdenemar@redhat.com> > > --- > > src/qemu/qemu_domain.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ > > src/qemu/qemu_domain.h | 9 +++++++ > > src/qemu/qemu_process.c | 13 +--------- > > 3 files changed, 78 insertions(+), 12 deletions(-) > > > > There's no corresponding adjustment to qemuDomainObjPrivateXMLFormat and > qemuDomainObjPrivateXMLParse in order to handle the restart scenario. > > The rest of this looks OK, but do you need the Format/Parse logic for > the bitmap? No. The migration capabilities are rechecked every time libvirt connects to QEMU as said in the commit message and in qemu_domain.h: > > diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h > > index 5201c6a0ac..fb20d8ea63 100644 > > --- a/src/qemu/qemu_domain.h > > +++ b/src/qemu/qemu_domain.h > > @@ -323,6 +323,10 @@ struct _qemuDomainObjPrivate { > > > > /* Tracks blockjob state for vm. Valid only while reconnecting to qemu. */ > > virTristateBool reconnectBlockjobs; > > + > > + /* Migration capabilities. Rechecked on reconnect, not to be saved in > > + * private XML. */ > > + virBitmapPtr migrationCaps; > > }; Jirka -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
On 10/20/2017 03:03 AM, Jiri Denemark wrote: > On Thu, Oct 19, 2017 at 18:30:53 -0400, John Ferlan wrote: >> >> >> On 10/18/2017 07:29 AM, Jiri Denemark wrote: >>> Each time we need to check whether a given migration capability is >>> supported by QEMU, we call query-migrate-capabilities QMP command and >>> lookup the capability in the returned list. Asking for the list of >>> supported capabilities once when we connect to QEMU and storing the >>> result in a bitmap is much better and we don't need to enter a monitor >>> just to check whether a migration capability is supported. >>> >>> Signed-off-by: Jiri Denemark <jdenemar@redhat.com> >>> --- >>> src/qemu/qemu_domain.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ >>> src/qemu/qemu_domain.h | 9 +++++++ >>> src/qemu/qemu_process.c | 13 +--------- >>> 3 files changed, 78 insertions(+), 12 deletions(-) >>> >> >> There's no corresponding adjustment to qemuDomainObjPrivateXMLFormat and >> qemuDomainObjPrivateXMLParse in order to handle the restart scenario. >> >> The rest of this looks OK, but do you need the Format/Parse logic for >> the bitmap? > > No. The migration capabilities are rechecked every time libvirt connects > to QEMU as said in the commit message and in qemu_domain.h: > OK, so to be official... Reviewed-by: John Ferlan <jferlan@redhat.com> John >>> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h >>> index 5201c6a0ac..fb20d8ea63 100644 >>> --- a/src/qemu/qemu_domain.h >>> +++ b/src/qemu/qemu_domain.h >>> @@ -323,6 +323,10 @@ struct _qemuDomainObjPrivate { >>> >>> /* Tracks blockjob state for vm. Valid only while reconnecting to qemu. */ >>> virTristateBool reconnectBlockjobs; >>> + >>> + /* Migration capabilities. Rechecked on reconnect, not to be saved in >>> + * private XML. */ >>> + virBitmapPtr migrationCaps; >>> }; > > Jirka > -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
On Fri, Oct 20, 2017 at 07:08:37 -0400, John Ferlan wrote: > > > On 10/20/2017 03:03 AM, Jiri Denemark wrote: > > On Thu, Oct 19, 2017 at 18:30:53 -0400, John Ferlan wrote: > >> > >> > >> On 10/18/2017 07:29 AM, Jiri Denemark wrote: > >>> Each time we need to check whether a given migration capability is > >>> supported by QEMU, we call query-migrate-capabilities QMP command and > >>> lookup the capability in the returned list. Asking for the list of > >>> supported capabilities once when we connect to QEMU and storing the > >>> result in a bitmap is much better and we don't need to enter a monitor > >>> just to check whether a migration capability is supported. > >>> > >>> Signed-off-by: Jiri Denemark <jdenemar@redhat.com> > >>> --- > >>> src/qemu/qemu_domain.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ > >>> src/qemu/qemu_domain.h | 9 +++++++ > >>> src/qemu/qemu_process.c | 13 +--------- > >>> 3 files changed, 78 insertions(+), 12 deletions(-) > >>> > >> > >> There's no corresponding adjustment to qemuDomainObjPrivateXMLFormat and > >> qemuDomainObjPrivateXMLParse in order to handle the restart scenario. > >> > >> The rest of this looks OK, but do you need the Format/Parse logic for > >> the bitmap? > > > > No. The migration capabilities are rechecked every time libvirt connects > > to QEMU as said in the commit message and in qemu_domain.h: > > > > OK, so to be official... > > Reviewed-by: John Ferlan <jferlan@redhat.com> I pushed this series. Thanks for the review. Jirka -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
© 2016 - 2025 Red Hat, Inc.