[libvirt] [RFC v3 3/8] Resctrl: Add new xml element to support cache tune
Marcelo Tosatti
mtosatti at redhat.com
Fri Feb 10 13:36:45 UTC 2017
On Thu, Feb 09, 2017 at 03:43:04PM +0800, Eli Qiao wrote:
> This patch adds new xml element to support cache tune as:
>
> <cputune>
> ...
> <cachetune id='1' host_id='0' type='l3' size='2816' unit='KiB'
> vcpus='1,2'/>
> ...
> </cputune>
>
> id: any non-minus number
> host_id: reference of the host's cache banks id, it's from capabilities
> type: cache bank type
> size: should be multiples of the min_size of the bank on host.
> vcpus: cache allocation on vcpu set, if empty, will apply the allocation
> on all vcpus
> ---
> docs/schemas/domaincommon.rng | 46 +++++++++++++
> src/conf/domain_conf.c | 152 ++++++++++++++++++++++++++++++++++++++++++
> src/conf/domain_conf.h | 19 ++++++
> src/util/virresctrl.c | 32 +++++++--
> src/util/virresctrl.h | 1 +
> 5 files changed, 245 insertions(+), 5 deletions(-)
>
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index cc6e0d0..edb2888 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -795,6 +795,32 @@
> </attribute>
> </element>
> </zeroOrMore>
> + <zeroOrMore>
> + <element name="cachetune">
> + <attribute name="id">
> + <ref name="cacheid"/>
> + </attribute>
> + <attribute name="host_id">
> + <ref name="hostid"/>
> + </attribute>
> + <attribute name="type">
> + <ref name="cachetype"/>
> + </attribute>
> + <attribute name="size">
> + <ref name="unsignedInt"/>
> + </attribute>
> + <optional>
> + <attribute name="unit">
> + <ref name="cacheunit"/>
> + </attribute>
> + </optional>
> + <optional>
> + <attribute name="vcpus">
> + <ref name="cpuset"/>
> + </attribute>
> + </optional>
> + </element>
> + </zeroOrMore>
> <optional>
> <element name="emulatorpin">
> <attribute name="cpuset">
> @@ -5451,6 +5477,26 @@
> <param name="minInclusive">-1</param>
> </data>
> </define>
> + <define name="cacheid">
> + <data type="unsignedShort">
> + <param name="pattern">[0-9]+</param>
> + </data>
> + </define>
> + <define name="hostid">
> + <data type="unsignedShort">
> + <param name="pattern">[0-9]+</param>
> + </data>
> + </define>
> + <define name="cachetype">
> + <data type="string">
> + <param name="pattern">(l3)</param>
> + </data>
> + </define>
> + <define name="cacheunit">
> + <data type="string">
> + <param name="pattern">KiB</param>
> + </data>
> + </define>
> <!-- weight currently is in range [100, 1000] -->
> <define name="weight">
> <data type="unsignedInt">
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index c06b128..6ce819d 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -56,6 +56,7 @@
> #include "virstring.h"
> #include "virnetdev.h"
> #include "virhostdev.h"
> +#include "virresctrl.h"
>
> #define VIR_FROM_THIS VIR_FROM_DOMAIN
>
> @@ -15604,6 +15605,127 @@ virDomainVcpuPinDefParseXML(virDomainDefPtr def,
> return ret;
> }
>
> +/* Parse the XML definition for cachetune
> + * and a cachetune has the form
> + * <cachetune id='0' host_id='0' type='l3' size='1024' unit='KiB'/>
> + */
> +static int
> +virDomainCacheTuneDefParseXML(virDomainDefPtr def,
> + int n,
> + xmlNodePtr* nodes)
> +{
> + char* tmp = NULL;
> + size_t i, j;
> + int type = -1;
> + virDomainCacheBankPtr bank = NULL;
> + virResCtrlPtr resctrl;
> +
> + if (VIR_ALLOC_N(bank, n) < 0)
> + goto cleanup;
> +
> + for (i = 0; i < n; i++) {
> + if (!(tmp = virXMLPropString(nodes[i], "id"))) {
> + virReportError(VIR_ERR_XML_ERROR, "%s", _("missing id in cache tune"));
> + goto cleanup;
> + }
> + if (virStrToLong_uip(tmp, NULL, 10, &(bank[i].id)) < 0) {
> + virReportError(VIR_ERR_XML_ERROR,
> + _("invalid setting for cache id '%s'"), tmp);
> + goto cleanup;
> + }
> +
> + VIR_FREE(tmp);
> + if (!(tmp = virXMLPropString(nodes[i], "host_id"))) {
> + virReportError(VIR_ERR_XML_ERROR, "%s", _("missing host id in cache tune"));
> + goto cleanup;
> + }
> + if (virStrToLong_uip(tmp, NULL, 10, &(bank[i].host_id)) < 0) {
> + virReportError(VIR_ERR_XML_ERROR,
> + _("invalid setting for cache host id '%s'"), tmp);
> + goto cleanup;
> + }
> + VIR_FREE(tmp);
> +
> + if (!(tmp = virXMLPropString(nodes[i], "size"))) {
> + virReportError(VIR_ERR_XML_ERROR, "%s", _("missing size in cache tune"));
> + goto cleanup;
> + }
> + if (virStrToLong_ull(tmp, NULL, 10, &(bank[i].size)) < 0) {
> + virReportError(VIR_ERR_XML_ERROR,
> + _("invalid setting for cache size '%s'"), tmp);
> + goto cleanup;
> + }
> + VIR_FREE(tmp);
> +
> + if (!(tmp = virXMLPropString(nodes[i], "type"))) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("missing cache type"));
> + goto cleanup;
> + }
> +
> + if ((type = virResCtrlTypeFromString(tmp)) < 0) {
> + virReportError(VIR_ERR_XML_ERROR,
> + _("'unsupported cache type '%s'"), tmp);
> + goto cleanup;
> + }
> +
> + resctrl = virResCtrlGet(type);
> +
> + if (resctrl == NULL || !resctrl->enabled) {
> + virReportError(VIR_ERR_XML_ERROR,
> + _("'host doesn't enabled cache type '%s'"), tmp);
> + goto cleanup;
> + }
> +
> + bool found_host_id = false;
> + /* Loop for banks to search host_id */
> + for (j = 0; j < resctrl->num_banks; j++) {
> + if (resctrl->cache_banks[j].host_id == bank[i].host_id) {
> + found_host_id = true;
> + break;
> + }
> + }
> +
> + if (! found_host_id) {
> + virReportError(VIR_ERR_XML_ERROR,
> + _("'cache bank's host id %u not found on the host"),
> + bank[i].host_id);
> + goto cleanup;
> + }
> +
> + if (bank[i].size == 0 ||
> + bank[i].size % resctrl->cache_banks[j].cache_min != 0) {
> + virReportError(VIR_ERR_XML_ERROR,
> + _("'the size shoud be multiplies of '%llu'"),
Typo: should
Typo: multiples of
More information about the libvir-list
mailing list