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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list