[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