[libvirt] [PATCH 06/12] Implement driver interface domainSetMemoryParamters for QEmu
Nikunj A. Dadhania
nikunj at linux.vnet.ibm.com
Wed Sep 22 04:33:52 UTC 2010
On Tue, 21 Sep 2010 18:21:39 +0100, "Daniel P. Berrange" <berrange at redhat.com> wrote:
> On Mon, Sep 20, 2010 at 02:16:51PM +0530, Nikunj A. Dadhania wrote:
> > Driver interface for setting memory hard_limit, soft_limit and swap
> > hard_limit. This patch also NULLs the other HV driver interface structure.
> >
> > Signed-off-by: Nikunj A. Dadhania <nikunj at linux.vnet.ibm.com>
> > ---
> > src/esx/esx_driver.c | 1
> > src/lxc/lxc_driver.c | 1
> > src/openvz/openvz_driver.c | 1
> > src/phyp/phyp_driver.c | 1
> > src/qemu/qemu_driver.c | 93 ++++++++++++++++++++++++++++++++++++++++++++
> > src/remote/remote_driver.c | 1
> > src/test/test_driver.c | 1
> > src/uml/uml_driver.c | 1
> > src/xen/xen_driver.c | 1
> > 9 files changed, 101 insertions(+), 0 deletions(-)
> >
> > diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
> > index e382950..be55796 100644
> > --- a/src/esx/esx_driver.c
> > +++ b/src/esx/esx_driver.c
> > @@ -4217,6 +4217,7 @@ static virDriver esxDriver = {
> > esxDomainRevertToSnapshot, /* domainRevertToSnapshot */
> > esxDomainSnapshotDelete, /* domainSnapshotDelete */
> > NULL, /* qemuDomainMonitorCommand */
> > + NULL, /* domainSetMemoryParameters */
> > };
>
> All these bits should be in the patch which changes 'driver.h', so that
> the code compiles there.
>
> This patch needs just replace the 'NULL' with the real function for
> QEMU.
>
Sure, will do that.
> > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> > index c4aacc9..06666e9 100644
> > --- a/src/qemu/qemu_driver.c
> > +++ b/src/qemu/qemu_driver.c
> > @@ -9365,6 +9365,98 @@ cleanup:
> > return ret;
> > }
> >
> > +
> > +static int qemuDomainSetMemoryParameters(virDomainPtr dom,
> > + virMemoryParameterPtr params,
> > + int nparams)
> > +{
> > + struct qemud_driver *driver = dom->conn->privateData;
> > + int i;
> > + virCgroupPtr group = NULL;
> > + virDomainObjPtr vm = NULL;
> > + int ret = -1;
> > +
> > + qemuDriverLock(driver);
> > + if (!qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_MEMORY)) {
> > + qemuReportError(VIR_ERR_NO_SUPPORT,
> > + __FUNCTION__);
> > + goto cleanup;
> > + }
> > +
> > + vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> > +
> > + if (vm == NULL) {
> > + qemuReportError(VIR_ERR_INTERNAL_ERROR,
> > + _("No such domain %s"), dom->uuid);
> > + goto cleanup;
> > + }
> > +
> > + if (virCgroupForDomain(driver->cgroup, vm->def->name, &group, 0) != 0) {
> > + qemuReportError(VIR_ERR_INTERNAL_ERROR,
> > + _("cannot find cgroup for domain %s"), vm->def->name);
> > + goto cleanup;
> > + }
> > +
> > + for (i = 0; i < nparams; i++) {
> > + virMemoryParameterPtr param = ¶ms[i];
> > +
> > + if (STREQ(param->field, "hard_limit")) {
> > + int rc;
> > + if (param->type != VIR_DOMAIN_MEMORY_FIELD_ULLONG) {
> > + qemuReportError(VIR_ERR_INVALID_ARG, "%s",
> > + _("invalid type for memory hard_limit tunable, expected a 'ullong'"));
> > + continue;
> > + }
> > +
> > + rc = virCgroupSetMemoryHardLimit(group, params[i].value.ul);
> > + if (rc != 0) {
> > + virReportSystemError(-rc, "%s",
> > + _("unable to set memory hard_limit tunable"));
> > + }
> > + } else if (STREQ(param->field, "soft_limit")) {
> > + int rc;
> > + if (param->type != VIR_DOMAIN_MEMORY_FIELD_ULLONG) {
> > + qemuReportError(VIR_ERR_INVALID_ARG, "%s",
> > + _("invalid type for memory soft_limit tunable, expected a 'ullong'"));
> > + continue;
> > + }
> > +
> > + rc = virCgroupSetMemorySoftLimit(group, params[i].value.ul);
> > + if (rc != 0) {
> > + virReportSystemError(-rc, "%s",
> > + _("unable to set memory soft_limit tunable"));
> > + }
> > + } else if (STREQ(param->field, "swap_hard_limit")) {
> > + int rc;
> > + if (param->type != VIR_DOMAIN_MEMORY_FIELD_ULLONG) {
> > + qemuReportError(VIR_ERR_INVALID_ARG, "%s",
> > + _("invalid type for swap_hard_limit tunable, expected a 'ullong'"));
> > + continue;
> > + }
> > +
> > + rc = virCgroupSetSwapHardLimit(group, params[i].value.ul);
> > + if (rc != 0) {
> > + virReportSystemError(-rc, "%s",
> > + _("unable to set swap_hard_limit tunable"));
> > + }
> > + } else if (STREQ(param->field, "min_gaurantee")) {
>
> Same typo here s/gaur/guar/
Will correct it.
> > + qemuReportError(VIR_ERR_INVALID_ARG,
> > + _("Memory tunable `%s' not implemented"), param->field);
> > + } else {
> > + qemuReportError(VIR_ERR_INVALID_ARG,
> > + _("Parameter `%s' not supported"), param->field);
> > + }
> > + }
> > + ret = 0;
> > +
> > +cleanup:
> > + virCgroupFree(&group);
> > + if (vm)
> > + virDomainObjUnlock(vm);
> > + qemuDriverUnlock(driver);
> > + return ret;
> > +}
>
> This looks pretty sane. Just need to swap patches 6 & 7 in order, because
> this patch requires the cgroups functions before it will compile
Ok
Nikunj
More information about the libvir-list
mailing list