[libvirt] [PATCH 03/10] conf: Add CMT capability to host

John Ferlan jferlan at redhat.com
Wed Sep 5 11:59:18 UTC 2018



On 08/27/2018 07:23 AM, Wang Huaqiang wrote:
> CMT capability for each cache bank, includes
> -. Maximum CMT monitoring groups(sharing with MBM) could be created,
>    which reflects the maximum hardware RMID count.
> -. 'cache threshold'.
> -. Statistical information of last level cache, the actual cache
>    occupancy.
> 
> cache is splitted into 'bank's, each bank MAY have different cache
> configuration, report cache monitoring capability in unit of cache bank.
> 
> cache monitor capability is shown as below:
> 
>     <cache>
>       <bank id='0' level='3' type='both' size='15' unit='MiB' cpus='0-5'>
>         <control granularity='768' unit='KiB' type='code' maxAllocs='8'/>
>         <control granularity='768' unit='KiB' type='data' maxAllocs='8'/>
> +       <monitor threshold='540672' unit='B' maxAllocs='176'/>
> +         <feature name=llc_occupancy/>
> +       </monitor>
>       </bank>
>       <bank id='1' level='3' type='both' size='15' unit='MiB' cpus='6-11'>
>         <control granularity='768' unit='KiB' type='code' maxAllocs='8'/>
>         <control granularity='768' unit='KiB' type='data' maxAllocs='8'/>
> +       <monitor threshold='540672' unit='B' maxAllocs='176'/>
> +         <feature name=llc_occupancy/>
> +       </monitor>
> 
>       </bank>
>     </cache>
> 
> Signed-off-by: Wang Huaqiang <huaqiang.wang at intel.com>
> ---
>  docs/schemas/capability.rng | 28 ++++++++++++++++++++++++++++
>  src/conf/capabilities.c     | 17 +++++++++++++++++
>  2 files changed, 45 insertions(+)
> 

This output would be combined with part of existing patch2.

> diff --git a/docs/schemas/capability.rng b/docs/schemas/capability.rng
> index d61515c..67498f1 100644
> --- a/docs/schemas/capability.rng
> +++ b/docs/schemas/capability.rng
> @@ -314,6 +314,24 @@
>                </attribute>
>              </element>
>            </zeroOrMore>
> +          <zeroOrMore>
> +            <element name='monitor'>
> +              <attribute name='threshold'>
> +                <ref name='unsignedInt'/>
> +              </attribute>
> +              <attribute name='unit'>
> +                <ref name='unit'/>
> +              </attribute>
> +              <attribute name='maxAllocs'>
> +                <ref name='unsignedInt'/>
> +              </attribute>
> +              <zeroOrMore>
> +                <element name='feature'>
> +                  <ref name='monitorFeature'/>
> +                </element>
> +              </zeroOrMore>
> +            </element>
> +          </zeroOrMore>
>          </element>
>        </oneOrMore>
>      </element>
> @@ -329,6 +347,16 @@
>      </attribute>
>    </define>
>  
> +  <define name='monitorFeature'>
> +    <attribute name='name'>
> +      <choice>
> +        <value>llc_occupancy</value>
> +        <value>mbm_total_bytes</value>
> +        <value>mbm_local_bytes</value>

So these are the only 3 values you'll ever expect?  Probably not a good
idea to list them like this or the current algorithm is overkill looking
for prefixed "llc_" and "mbm_" values.

If "llc_somethingnew" shows up some day, then the schema is invalidated.

If all you're supporting or care about is the 3 values, then each should
be fetched separately.  Just the names make me wonder if they come with
some associated value that would be in some file.  Perhaps answered in
later patches.
> +      </choice>
> +    </attribute>
> +  </define>
> +
>    <define name='memory_bandwidth'>
>      <element name='memory_bandwidth'>
>        <oneOrMore>
> diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
> index 5280348..7932088 100644
> --- a/src/conf/capabilities.c
> +++ b/src/conf/capabilities.c
> @@ -942,6 +942,23 @@ virCapabilitiesFormatCaches(virBufferPtr buf,
>                                controls->max_allocation);
>          }
>  
> +        if (bank->monitor &&
> +            bank->monitor->nfeatures) {
> +            virBufferAsprintf(&childrenBuf,
> +                              "<monitor threshold='%u' unit='B' "

Why is "unit='B' " - does it really matter and is it technically right?
If it's only ever going to be 'B', then easy enough to document that way.

> +                              "maxAllocs='%u'>\n",
> +                              bank->monitor->cache_threshold,
> +                              bank->monitor->max_allocation);
> +            for (j = 0; j < bank->monitor->nfeatures; j++) {
> +                virBufferAdjustIndent(&childrenBuf, 2);
> +                virBufferAsprintf(&childrenBuf,
> +                                  "<feature name='%s'/>\n",
> +                                  bank->monitor->features[j]);
> +                virBufferAdjustIndent(&childrenBuf, -2);
> +            }
> +            virBufferAddLit(&childrenBuf, "</monitor>\n");
> +        }
> +

Not clear this data is at the right level, still.

John

>          if (virBufferCheckError(&childrenBuf) < 0)
>              return -1;
>  
> 




More information about the libvir-list mailing list