return bitmap;
}
-int
-virDomainVcpuPinAdd(virDomainDefPtr def,
- unsigned char *cpumap,
- int maplen,
- int vcpu)
+int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr *vcpupin_list,
+ int *nvcpupin,
+ unsigned char *cpumap,
+ int maplen,
+ int vcpu)
{
- virDomainVcpuPinDefPtr *vcpupin_list = NULL;
virDomainVcpuPinDefPtr vcpupin = NULL;
char *cpumask = NULL;
- if ((cpumask = bitmapFromBytemap(cpumap, maplen)) == NULL)
- goto cleanup;
-
- /* No vcpupin exists yet. */
- if (!def->cputune.nvcpupin) {
- if (VIR_ALLOC(vcpupin) < 0) {
- virReportOOMError();
- goto cleanup;
- }
+ if (!vcpupin_list)
+ return -1;
- if (VIR_ALLOC(vcpupin_list) < 0) {
- virReportOOMError();
- VIR_FREE(vcpupin);
- goto cleanup;
- }
+ if ((cpumask = bitmapFromBytemap(cpumap, maplen)) == NULL)
+ return -1;
+ vcpupin = virDomainVcpuPinFindByVcpu(vcpupin_list,
+ *nvcpupin,
+ vcpu);
+ if (vcpupin) {
vcpupin->vcpuid = vcpu;
vcpupin->cpumask = cpumask;
- vcpupin_list[def->cputune.nvcpupin++] = vcpupin;
- def->cputune.vcpupin = vcpupin_list;
- } else {
- if (virDomainVcpuPinIsDuplicate(def->cputune.vcpupin,
- def->cputune.nvcpupin,
- vcpu)) {
- vcpupin = virDomainVcpuPinFindByVcpu(def->cputune.vcpupin,
- def->cputune.nvcpupin,
- vcpu);
- vcpupin->vcpuid = vcpu;
- vcpupin->cpumask = cpumask;
- } else {
- if (VIR_ALLOC(vcpupin) < 0) {
- virReportOOMError();
- goto cleanup;
- }
+ return 0;
+ }
+
+ /* No existing vcpupin matches vcpu, adding a new one */
+
+ if (VIR_ALLOC(vcpupin) < 0) {
+ virReportOOMError();
+ VIR_FREE(cpumask);
+ return -1;
+ }
+ vcpupin->vcpuid = vcpu;
+ vcpupin->cpumask = cpumask;
- if (VIR_REALLOC_N(def->cputune.vcpupin, def->cputune.nvcpupin + 1) < 0) {
- virReportOOMError();
- VIR_FREE(vcpupin);
- goto cleanup;
- }
- vcpupin->vcpuid = vcpu;
- vcpupin->cpumask = cpumask;
- def->cputune.vcpupin[def->cputune.nvcpupin++] = vcpupin;
- }
+ if (VIR_REALLOC_N(vcpupin_list, *nvcpupin + 1) < 0) {
+ virReportOOMError();
+ VIR_FREE(cpumask);
+ VIR_FREE(vcpupin);
+ return -1;
}
- return 0;
+ vcpupin_list[(*nvcpupin)++] = vcpupin;
-cleanup:
- VIR_FREE(cpumask);
- return -1;
+ return 0;
}
int
char *virDomainCpuSetFormat(char *cpuset,
int maxcpu);
-int virDomainVcpuPinAdd(virDomainDefPtr def,
+int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr *vcpupin_list,
+ int *nvcpupin,
unsigned char *cpumap,
int maplen,
int vcpu);
goto cleanup;
}
- if (virDomainVcpuPinAdd(vm->def, cpumap, maplen, vcpu) < 0) {
+ if (!vm->def->cputune.vcpupin) {
+ if (VIR_ALLOC(vm->def->cputune.vcpupin) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ vm->def->cputune.nvcpupin = 0;
+ }
+ if (virDomainVcpuPinAdd(vm->def->cputune.vcpupin,
+ &vm->def->cputune.nvcpupin,
+ cpumap,
+ maplen,
+ vcpu) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("failed to update or add vcpupin xml"));
goto cleanup;
goto cleanup;
}
} else {
- if (virDomainVcpuPinAdd(vm->def, cpumap, maplen, vcpu) < 0) {
+ if (!vm->def->cputune.vcpupin) {
+ if (VIR_ALLOC(vm->def->cputune.vcpupin) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ vm->def->cputune.nvcpupin = 0;
+ }
+ if (virDomainVcpuPinAdd(vm->def->cputune.vcpupin,
+ &vm->def->cputune.nvcpupin,
+ cpumap,
+ maplen,
+ vcpu) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("failed to update or add vcpupin xml of "
"a running domain"));
goto cleanup;
}
} else {
- if (virDomainVcpuPinAdd(persistentDef, cpumap, maplen, vcpu) < 0) {
+ if (!persistentDef->cputune.vcpupin) {
+ if (VIR_ALLOC(persistentDef->cputune.vcpupin) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ persistentDef->cputune.nvcpupin = 0;
+ }
+ if (virDomainVcpuPinAdd(persistentDef->cputune.vcpupin,
+ &persistentDef->cputune.nvcpupin,
+ cpumap,
+ maplen,
+ vcpu) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("failed to update or add vcpupin xml of "
"a persistent domain"));
goto cleanup;
if (ret == 0) {
- if (virDomainVcpuPinAdd(def, cpumap, maplen, vcpu) < 0) {
+ if (!def->cputune.vcpupin) {
+ if (VIR_ALLOC(def->cputune.vcpupin) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ def->cputune.nvcpupin = 0;
+ }
+ if (virDomainVcpuPinAdd(def->cputune.vcpupin,
+ &def->cputune.nvcpupin,
+ cpumap,
+ maplen,
+ vcpu) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("failed to add vcpupin xml entry"));
return -1;