mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 11:22:23 +00:00
conf: Don't copy def->cpumask into cpu pinning info
This step can be omitted, so that drivers can decide what to do when the user requests to use default vcpu pinning.
This commit is contained in:
parent
d0d341a30b
commit
856f254eef
@ -15173,34 +15173,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"));
|
||||
@ -21875,10 +21847,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);
|
||||
|
||||
|
@ -829,9 +829,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;
|
||||
|
@ -2472,6 +2472,8 @@ libxlDomainGetVcpuPinInfo(virDomainPtr dom, int ncpumaps,
|
||||
|
||||
if (pininfo && pininfo->cpumask)
|
||||
bitmap = pininfo->cpumask;
|
||||
else if (targetDef->cpumask)
|
||||
bitmap = targetDef->cpumask;
|
||||
else
|
||||
bitmap = allcpumap;
|
||||
|
||||
|
@ -4682,33 +4682,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,
|
||||
@ -4825,11 +4798,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;
|
||||
@ -5357,6 +5325,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;
|
||||
|
||||
|
@ -2207,7 +2207,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"));
|
||||
@ -2218,16 +2219,19 @@ 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 (virProcessSetAffinity(qemuDomainGetVcpuPid(vm, n),
|
||||
pininfo->cpumask) < 0) {
|
||||
if (!(bitmap = pininfo->cpumask) &&
|
||||
!(bitmap = def->cpumask))
|
||||
continue;
|
||||
|
||||
if (virProcessSetAffinity(qemuDomainGetVcpuPid(vm, n), bitmap) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
@ -2575,6 +2575,8 @@ testDomainGetVcpuPinInfo(virDomainPtr dom,
|
||||
|
||||
if (pininfo && pininfo->cpumask)
|
||||
bitmap = pininfo->cpumask;
|
||||
else if (def->cpumask)
|
||||
bitmap = def->cpumask;
|
||||
else
|
||||
bitmap = allcpumap;
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user