[libvirt] [PATCH v4 2/4] vcpupin: implement the code to address the new API in the qemu driver
Osier Yang
jyang at redhat.com
Thu Jun 9 09:42:23 UTC 2011
On 06/09/2011 11:38 AM, Taku Izumi wrote:
>
> This patch implements the code to address the new API
> (virDomainPinVcpuFlags)
> in the qemu driver.
>
> Signed-off-by: Taku Izumi<izumi.taku at jp.fujitsu.com>
> ---
> src/qemu/qemu_driver.c | 99
> +++++++++++++++++++++++++++++++++++++------------
> 1 file changed, 76 insertions(+), 23 deletions(-)
>
> Index: libvirt/src/qemu/qemu_driver.c
> ===================================================================
> --- libvirt.orig/src/qemu/qemu_driver.c
> +++ libvirt/src/qemu/qemu_driver.c
> @@ -2880,17 +2880,24 @@ qemudDomainSetVcpus(virDomainPtr dom, un
>
>
> static int
> -qemudDomainPinVcpu(virDomainPtr dom,
> - unsigned int vcpu,
> - unsigned char *cpumap,
> - int maplen) {
> +qemudDomainPinVcpuFlags(virDomainPtr dom,
> + unsigned int vcpu,
> + unsigned char *cpumap,
> + int maplen,
> + unsigned int flags) {
> +
> struct qemud_driver *driver = dom->conn->privateData;
> virDomainObjPtr vm;
> + virDomainDefPtr persistentDef = NULL;
> int maxcpu, hostcpus;
> virNodeInfo nodeinfo;
> int ret = -1;
> + bool isActive;
> qemuDomainObjPrivatePtr priv;
>
> + virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
> + VIR_DOMAIN_AFFECT_CONFIG, -1);
> +
> qemuDriverLock(driver);
> vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> qemuDriverUnlock(driver);
> @@ -2903,9 +2910,18 @@ qemudDomainPinVcpu(virDomainPtr dom,
> goto cleanup;
> }
>
> - if (!virDomainObjIsActive(vm)) {
> - qemuReportError(VIR_ERR_OPERATION_INVALID,
> - "%s",_("cannot pin vcpus on an inactive domain"));
> + isActive = virDomainObjIsActive(vm);
> + if (flags == VIR_DOMAIN_AFFECT_CURRENT) {
> + if (isActive)
> + flags = VIR_DOMAIN_AFFECT_LIVE;
> + else
> + flags = VIR_DOMAIN_AFFECT_CONFIG;
> + }
> +
> + if (!isActive&& (flags& VIR_DOMAIN_AFFECT_LIVE)) {
> + qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
> + _("a domain is inactive; can change only "
> + "persistent config"));
> goto cleanup;
> }
>
> @@ -2918,27 +2934,54 @@ qemudDomainPinVcpu(virDomainPtr dom,
> goto cleanup;
> }
>
> - if (nodeGetInfo(dom->conn,&nodeinfo)< 0)
> - goto cleanup;
> + if (flags& VIR_DOMAIN_AFFECT_CONFIG) {
> + if (!vm->persistent) {
> + qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
> + _("cannot change persistent config of a transient
> domain"));
Indention
> + goto cleanup;
> + }
> + if (!(persistentDef = virDomainObjGetPersistentDef(driver->caps,
> vm)))
> + goto cleanup;
> + }
>
> - hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
> - maxcpu = maplen * 8;
> - if (maxcpu> hostcpus)
> - maxcpu = hostcpus;
> + if (flags& VIR_DOMAIN_AFFECT_LIVE) {
>
> - if (priv->vcpupids != NULL) {
> - if (virProcessInfoSetAffinity(priv->vcpupids[vcpu],
> - cpumap, maplen, maxcpu)< 0)
> + if (nodeGetInfo(dom->conn,&nodeinfo)< 0)
> goto cleanup;
> - } else {
> - qemuReportError(VIR_ERR_NO_SUPPORT,
> - "%s", _("cpu affinity is not supported"));
> - goto cleanup;
> +
> + hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
> + maxcpu = maplen * 8;
> + if (maxcpu> hostcpus)
> + maxcpu = hostcpus;
> +
> + if (priv->vcpupids != NULL) {
> + if (virProcessInfoSetAffinity(priv->vcpupids[vcpu],
> + cpumap, maplen, maxcpu)< 0)
> + goto cleanup;
> + } else {
> + qemuReportError(VIR_ERR_NO_SUPPORT,
> + "%s", _("cpu affinity is not supported"));
> + goto cleanup;
> + }
> +
> + if (virDomainVcpupinAdd(vm->def, cpumap, maplen, vcpu)< 0) {
> + qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("failed to update or add vcpupin xml of "
> + "a running domain"));
> + goto cleanup;
> + }
> +
> }
>
> - if (virDomainVcpupinAdd(vm->def, cpumap, maplen, vcpu)< 0) {
> - qemuReportError(VIR_ERR_INTERNAL_ERROR,
> - "%s", _("failed to update or add vcpupin xml"));
> + if (flags& VIR_DOMAIN_AFFECT_CONFIG) {
> +
> + if (virDomainVcpupinAdd(persistentDef, cpumap, maplen, vcpu)< 0) {
> + qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("failed to update or add vcpupin xml of "
> + "a persistent domain"));
> + goto cleanup;
> + }
> + ret = virDomainSaveConfig(driver->configDir, persistentDef);
> goto cleanup;
> }
>
> @@ -2951,6 +2994,15 @@ cleanup:
> }
>
> static int
> +qemudDomainPinVcpu(virDomainPtr dom,
> + unsigned int vcpu,
> + unsigned char *cpumap,
> + int maplen) {
> + return qemudDomainPinVcpuFlags(dom, vcpu, cpumap, maplen,
> + VIR_DOMAIN_AFFECT_LIVE);
> +}
> +
> +static int
> qemudDomainGetVcpus(virDomainPtr dom,
> virVcpuInfoPtr info,
> int maxinfo,
> @@ -8014,6 +8066,7 @@ static virDriver qemuDriver = {
> .domainSetVcpusFlags = qemudDomainSetVcpusFlags, /* 0.8.5 */
> .domainGetVcpusFlags = qemudDomainGetVcpusFlags, /* 0.8.5 */
> .domainPinVcpu = qemudDomainPinVcpu, /* 0.4.4 */
> + .domainPinVcpuFlags = qemudDomainPinVcpuFlags, /* 0.9.2 */
Here should be 0.9.3, 0.9.2 is already out.
> .domainGetVcpus = qemudDomainGetVcpus, /* 0.4.4 */
> .domainGetMaxVcpus = qemudDomainGetMaxVcpus, /* 0.4.4 */
> .domainGetSecurityLabel = qemudDomainGetSecurityLabel, /* 0.6.1 */
>
>
More information about the libvir-list
mailing list