On Wed, Aug 22, 2012 at 05:04:57PM +0800, Daniel Veillard wrote: > On Tue, Aug 21, 2012 at 05:18:44PM +0800, Hu Tao wrote: > > From: Wen Congyang <wency@xxxxxxxxxxxxxx> > > > > allow the user change/get emulator's period and quota when the vm is running. > > --- > > src/qemu/qemu_driver.c | 133 +++++++++++++++++++++++++++++++++++++++++++++++- > > 1 file changed, 132 insertions(+), 1 deletion(-) > > > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > > index 8314375..0e7dc32 100644 > > --- a/src/qemu/qemu_driver.c > > +++ b/src/qemu/qemu_driver.c > > @@ -6603,7 +6603,7 @@ static char *qemuGetSchedulerType(virDomainPtr dom, > > else if (rc == 0) > > *nparams = 1; > > else > > - *nparams = 3; > > + *nparams = 5; > > } > > > > ret = strdup("posix"); > > @@ -7734,6 +7734,40 @@ cleanup: > > } > > > > static int > > +qemuSetEmulatorBandwidthLive(virDomainObjPtr vm, virCgroupPtr cgroup, > > + unsigned long long period, long long quota) > > +{ > > + qemuDomainObjPrivatePtr priv = vm->privateData; > > + virCgroupPtr cgroup_emulator = NULL; > > + int rc; > > + > > + if (period == 0 && quota == 0) > > + return 0; > > + > > + if (priv->nvcpupids == 0 || priv->vcpupids[0] == vm->pid) { > > + return 0; > > + } > > + > > + rc = virCgroupForEmulator(cgroup, &cgroup_emulator, 0); > > + if (rc < 0) { > > + virReportSystemError(-rc, > > + _("Unable to find emulator cgroup for %s"), > > + vm->def->name); > > + goto cleanup; > > + } > > + > > + if (qemuSetupCgroupVcpuBW(cgroup_emulator, period, quota) < 0) > > + goto cleanup; > > + > > + virCgroupFree(&cgroup_emulator); > > + return 0; > > + > > +cleanup: > > + virCgroupFree(&cgroup_emulator); > > + return -1; > > +} > > + > > +static int > > qemuSetSchedulerParametersFlags(virDomainPtr dom, > > virTypedParameterPtr params, > > int nparams, > > @@ -7756,6 +7790,10 @@ qemuSetSchedulerParametersFlags(virDomainPtr dom, > > VIR_TYPED_PARAM_ULLONG, > > VIR_DOMAIN_SCHEDULER_VCPU_QUOTA, > > VIR_TYPED_PARAM_LLONG, > > + VIR_DOMAIN_SCHEDULER_EMULATOR_PERIOD, > > + VIR_TYPED_PARAM_ULLONG, > > + VIR_DOMAIN_SCHEDULER_EMULATOR_QUOTA, > > + VIR_TYPED_PARAM_LLONG, > > NULL) < 0) > > return -1; > > > > @@ -7838,6 +7876,32 @@ qemuSetSchedulerParametersFlags(virDomainPtr dom, > > if (flags & VIR_DOMAIN_AFFECT_CONFIG) { > > vmdef->cputune.quota = params[i].value.l; > > } > > + } else if (STREQ(param->field, VIR_DOMAIN_SCHEDULER_EMULATOR_PERIOD)) { > > + if (flags & VIR_DOMAIN_AFFECT_LIVE) { > > + rc = qemuSetEmulatorBandwidthLive(vm, group, params[i].value.ul, 0); > > + if (rc != 0) > > + goto cleanup; > > + > > + if (params[i].value.ul) > > + vm->def->cputune.emulator_period = params[i].value.ul; > > + } > > + > > + if (flags & VIR_DOMAIN_AFFECT_CONFIG) { > > + vmdef->cputune.emulator_period = params[i].value.ul; > > + } > > + } else if (STREQ(param->field, VIR_DOMAIN_SCHEDULER_EMULATOR_QUOTA)) { > > + if (flags & VIR_DOMAIN_AFFECT_LIVE) { > > + rc = qemuSetEmulatorBandwidthLive(vm, group, 0, params[i].value.l); > > + if (rc != 0) > > + goto cleanup; > > + > > + if (params[i].value.l) > > + vm->def->cputune.emulator_quota = params[i].value.l; > > + } > > + > > + if (flags & VIR_DOMAIN_AFFECT_CONFIG) { > > + vmdef->cputune.emulator_quota = params[i].value.l; > > + } > > } > > } > > > > @@ -7942,6 +8006,43 @@ cleanup: > > } > > > > static int > > +qemuGetEmulatorBandwidthLive(virDomainObjPtr vm, virCgroupPtr cgroup, > > + unsigned long long *period, long long *quota) > > +{ > > + virCgroupPtr cgroup_emulator = NULL; > > + qemuDomainObjPrivatePtr priv = NULL; > > + int rc; > > + int ret = -1; > > + > > + priv = vm->privateData; > > + if (priv->nvcpupids == 0 || priv->vcpupids[0] == vm->pid) { > > + /* We don't create sub dir for each vcpu */ > > + *period = 0; > > + *quota = 0; > > + return 0; > > + } > > + > > + /* get period and quota for emulator */ > > + rc = virCgroupForEmulator(cgroup, &cgroup_emulator, 0); > > + if (!cgroup_emulator) { > > + virReportSystemError(-rc, > > + _("Unable to find emulator cgroup for %s"), > > + vm->def->name); > > + goto cleanup; > > + } > > + > > + rc = qemuGetVcpuBWLive(cgroup_emulator, period, quota); > > + if (rc < 0) > > + goto cleanup; > > + > > + ret = 0; > > + > > +cleanup: > > + virCgroupFree(&cgroup_emulator); > > + return ret; > > +} > > + > > +static int > > qemuGetSchedulerParametersFlags(virDomainPtr dom, > > virTypedParameterPtr params, > > int *nparams, > > @@ -7953,6 +8054,8 @@ qemuGetSchedulerParametersFlags(virDomainPtr dom, > > unsigned long long shares; > > unsigned long long period; > > long long quota; > > + unsigned long long emulator_period; > > + long long emulator_quota; > > int ret = -1; > > int rc; > > bool cpu_bw_status = false; > > @@ -7992,6 +8095,8 @@ qemuGetSchedulerParametersFlags(virDomainPtr dom, > > if (*nparams > 1 && cpu_bw_status) { > > period = persistentDef->cputune.period; > > quota = persistentDef->cputune.quota; > > + emulator_period = persistentDef->cputune.emulator_period; > > + emulator_quota = persistentDef->cputune.emulator_quota; > > } > > goto out; > > } > > @@ -8020,6 +8125,14 @@ qemuGetSchedulerParametersFlags(virDomainPtr dom, > > if (rc != 0) > > goto cleanup; > > } > > + > > + if (*nparams > 3 && cpu_bw_status) { > > + rc = qemuGetEmulatorBandwidthLive(vm, group, &emulator_period, > > + &emulator_quota); > > + if (rc != 0) > > + goto cleanup; > > + } > > + > > out: > > if (virTypedParameterAssign(¶ms[0], VIR_DOMAIN_SCHEDULER_CPU_SHARES, > > VIR_TYPED_PARAM_ULLONG, shares) < 0) > > @@ -8042,6 +8155,24 @@ out: > > goto cleanup; > > saved_nparams++; > > } > > + > > + if (*nparams > saved_nparams) { > > + if (virTypedParameterAssign(¶ms[3], > > + VIR_DOMAIN_SCHEDULER_EMULATOR_PERIOD, > > + VIR_TYPED_PARAM_ULLONG, > > + emulator_period) < 0) > > + goto cleanup; > > + saved_nparams++; > > + } > > + > > + if (*nparams > saved_nparams) { > > + if (virTypedParameterAssign(¶ms[4], > > + VIR_DOMAIN_SCHEDULER_EMULATOR_QUOTA, > > + VIR_TYPED_PARAM_LLONG, > > + emulator_quota) < 0) > > + goto cleanup; > > + saved_nparams++; > > + } > > } > > > > *nparams = saved_nparams; > > Okay, we now have 5 parameters instead of 3. that looks fine, ACK, > > the question I have is if virsh is actually able to display the 5 > parameters by default now, if yes the patch set seems complete ! Indeed. The virsh output here is: virsh schedinfo example-domain Scheduler : posix cpu_shares : 1024 vcpu_period : 100000 vcpu_quota : -1 emulator_period: 400000 emulator_quota : 100000 -- Thanks, Hu Tao -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list