1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-20 06:50:22 +03:00

hypervisor: add support for delay interval during autostart

This delay can reduce the CPU/IO load storm when autostarting many
guests.

Reviewed-by: Peter Krempa <pkrempa@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2024-12-16 19:45:23 +00:00
parent c23554fc34
commit 1e9d58ef49
2 changed files with 19 additions and 3 deletions

View File

@ -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);
}

View File

@ -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,