This delay can reduce the CPU/IO load storm when autostarting many
guests.
Reviewed-by: Peter Krempa <pkrempa(a)redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/hypervisor/domain_driver.c | 20 +++++++++++++++++---
src/hypervisor/domain_driver.h | 2 ++
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/src/hypervisor/domain_driver.c b/src/hypervisor/domain_driver.c
index 596157545b..bea84cd09d 100644
--- a/src/hypervisor/domain_driver.c
+++ b/src/hypervisor/domain_driver.c
@@ -656,11 +656,16 @@ virDomainDriverGetIOThreadsConfig(virDomainDef *targetDef,
return ret;
}
+typedef struct _virDomainDriverAutoStartState {
+ virDomainDriverAutoStartConfig *cfg;
+ bool first;
+} virDomainDriverAutoStartState;
+
static int
virDomainDriverAutoStartOne(virDomainObj *vm,
void *opaque)
{
- virDomainDriverAutoStartConfig *cfg = opaque;
+ virDomainDriverAutoStartState *state = opaque;
virObjectLock(vm);
virObjectRef(vm);
@@ -670,7 +675,15 @@ virDomainDriverAutoStartOne(virDomainObj *vm,
if (vm->autostart && !virDomainObjIsActive(vm)) {
virResetLastError();
- cfg->callback(vm, cfg->opaque);
+ if (state->cfg->delayMS) {
+ if (!state->first) {
+ g_usleep(state->cfg->delayMS * 1000ull);
+ } else {
+ state->first = false;
+ }
+ }
+
+ state->cfg->callback(vm, state->cfg->opaque);
}
virDomainObjEndAPI(&vm);
@@ -683,6 +696,7 @@ void
virDomainDriverAutoStart(virDomainObjList *domains,
virDomainDriverAutoStartConfig *cfg)
{
+ virDomainDriverAutoStartState state = { .cfg = cfg, .first = true };
bool autostart;
VIR_DEBUG("Run autostart stateDir=%s", cfg->stateDir);
if (virDriverShouldAutostart(cfg->stateDir, &autostart) < 0 ||
@@ -691,5 +705,5 @@ virDomainDriverAutoStart(virDomainObjList *domains,
return;
}
- virDomainObjListForEach(domains, false, virDomainDriverAutoStartOne, cfg);
+ virDomainObjListForEach(domains, false, virDomainDriverAutoStartOne, &state);
}
diff --git a/src/hypervisor/domain_driver.h b/src/hypervisor/domain_driver.h
index 2ad4e96f3e..f81d436c2c 100644
--- a/src/hypervisor/domain_driver.h
+++ b/src/hypervisor/domain_driver.h
@@ -84,6 +84,8 @@ typedef struct _virDomainDriverAutoStartConfig {
const char *stateDir;
virDomainDriverAutoStartCallback callback;
void *opaque;
+ unsigned int delayMS; /* milliseconds to wait between initiating the
+ * startup of each guest */
} virDomainDriverAutoStartConfig;
void virDomainDriverAutoStart(virDomainObjList *domains,
--
2.47.1