From nobody Mon Feb 9 08:55:21 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1531121544159497.6782286903706; Mon, 9 Jul 2018 00:32:24 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D179C307D869; Mon, 9 Jul 2018 07:32:22 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9E0D6600CD; Mon, 9 Jul 2018 07:32:22 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 49B333F646; Mon, 9 Jul 2018 07:32:22 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w697W9eE015303 for ; Mon, 9 Jul 2018 03:32:10 -0400 Received: by smtp.corp.redhat.com (Postfix) id EF79A30012C2; Mon, 9 Jul 2018 07:32:09 +0000 (UTC) Received: from mx1.redhat.com (ext-mx09.extmail.prod.ext.phx2.redhat.com [10.5.110.38]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E88BD3001A45 for ; Mon, 9 Jul 2018 07:32:09 +0000 (UTC) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E59764E916 for ; Mon, 9 Jul 2018 07:32:08 +0000 (UTC) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 Jul 2018 00:32:07 -0700 Received: from david-unc.bj.intel.com ([10.238.145.77]) by fmsmga004.fm.intel.com with ESMTP; 09 Jul 2018 00:32:04 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,329,1526367600"; d="scan'208";a="69734027" From: Wang Huaqiang To: libvir-list@redhat.com Date: Mon, 9 Jul 2018 15:00:55 +0800 Message-Id: <1531119658-18549-8-git-send-email-huaqiang.wang@intel.com> In-Reply-To: <1531119658-18549-1-git-send-email-huaqiang.wang@intel.com> References: <1531119658-18549-1-git-send-email-huaqiang.wang@intel.com> X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207 matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 09 Jul 2018 07:32:09 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 09 Jul 2018 07:32:09 +0000 (UTC) for IP:'192.55.52.88' DOMAIN:'mga01.intel.com' HELO:'mga01.intel.com' FROM:'huaqiang.wang@intel.com' RCPT:'' X-RedHat-Spam-Score: -5.001 (RCVD_IN_DNSWL_HI, SPF_PASS) 192.55.52.88 mga01.intel.com 192.55.52.88 mga01.intel.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.38 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.26 X-loop: libvir-list@redhat.com Cc: shaohe.feng@intel.com, Wang Huaqiang , bing.niu@intel.com, jian-feng.ding@intel.com, rui.zang@intel.com Subject: [libvirt] [PATCHv2 07/10] qemu: add interfaces for dynamically manupulating resctl mon groups X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.48]); Mon, 09 Jul 2018 07:32:23 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add interfaces for resource monitoring group - query monitoring group status - dynamically create monitoring group - dynamically destory monitoring group --- src/qemu/qemu_driver.c | 252 +++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 252 insertions(+) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 9a35e04..647d864 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -21607,6 +21607,256 @@ qemuDomainGetLaunchSecurityInfo(virDomainPtr doma= in, return ret; } =20 + +static int +qemuDomainSetCPUResmon(virDomainPtr dom, + const char *vcpumap, + const char *monid, + int action, + unsigned int flags) +{ + virDomainDefPtr def; + virDomainDefPtr persistentDef; + virQEMUDriverPtr driver =3D dom->conn->privateData; + virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); + virDomainObjPtr vm =3D NULL; + virBitmapPtr vcpus =3D NULL; + qemuDomainObjPrivatePtr priv =3D NULL; + unsigned int maxvcpus =3D 0; + size_t i =3D 0; + int ret =3D -1; + + virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); + + if (action !=3D 1 && action !=3D 2) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("unsupported action.")); + return ret; + } + + if (!(vm =3D qemuDomObjFromDomain(dom))) + return ret; + + if (vcpumap) { + if (virBitmapParse(vcpumap, &vcpus, QEMU_GUEST_VCPU_MAX_ID) < 0 || + virBitmapLastSetBit(vcpus) < 0) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("no vcpus selected for modification")); + goto cleanup; + } + } + + if (!vcpus) { + if (!monid) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("bad resource monitoring group ID")); + goto cleanup; + } + + for (i =3D 0; i < vm->def->nresmons; i++) { + const char *id =3D virResctrlMonGetID(vm->def->resmons[i]->mon); + if (id && STREQ(monid, id)) { + vcpus =3D virBitmapNewCopy(vm->def->resmons[i]->vcpus); + break; + } + } + + if (!vcpus) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("bad resource monitoring group ID")); + goto cleanup; + } + } + + priv =3D vm->privateData; + + if (virDomainSetCPUResmonEnsureACL(dom->conn, vm->def) < 0) + goto cleanup; + + if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) + goto cleanup; + + if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0) + goto endjob; + + if (action =3D=3D 2) { + /* action =3D=3D 'DESTROY' */ + + if (def) { + virResctrlMonPtr mon =3D virDomainCpuResmonDefRemove(def, moni= d); + if (!mon) + goto endjob; + + /* if allocation group exists, there is no way + * to disable it */ + virResctrlAllocPtr alloc =3D virResctrlMonGetAlloc(mon); + if (!alloc) { + if (virResctrlMonRemove(mon) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Error in remove rdt mon group.")); + goto endjob; + } + } + + virObjectUnref(mon); + } + + if (persistentDef) { + virResctrlMonPtr monpersist =3D + virDomainCpuResmonDefRemove(persistentDef, monid); + if (!monpersist) + goto endjob; + + virObjectUnref(monpersist); + } + } + + if (action =3D=3D 1) { + /* action =3D=3D 'CREATE' */ + + if (def) { + virResctrlAllocPtr alloc =3D NULL; + if (!virDomainCpuResmonDefValidate(def, + monid, + vcpus, + &alloc)) { + virReportError(VIR_ERR_INVALID_ARG, + "%s", + _("error in create resource monitoring " + "group vcpus or group name conflicts " + "with domain settings")); + goto endjob; + } + + virDomainCpuResmonDefPtr resmon =3D + virDomainCpuResmonDefAdd(def, vcpus, monid); + + if (!resmon) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("cannot create set rdt monitoring for " + "live configuration.")); + goto endjob; + } + + if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, + vm, driver->caps) < 0) + goto endjob; + + if (!virResctrlMonIsRunning(resmon->mon)) { + if (virResctrlMonCreate(alloc, + resmon->mon, + priv->machineName) < 0) + goto endjob; + + maxvcpus =3D virDomainDefGetVcpusMax(vm->def); + for (i =3D 0; i < maxvcpus; i++) { + virDomainVcpuDefPtr vcpu + =3D virDomainDefGetVcpu(vm->def, i); + + if (!vcpu->online) + continue; + + if (virBitmapIsBitSet(resmon->vcpus, i)) { + pid_t vcpupid =3D qemuDomainGetVcpuPid(vm, i); + if (virResctrlMonAddPID(resmon->mon, vcpupid) < 0) + goto endjob; + } + } + } + } + + if (persistentDef) { + if (!virDomainCpuResmonDefValidate(persistentDef, + monid, vcpus, + NULL)) { + virReportError(VIR_ERR_INVALID_ARG, + "%s", + _("Error in creating resource monitoring " + "group: vcpus or group name conflicts " + "with domain settings")); + goto endjob; + } + + if (!virDomainCpuResmonDefAdd(persistentDef, + vcpus, + monid)) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("cannot create set resource monitoring gr= oup " + "for domain persistent configuration")); + goto endjob; + } + + if (virDomainSaveConfig(cfg->configDir, driver->caps, + persistentDef) < 0) + goto endjob; + } + } + + ret =3D 0; + endjob: + qemuDomainObjEndJob(driver, vm); + + cleanup: + virBitmapFree(vcpus); + virDomainObjEndAPI(&vm); + virObjectUnref(cfg); + return ret; +} + +static char * +qemuDomainGetCPUResmonSts(virDomainPtr dom, const char *monid) +{ + virDomainObjPtr vm =3D NULL; + virDomainCpuResmonDefPtr resmon =3D NULL; + virBuffer buf =3D VIR_BUFFER_INITIALIZER; + char *bufstr =3D NULL; + char *sts =3D NULL; + size_t i =3D 0; + bool listallstatus =3D false; + + /* "*allstatus*" is the magic string for getting all existing + * mon group status */ + if (STREQ(monid, "*allstatus*")) + listallstatus =3D true; + + if (virAsprintf(&sts, "no group found") < 0) + goto cleanup; + + if (!(vm =3D qemuDomObjFromDomain(dom))) + return sts; + + if (virDomainGetCPUResmonStsEnsureACL(dom->conn, vm->def) < 0) + goto cleanup; + + for (i =3D 0; i < vm->def->nresmons; i++) { + resmon =3D vm->def->resmons[i]; + const char *id =3D virResctrlMonGetID(resmon->mon); + if (!id) + goto cleanup; + + if (!listallstatus && STRNEQ(monid, id)) + continue; + + if (virResctrlMonIsRunning(resmon->mon)) + virBufferStrcat(&buf, "group name: ", id, ";", NULL); + } + + bufstr =3D virBufferContentAndReset(&buf); + + if (bufstr) { + VIR_FREE(sts); + if (VIR_STRDUP(sts, bufstr) < 0) + goto cleanup; + VIR_FREE(bufstr); + } + + cleanup: + virBufferFreeAndReset(&buf); + virDomainObjEndAPI(&vm); + return sts; +} + + static virHypervisorDriver qemuHypervisorDriver =3D { .name =3D QEMU_DRIVER_NAME, .connectURIProbe =3D qemuConnectURIProbe, @@ -21832,6 +22082,8 @@ static virHypervisorDriver qemuHypervisorDriver =3D= { .connectBaselineHypervisorCPU =3D qemuConnectBaselineHypervisorCPU, /*= 4.4.0 */ .nodeGetSEVInfo =3D qemuNodeGetSEVInfo, /* 4.5.0 */ .domainGetLaunchSecurityInfo =3D qemuDomainGetLaunchSecurityInfo, /* 4= .5.0 */ + .domainSetCPUResmon =3D qemuDomainSetCPUResmon, /* 4.6.0 */ + .domainGetCPUResmonSts =3D qemuDomainGetCPUResmonSts, /* 4.6.0 */ }; =20 =20 --=20 2.7.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list