[libvirt] [PATCH v2.1 21/21] qemu: support of emulator_period and emulator_quota's modification
Hu Tao
hutao at cn.fujitsu.com
Wed Aug 22 09:19:32 UTC 2012
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 at cn.fujitsu.com>
> >
> > 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
More information about the libvir-list
mailing list