mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
qemu: capabilities: Extract availability of new cpu hotplug for machine types
QEMU reports whether 'query-hotpluggable-cpus' is supported for a given machine type. Extract and cache the information using the capability cache. When copying the capabilities for a new start of qemu, mask out the presence of QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS if the machine type doesn't support hotpluggable cpus.
This commit is contained in:
parent
ffa536e0f8
commit
920bbe5c15
@ -349,6 +349,7 @@ struct virQEMUCapsMachineType {
|
|||||||
char *name;
|
char *name;
|
||||||
char *alias;
|
char *alias;
|
||||||
unsigned int maxCpus;
|
unsigned int maxCpus;
|
||||||
|
bool hotplugCpus;
|
||||||
};
|
};
|
||||||
/*
|
/*
|
||||||
* Update the XML parser/formatter when adding more
|
* Update the XML parser/formatter when adding more
|
||||||
@ -550,6 +551,7 @@ virQEMUCapsParseMachineTypesStr(const char *output,
|
|||||||
}
|
}
|
||||||
/* When parsing from command line we don't have information about maxCpus */
|
/* When parsing from command line we don't have information about maxCpus */
|
||||||
qemuCaps->machineTypes[qemuCaps->nmachineTypes-1].maxCpus = 0;
|
qemuCaps->machineTypes[qemuCaps->nmachineTypes-1].maxCpus = 0;
|
||||||
|
qemuCaps->machineTypes[qemuCaps->nmachineTypes-1].hotplugCpus = false;
|
||||||
} while ((p = next));
|
} while ((p = next));
|
||||||
|
|
||||||
|
|
||||||
@ -2105,6 +2107,7 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
|
|||||||
VIR_STRDUP(ret->machineTypes[i].alias, qemuCaps->machineTypes[i].alias) < 0)
|
VIR_STRDUP(ret->machineTypes[i].alias, qemuCaps->machineTypes[i].alias) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
ret->machineTypes[i].maxCpus = qemuCaps->machineTypes[i].maxCpus;
|
ret->machineTypes[i].maxCpus = qemuCaps->machineTypes[i].maxCpus;
|
||||||
|
ret->machineTypes[i].hotplugCpus = qemuCaps->machineTypes[i].hotplugCpus;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (VIR_ALLOC_N(ret->gicCapabilities, qemuCaps->ngicCapabilities) < 0)
|
if (VIR_ALLOC_N(ret->gicCapabilities, qemuCaps->ngicCapabilities) < 0)
|
||||||
@ -2414,6 +2417,20 @@ int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool virQEMUCapsGetMachineHotplugCpus(virQEMUCapsPtr qemuCaps,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < qemuCaps->nmachineTypes; i++) {
|
||||||
|
if (STREQ_NULLABLE(qemuCaps->machineTypes[i].name, name))
|
||||||
|
return qemuCaps->machineTypes[i].hotplugCpus;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virQEMUCapsSetGICCapabilities:
|
* virQEMUCapsSetGICCapabilities:
|
||||||
* @qemuCaps: QEMU capabilities
|
* @qemuCaps: QEMU capabilities
|
||||||
@ -2572,6 +2589,7 @@ virQEMUCapsProbeQMPMachineTypes(virQEMUCapsPtr qemuCaps,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
mach->maxCpus = machines[i]->maxCpus;
|
mach->maxCpus = machines[i]->maxCpus;
|
||||||
|
mach->hotplugCpus = machines[i]->hotplugCpus;
|
||||||
|
|
||||||
if (machines[i]->isDefault)
|
if (machines[i]->isDefault)
|
||||||
defIdx = qemuCaps->nmachineTypes - 1;
|
defIdx = qemuCaps->nmachineTypes - 1;
|
||||||
@ -2830,7 +2848,7 @@ int virQEMUCapsProbeQMP(virQEMUCapsPtr qemuCaps,
|
|||||||
* ...
|
* ...
|
||||||
* <cpu name="pentium3"/>
|
* <cpu name="pentium3"/>
|
||||||
* ...
|
* ...
|
||||||
* <machine name="pc-1.0" alias="pc" maxCpus="4"/>
|
* <machine name="pc-1.0" alias="pc" hotplugCpus='yes' maxCpus="4"/>
|
||||||
* ...
|
* ...
|
||||||
* </qemuCaps>
|
* </qemuCaps>
|
||||||
*/
|
*/
|
||||||
@ -2991,6 +3009,11 @@ virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
VIR_FREE(str);
|
VIR_FREE(str);
|
||||||
|
|
||||||
|
str = virXMLPropString(nodes[i], "hotplugCpus");
|
||||||
|
if (STREQ_NULLABLE(str, "yes"))
|
||||||
|
qemuCaps->machineTypes[i].hotplugCpus = true;
|
||||||
|
VIR_FREE(str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
VIR_FREE(nodes);
|
VIR_FREE(nodes);
|
||||||
@ -3124,6 +3147,8 @@ virQEMUCapsFormatCache(virQEMUCapsPtr qemuCaps,
|
|||||||
if (qemuCaps->machineTypes[i].alias)
|
if (qemuCaps->machineTypes[i].alias)
|
||||||
virBufferEscapeString(&buf, " alias='%s'",
|
virBufferEscapeString(&buf, " alias='%s'",
|
||||||
qemuCaps->machineTypes[i].alias);
|
qemuCaps->machineTypes[i].alias);
|
||||||
|
if (qemuCaps->machineTypes[i].hotplugCpus)
|
||||||
|
virBufferAddLit(&buf, " hotplugCpus='yes'");
|
||||||
virBufferAsprintf(&buf, " maxCpus='%u'/>\n",
|
virBufferAsprintf(&buf, " maxCpus='%u'/>\n",
|
||||||
qemuCaps->machineTypes[i].maxCpus);
|
qemuCaps->machineTypes[i].maxCpus);
|
||||||
}
|
}
|
||||||
@ -3912,6 +3937,8 @@ virQEMUCapsFilterByMachineType(virQEMUCapsPtr qemuCaps,
|
|||||||
virQEMUCapsClear(qemuCaps, filter->flags[j]);
|
virQEMUCapsClear(qemuCaps, filter->flags[j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!virQEMUCapsGetMachineHotplugCpus(qemuCaps, machineType))
|
||||||
|
virQEMUCapsClear(qemuCaps, QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -428,6 +428,8 @@ const char *virQEMUCapsGetCanonicalMachine(virQEMUCapsPtr qemuCaps,
|
|||||||
const char *name);
|
const char *name);
|
||||||
int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps,
|
int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps,
|
||||||
const char *name);
|
const char *name);
|
||||||
|
bool virQEMUCapsGetMachineHotplugCpus(virQEMUCapsPtr qemuCaps,
|
||||||
|
const char *name);
|
||||||
int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
|
int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
|
||||||
size_t *nmachines,
|
size_t *nmachines,
|
||||||
virCapsGuestMachinePtr **machines);
|
virCapsGuestMachinePtr **machines);
|
||||||
|
@ -854,6 +854,7 @@ struct _qemuMonitorMachineInfo {
|
|||||||
bool isDefault;
|
bool isDefault;
|
||||||
char *alias;
|
char *alias;
|
||||||
unsigned int maxCpus;
|
unsigned int maxCpus;
|
||||||
|
bool hotplugCpus;
|
||||||
};
|
};
|
||||||
|
|
||||||
int qemuMonitorGetMachines(qemuMonitorPtr mon,
|
int qemuMonitorGetMachines(qemuMonitorPtr mon,
|
||||||
|
@ -4840,6 +4840,9 @@ int qemuMonitorJSONGetMachines(qemuMonitorPtr mon,
|
|||||||
_("query-machines reply has malformed 'cpu-max' data"));
|
_("query-machines reply has malformed 'cpu-max' data"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ignore_value(virJSONValueObjectGetBoolean(child, "hotpluggable-cpus",
|
||||||
|
&info->hotplugCpus));
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = n;
|
ret = n;
|
||||||
|
@ -227,31 +227,31 @@
|
|||||||
<cpu name='core2duo'/>
|
<cpu name='core2duo'/>
|
||||||
<cpu name='phenom'/>
|
<cpu name='phenom'/>
|
||||||
<cpu name='qemu64'/>
|
<cpu name='qemu64'/>
|
||||||
<machine name='pc-i440fx-2.7' alias='pc' maxCpus='255'/>
|
<machine name='pc-i440fx-2.7' alias='pc' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-0.12' maxCpus='255'/>
|
<machine name='pc-0.12' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-i440fx-2.4' maxCpus='255'/>
|
<machine name='pc-i440fx-2.4' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-1.3' maxCpus='255'/>
|
<machine name='pc-1.3' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-q35-2.7' alias='q35' maxCpus='255'/>
|
<machine name='pc-q35-2.7' alias='q35' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-q35-2.6' maxCpus='255'/>
|
<machine name='pc-q35-2.6' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-i440fx-1.7' maxCpus='255'/>
|
<machine name='pc-i440fx-1.7' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-i440fx-1.6' maxCpus='255'/>
|
<machine name='pc-i440fx-1.6' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-0.11' maxCpus='255'/>
|
<machine name='pc-0.11' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-i440fx-2.3' maxCpus='255'/>
|
<machine name='pc-i440fx-2.3' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-0.10' maxCpus='255'/>
|
<machine name='pc-0.10' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-1.2' maxCpus='255'/>
|
<machine name='pc-1.2' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-i440fx-2.2' maxCpus='255'/>
|
<machine name='pc-i440fx-2.2' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='isapc' maxCpus='1'/>
|
<machine name='isapc' hotplugCpus='yes' maxCpus='1'/>
|
||||||
<machine name='pc-q35-2.5' maxCpus='255'/>
|
<machine name='pc-q35-2.5' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-0.15' maxCpus='255'/>
|
<machine name='pc-0.15' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-i440fx-1.5' maxCpus='255'/>
|
<machine name='pc-i440fx-1.5' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-0.14' maxCpus='255'/>
|
<machine name='pc-0.14' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-i440fx-2.6' maxCpus='255'/>
|
<machine name='pc-i440fx-2.6' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-i440fx-1.4' maxCpus='255'/>
|
<machine name='pc-i440fx-1.4' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-i440fx-2.5' maxCpus='255'/>
|
<machine name='pc-i440fx-2.5' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-1.1' maxCpus='255'/>
|
<machine name='pc-1.1' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-i440fx-2.1' maxCpus='255'/>
|
<machine name='pc-i440fx-2.1' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-1.0' maxCpus='255'/>
|
<machine name='pc-1.0' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-i440fx-2.0' maxCpus='255'/>
|
<machine name='pc-i440fx-2.0' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-q35-2.4' maxCpus='255'/>
|
<machine name='pc-q35-2.4' hotplugCpus='yes' maxCpus='255'/>
|
||||||
<machine name='pc-0.13' maxCpus='255'/>
|
<machine name='pc-0.13' hotplugCpus='yes' maxCpus='255'/>
|
||||||
</qemuCaps>
|
</qemuCaps>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user