On 01/14/2016 11:27 AM, Peter Krempa wrote: > This step can be omitted, so that drivers can decide what to do when the > user requests to use default vcpu pinning. > --- > src/conf/domain_conf.c | 32 -------------------------------- > src/libxl/libxl_domain.c | 15 ++++++++++++--- > src/libxl/libxl_driver.c | 2 ++ > src/qemu/qemu_driver.c | 34 ++-------------------------------- > src/qemu/qemu_process.c | 8 +++++++- > src/test/test_driver.c | 2 ++ > src/vz/vz_sdk.c | 4 ++-- > 7 files changed, 27 insertions(+), 70 deletions(-) > > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index 36286d3..caf5334 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -15149,34 +15149,6 @@ virDomainDefParseXML(xmlDocPtr xml, > } > VIR_FREE(nodes); > > - /* Initialize the pinning policy for vcpus which doesn't has > - * the policy specified explicitly as def->cpuset. > - */ > - if (def->cpumask) { > - if (VIR_REALLOC_N(def->cputune.vcpupin, virDomainDefGetVcpus(def)) < 0) > - goto error; > - > - for (i = 0; i < virDomainDefGetVcpus(def); i++) { > - if (virDomainPinIsDuplicate(def->cputune.vcpupin, > - def->cputune.nvcpupin, > - i)) > - continue; > - > - virDomainPinDefPtr vcpupin = NULL; > - > - if (VIR_ALLOC(vcpupin) < 0) > - goto error; > - > - if (!(vcpupin->cpumask = virBitmapNew(VIR_DOMAIN_CPUMASK_LEN))) { > - VIR_FREE(vcpupin); > - goto error; > - } > - virBitmapCopy(vcpupin->cpumask, def->cpumask); > - vcpupin->id = i; > - def->cputune.vcpupin[def->cputune.nvcpupin++] = vcpupin; > - } > - } > - > if ((n = virXPathNodeSet("./cputune/emulatorpin", ctxt, &nodes)) < 0) { > virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > _("cannot extract emulatorpin nodes")); > @@ -21855,10 +21827,6 @@ virDomainDefFormatInternal(virDomainDefPtr def, > > for (i = 0; i < def->cputune.nvcpupin; i++) { > char *cpumask; > - /* Ignore the vcpupin which inherit from "cpuset of "<vcpu>." */ > - if (virBitmapEqual(def->cpumask, def->cputune.vcpupin[i]->cpumask)) > - continue; > - > virBufferAsprintf(&childrenBuf, "<vcpupin vcpu='%u' ", > def->cputune.vcpupin[i]->id); > > diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c > index cf5c9f6..37c92c6 100644 > --- a/src/libxl/libxl_domain.c > +++ b/src/libxl/libxl_domain.c > @@ -824,9 +824,18 @@ libxlDomainSetVcpuAffinities(libxlDriverPrivatePtr driver, virDomainObjPtr vm) > > libxl_bitmap_init(&map); > > - for (i = 0; i < vm->def->cputune.nvcpupin; ++i) { > - pin = vm->def->cputune.vcpupin[i]; > - cpumask = pin->cpumask; > + for (i = 0; i < virDomainDefGetVcpus(vm->def); ++i) { > + pin = virDomainPinFind(vm->def->cputune.vcpupin, > + vm->def->cputune.nvcpupin, > + i); > + > + if (pin && pin->cpumask) > + cpumask = pin->cpumask; > + else > + cpumask = vm->def->cpumask; > + > + if (!cpumask) > + continue; > > if (virBitmapToData(cpumask, &map.map, (int *)&map.size) < 0) > goto cleanup; > diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c > index d4e9c2a7..26c1a43 100644 > --- a/src/libxl/libxl_driver.c > +++ b/src/libxl/libxl_driver.c > @@ -2464,6 +2464,8 @@ libxlDomainGetVcpuPinInfo(virDomainPtr dom, int ncpumaps, > > if (pininfo && pininfo->cpumask) > bitmap = pininfo->cpumask; > + else if (targetDef->cpumask) > + bitmap = targetDef->cpumask; > else > bitmap = allcpumap; > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index b377738..0a4de1b 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -4596,33 +4596,6 @@ qemuDomainAddCgroupForThread(virCgroupPtr cgroup, > return NULL; > } > > -static int > -qemuDomainHotplugAddPin(virBitmapPtr cpumask, > - int idx, > - virDomainPinDefPtr **pindef_list, > - size_t *npin) > -{ > - int ret = -1; > - virDomainPinDefPtr pindef = NULL; > - > - if (VIR_ALLOC(pindef) < 0) > - goto cleanup; > - > - if (!(pindef->cpumask = virBitmapNewCopy(cpumask))) { > - VIR_FREE(pindef); > - goto cleanup; > - } > - pindef->id = idx; > - if (VIR_APPEND_ELEMENT_COPY(*pindef_list, *npin, pindef) < 0) { > - virBitmapFree(pindef->cpumask); > - VIR_FREE(pindef); > - goto cleanup; > - } > - ret = 0; > - > - cleanup: > - return ret; > -} > > static int > qemuDomainHotplugPinThread(virBitmapPtr cpumask, > @@ -4734,11 +4707,6 @@ qemuDomainHotplugAddVcpu(virQEMUDriverPtr driver, > > /* Inherit def->cpuset */ > if (vm->def->cpumask) { > - if (qemuDomainHotplugAddPin(vm->def->cpumask, vcpu, > - &vm->def->cputune.vcpupin, > - &vm->def->cputune.nvcpupin) < 0) > - goto cleanup; > - > if (qemuDomainHotplugPinThread(vm->def->cpumask, vcpu, vcpupid, > cgroup_vcpu) < 0) { > goto cleanup; > @@ -5260,6 +5228,8 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom, > else if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO && > priv->autoCpuset) > bitmap = priv->autoCpuset; > + else if (def->cpumask) > + bitmap = def->cpumask; > else > bitmap = allcpumap; > > diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c > index a7c3094..64b58be 100644 > --- a/src/qemu/qemu_process.c > +++ b/src/qemu/qemu_process.c > @@ -2177,7 +2177,8 @@ qemuProcessSetVcpuAffinities(virDomainObjPtr vm) > * VM default affinity, we must reject it > */ > for (n = 0; n < def->cputune.nvcpupin; n++) { > - if (!virBitmapEqual(def->cpumask, > + if (def->cputune.vcpupin[n]->cpumask && > + !virBitmapEqual(def->cpumask, > def->cputune.vcpupin[n]->cpumask)) { > virReportError(VIR_ERR_OPERATION_INVALID, > "%s", _("cpu affinity is not supported")); > @@ -2188,12 +2189,17 @@ qemuProcessSetVcpuAffinities(virDomainObjPtr vm) > } > > for (n = 0; n < virDomainDefGetVcpus(def); n++) { > + virBitmapPtr bitmap; > /* set affinity only for existing vcpus */ > if (!(pininfo = virDomainPinFind(def->cputune.vcpupin, > def->cputune.nvcpupin, > n))) > continue; > > + if (!(bitmap = pininfo->cpumask) && > + !(bitmap = def->cpumask)) > + continue; > + > if (virProcessSetAffinity(qemuDomainGetVcpuPid(vm, n), > pininfo->cpumask) < 0) { It seems you meant to use 'bitmap' as the last param here and not 'pininfo->cpumask'... Otherwise, the setting of bitmap above is pointless. John > goto cleanup; > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > index 8d1402e..4d268de 100644 > --- a/src/test/test_driver.c > +++ b/src/test/test_driver.c > @@ -2574,6 +2574,8 @@ testDomainGetVcpuPinInfo(virDomainPtr dom, > > if (pininfo && pininfo->cpumask) > bitmap = pininfo->cpumask; > + else if (def->cpumask) > + bitmap = def->cpumask; > else > bitmap = allcpumap; > > diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c > index d610979..7cc24d3 100644 > --- a/src/vz/vz_sdk.c > +++ b/src/vz/vz_sdk.c > @@ -1959,8 +1959,8 @@ prlsdkCheckUnsupportedParams(PRL_HANDLE sdkdom, virDomainDefPtr def) > > if (def->cputune.vcpupin) { > for (i = 0; i < def->cputune.nvcpupin; i++) { > - if (!virBitmapEqual(def->cpumask, > - def->cputune.vcpupin[i]->cpumask)) { > + if (def->cputune.vcpupin[i]->cpumask && > + !virBitmapEqual(def->cpumask, def->cputune.vcpupin[i]->cpumask)) { > virReportError(VIR_ERR_CONFIG_UNSUPPORTED, > "%s", _("vcpupin cpumask differs from default cpumask")); > return -1; > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list