Implement qemuDomainGetDirtyRateInfo: using flags to control behaviors
-- calculate and/or query dirtyrate. Default flag is both calculate
and query.
Signed-off-by: Hao Wang <wanghao232(a)huawei.com>
Reviewed-by: Chuan Zheng <zhengchuan(a)huawei.com>
---
src/qemu/qemu_driver.c | 67 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 67 insertions(+)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index ed840a5c8d..2b9ce1c386 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -20289,6 +20289,72 @@ qemuDomainAuthorizedSSHKeysSet(virDomainPtr dom,
}
+#define MIN_DIRTYRATE_CALCULATION_PERIOD 1 /* supported min dirtyrate calc time: 1s */
+#define MAX_DIRTYRATE_CALCULATION_PERIOD 60 /* supported max dirtyrate calc time: 60s */
+
+static int
+qemuDomainGetDirtyRateInfo(virDomainPtr dom,
+ virDomainDirtyRateInfoPtr info,
+ int sec,
+ unsigned int flags)
+{
+ virQEMUDriverPtr driver = dom->conn->privateData;
+ virDomainObjPtr vm = NULL;
+ int ret = -1;
+
+ if (!(vm = qemuDomainObjFromDomain(dom)))
+ return -1;
+
+ if (virDomainGetDirtyRateInfoEnsureACL(dom->conn, vm->def) < 0)
+ goto cleanup;
+
+ if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
+ goto cleanup;
+
+ /* flags is default to both calculate and query */
+ if (flags == VIR_DOMAIN_DIRTYRATE_DEFAULT)
+ flags |= VIR_DOMAIN_DIRTYRATE_CALC | VIR_DOMAIN_DIRTYRATE_QUERY;
+
+ /* calculating */
+ if (flags & VIR_DOMAIN_DIRTYRATE_CALC) {
+ if (sec < MIN_DIRTYRATE_CALCULATION_PERIOD ||
+ sec > MAX_DIRTYRATE_CALCULATION_PERIOD) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("seconds=%d is invalid, please choose value within [%d,
%d]."),
+ sec,
+ MIN_DIRTYRATE_CALCULATION_PERIOD,
+ MAX_DIRTYRATE_CALCULATION_PERIOD);
+ goto endjob;
+ }
+
+ if (qemuDomainCalculateDirtyRate(driver, vm, sec) < 0)
+ goto endjob;
+ }
+
+ /* querying */
+ if (flags & VIR_DOMAIN_DIRTYRATE_QUERY) {
+ /* wait sec and extra 50ms to let last calculation finish */
+ if (flags & VIR_DOMAIN_DIRTYRATE_CALC) {
+ virObjectUnlock(vm);
+ g_usleep((sec * 1000 + 50) * 1000);
+ virObjectLock(vm);
+ }
+
+ if (qemuDomainQueryDirtyRate(driver, vm, info) < 0)
+ goto endjob;
+ }
+
+ ret = 0;
+
+ endjob:
+ qemuDomainObjEndJob(driver, vm);
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return ret;
+}
+
+
static virHypervisorDriver qemuHypervisorDriver = {
.name = QEMU_DRIVER_NAME,
.connectURIProbe = qemuConnectURIProbe,
@@ -20530,6 +20596,7 @@ static virHypervisorDriver qemuHypervisorDriver = {
.domainBackupGetXMLDesc = qemuDomainBackupGetXMLDesc, /* 6.0.0 */
.domainAuthorizedSSHKeysGet = qemuDomainAuthorizedSSHKeysGet, /* 6.10.0 */
.domainAuthorizedSSHKeysSet = qemuDomainAuthorizedSSHKeysSet, /* 6.10.0 */
+ .domainGetDirtyRateInfo = qemuDomainGetDirtyRateInfo, /* 7.1.0 */
};
--
2.23.0