On some platforms the number of bits in the cbm_mask might not be divisible by 4 (and not even by 2), so we need to properly count the bits. Similar file, min_cbm_bits, is properly parsed and used, but if the number is greater than one, we lose the information about granularity when reporting the data in capabilities. For that matter always report granularity, but if it is not the same as the minimum, add that information in there as well. Signed-off-by: Martin Kletzander <mkletzan@xxxxxxxxxx> --- docs/schemas/capability.rng | 7 ++++- src/conf/capabilities.c | 34 ++++++++++++++++++---- src/conf/capabilities.h | 1 + .../linux-resctrl-skx/resctrl/info/L3/cbm_mask | 1 + .../linux-resctrl-skx/resctrl/info/L3/min_cbm_bits | 1 + .../linux-resctrl-skx/resctrl/info/L3/num_closids | 1 + .../linux-resctrl-skx/resctrl/schemata | 1 + .../system/cpu/cpu0/cache/index0/id | 1 + .../system/cpu/cpu0/cache/index0/level | 1 + .../system/cpu/cpu0/cache/index0/shared_cpu_list | 1 + .../system/cpu/cpu0/cache/index0/shared_cpu_map | 1 + .../system/cpu/cpu0/cache/index0/size | 1 + .../system/cpu/cpu0/cache/index0/type | 1 + .../linux-resctrl-skx/system/cpu/cpu0/online | 1 + .../system/cpu/cpu0/topology/core_id | 1 + .../system/cpu/cpu0/topology/core_siblings | 1 + .../system/cpu/cpu0/topology/core_siblings_list | 1 + .../system/cpu/cpu0/topology/physical_package_id | 1 + .../system/cpu/cpu0/topology/thread_siblings | 1 + .../system/cpu/cpu0/topology/thread_siblings_list | 1 + .../linux-resctrl-skx/system/cpu/online | 1 + .../linux-resctrl-skx/system/cpu/present | 1 + .../linux-resctrl-skx/system/node/node0/cpu0 | 1 + .../linux-resctrl-skx/system/node/node0/cpulist | 1 + .../linux-resctrl-skx/system/node/node0/cpumap | 1 + .../linux-resctrl-skx/system/node/node0/distance | 1 + .../linux-resctrl-skx/system/node/online | 1 + .../vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml | 8 ++--- .../vircaps2xmldata/vircaps-x86_64-resctrl-skx.xml | 31 ++++++++++++++++++++ tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml | 4 +-- tests/vircaps2xmltest.c | 1 + 31 files changed, 97 insertions(+), 13 deletions(-) create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/resctrl/info/L3/cbm_mask create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/resctrl/info/L3/min_cbm_bits create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/resctrl/info/L3/num_closids create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/resctrl/schemata create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/id create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/level create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/shared_cpu_list create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/shared_cpu_map create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/size create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/type create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/online create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/core_id create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/core_siblings create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/core_siblings_list create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/physical_package_id create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/thread_siblings create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/thread_siblings_list create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/online create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/present create mode 120000 tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/cpu0 create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/cpulist create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/cpumap create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/distance create mode 100644 tests/vircaps2xmldata/linux-resctrl-skx/system/node/online create mode 100644 tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx.xml diff --git a/docs/schemas/capability.rng b/docs/schemas/capability.rng index e5cbfa362ec0..071090c2d991 100644 --- a/docs/schemas/capability.rng +++ b/docs/schemas/capability.rng @@ -273,9 +273,14 @@ </attribute> <zeroOrMore> <element name='control'> - <attribute name='min'> + <attribute name='granularity'> <ref name='unsignedInt'/> </attribute> + <optional> + <attribute name='min'> + <ref name='unsignedInt'/> + </attribute> + </optional> <attribute name='unit'> <ref name='unit'/> </attribute> diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 3becc7e18c62..0f99f3096292 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -31,6 +31,7 @@ #include <unistd.h> #include "capabilities.h" +#include "c-ctype.h" #include "count-one-bits.h" #include "cpu_conf.h" #include "domain_conf.h" @@ -906,11 +907,24 @@ virCapabilitiesFormatCaches(virBufferPtr buf, virBufferAdjustIndent(&controlBuf, indent + 4); for (j = 0; j < bank->ncontrols; j++) { - bool min_kilos = !(bank->controls[j]->min % 1024); + bool min_kilos = !(bank->controls[j]->granularity % 1024); + + /* Only use KiB if both values are divisible */ + if (bank->controls[j]->min) + min_kilos = min_kilos && !(bank->controls[j]->min % 1024); + + virBufferAsprintf(&controlBuf, + "<control granularity='%llu'", + bank->controls[j]->granularity >> (min_kilos * 10)); + + if (bank->controls[j]->min) { + virBufferAsprintf(&controlBuf, + " min='%llu'", + bank->controls[j]->min >> (min_kilos * 10)); + } + virBufferAsprintf(&controlBuf, - "<control min='%llu' unit='%s' " - "type='%s' maxAllocs='%u'/>\n", - bank->controls[j]->min >> (min_kilos * 10), + " unit='%s' type='%s' maxAllocs='%u'/>\n", min_kilos ? "KiB" : "B", virCacheTypeToString(bank->controls[j]->scope), bank->controls[j]->max_allocation); @@ -1598,9 +1612,11 @@ virCapabilitiesGetCacheControl(virCapsHostCacheBankPtr bank, virCacheType scope) { int ret = -1; + char *tmp = NULL; char *path = NULL; char *cbm_mask = NULL; char *type_upper = NULL; + unsigned int bits = 0; unsigned int min_cbm_bits = 0; virCapsHostCacheControlPtr control; @@ -1632,8 +1648,14 @@ virCapabilitiesGetCacheControl(virCapsHostCacheBankPtr bank, virStringTrimOptionalNewline(cbm_mask); - /* cbm_mask: cache bit mask, it's in hex, eg: fffff */ - control->min = min_cbm_bits * bank->size / (strlen(cbm_mask) * 4); + for (tmp = cbm_mask; *tmp != '\0'; tmp++) { + if (c_isxdigit(*tmp)) + bits += count_one_bits(virHexToBin(*tmp)); + } + + control->granularity = bank->size / bits; + if (min_cbm_bits != 1) + control->min = min_cbm_bits * control->granularity; control->scope = scope; diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h index ee87d598ef66..d4753db0beec 100644 --- a/src/conf/capabilities.h +++ b/src/conf/capabilities.h @@ -152,6 +152,7 @@ typedef struct _virCapsHostCacheControl virCapsHostCacheControl; typedef virCapsHostCacheControl *virCapsHostCacheControlPtr; struct _virCapsHostCacheControl { unsigned long long min; /* minimum cache control size in B */ + unsigned long long granularity; /* minimum increase step for min in B */ virCacheType scope; /* data, code or both */ unsigned int max_allocation; /* max number of supported allocations */ }; diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/resctrl/info/L3/cbm_mask b/tests/vircaps2xmldata/linux-resctrl-skx/resctrl/info/L3/cbm_mask new file mode 100644 index 000000000000..d482bbb26931 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/resctrl/info/L3/cbm_mask @@ -0,0 +1 @@ +7ff diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/resctrl/info/L3/min_cbm_bits b/tests/vircaps2xmldata/linux-resctrl-skx/resctrl/info/L3/min_cbm_bits new file mode 100644 index 000000000000..d00491fd7e5b --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/resctrl/info/L3/min_cbm_bits @@ -0,0 +1 @@ +1 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/resctrl/info/L3/num_closids b/tests/vircaps2xmldata/linux-resctrl-skx/resctrl/info/L3/num_closids new file mode 100644 index 000000000000..b6a7d89c68e0 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/resctrl/info/L3/num_closids @@ -0,0 +1 @@ +16 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/resctrl/schemata b/tests/vircaps2xmldata/linux-resctrl-skx/resctrl/schemata new file mode 100644 index 000000000000..4a4913735386 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/resctrl/schemata @@ -0,0 +1 @@ +L3:0=7ff;1=7ff diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/id b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/id new file mode 100644 index 000000000000..573541ac9702 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/id @@ -0,0 +1 @@ +0 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/level b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/level new file mode 100644 index 000000000000..00750edc07d6 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/level @@ -0,0 +1 @@ +3 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/shared_cpu_list b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/shared_cpu_list new file mode 100644 index 000000000000..573541ac9702 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/shared_cpu_list @@ -0,0 +1 @@ +0 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/shared_cpu_map b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/shared_cpu_map new file mode 100644 index 000000000000..5325a8dff751 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/shared_cpu_map @@ -0,0 +1 @@ +001 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/size b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/size new file mode 100644 index 000000000000..24a7d60e7fb9 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/size @@ -0,0 +1 @@ +11264K diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/type b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/type new file mode 100644 index 000000000000..e4fd9dccda2c --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/cache/index0/type @@ -0,0 +1 @@ +Unified diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/online b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/online new file mode 100644 index 000000000000..d00491fd7e5b --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/online @@ -0,0 +1 @@ +1 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/core_id b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/core_id new file mode 100644 index 000000000000..573541ac9702 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/core_id @@ -0,0 +1 @@ +0 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/core_siblings b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/core_siblings new file mode 100644 index 000000000000..5325a8dff751 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/core_siblings @@ -0,0 +1 @@ +001 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/core_siblings_list b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/core_siblings_list new file mode 100644 index 000000000000..573541ac9702 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/core_siblings_list @@ -0,0 +1 @@ +0 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/physical_package_id b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/physical_package_id new file mode 100644 index 000000000000..573541ac9702 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/physical_package_id @@ -0,0 +1 @@ +0 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/thread_siblings b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/thread_siblings new file mode 100644 index 000000000000..5325a8dff751 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/thread_siblings @@ -0,0 +1 @@ +001 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/thread_siblings_list b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/thread_siblings_list new file mode 100644 index 000000000000..573541ac9702 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/cpu0/topology/thread_siblings_list @@ -0,0 +1 @@ +0 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/online b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/online new file mode 100644 index 000000000000..573541ac9702 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/online @@ -0,0 +1 @@ +0 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/present b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/present new file mode 100644 index 000000000000..573541ac9702 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/cpu/present @@ -0,0 +1 @@ +0 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/cpu0 b/tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/cpu0 new file mode 120000 index 000000000000..c841bea28b2b --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/cpu0 @@ -0,0 +1 @@ +../../cpu/cpu0 \ No newline at end of file diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/cpulist b/tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/cpulist new file mode 100644 index 000000000000..573541ac9702 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/cpulist @@ -0,0 +1 @@ +0 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/cpumap b/tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/cpumap new file mode 100644 index 000000000000..5325a8dff751 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/cpumap @@ -0,0 +1 @@ +001 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/distance b/tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/distance new file mode 100644 index 000000000000..f599e28b8ab0 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/node/node0/distance @@ -0,0 +1 @@ +10 diff --git a/tests/vircaps2xmldata/linux-resctrl-skx/system/node/online b/tests/vircaps2xmldata/linux-resctrl-skx/system/node/online new file mode 100644 index 000000000000..573541ac9702 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-skx/system/node/online @@ -0,0 +1 @@ +0 diff --git a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml index 49aa0b98ca88..7361537bfb56 100644 --- a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml +++ b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml @@ -42,12 +42,12 @@ </topology> <cache> <bank id='0' level='3' type='both' size='15360' unit='KiB' cpus='0-5'> - <control min='768' unit='KiB' type='code' maxAllocs='8'/> - <control min='768' unit='KiB' type='data' maxAllocs='8'/> + <control granularity='768' unit='KiB' type='code' maxAllocs='8'/> + <control granularity='768' unit='KiB' type='data' maxAllocs='8'/> </bank> <bank id='1' level='3' type='both' size='15360' unit='KiB' cpus='6-11'> - <control min='768' unit='KiB' type='code' maxAllocs='8'/> - <control min='768' unit='KiB' type='data' maxAllocs='8'/> + <control granularity='768' unit='KiB' type='code' maxAllocs='8'/> + <control granularity='768' unit='KiB' type='data' maxAllocs='8'/> </bank> </cache> </host> diff --git a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx.xml b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx.xml new file mode 100644 index 000000000000..f582581148f7 --- /dev/null +++ b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx.xml @@ -0,0 +1,31 @@ +<capabilities> + + <host> + <cpu> + <arch>x86_64</arch> + </cpu> + <power_management/> + <migration_features> + <live/> + </migration_features> + <topology> + <cells num='1'> + <cell id='0'> + <memory unit='KiB'>1048576</memory> + <pages unit='KiB' size='4'>2048</pages> + <pages unit='KiB' size='2048'>4096</pages> + <pages unit='KiB' size='1048576'>6144</pages> + <cpus num='1'> + <cpu id='0' socket_id='0' core_id='0' siblings='0'/> + </cpus> + </cell> + </cells> + </topology> + <cache> + <bank id='0' level='3' type='both' size='11264' unit='KiB' cpus='0'> + <control granularity='1024' unit='KiB' type='both' maxAllocs='16'/> + </bank> + </cache> + </host> + +</capabilities> diff --git a/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml b/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml index cb78b4ab788d..eb02ad3322a2 100644 --- a/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml +++ b/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml @@ -42,10 +42,10 @@ </topology> <cache> <bank id='0' level='3' type='both' size='15360' unit='KiB' cpus='0-5'> - <control min='1536' unit='KiB' type='both' maxAllocs='4'/> + <control granularity='768' min='1536' unit='KiB' type='both' maxAllocs='4'/> </bank> <bank id='1' level='3' type='both' size='15360' unit='KiB' cpus='6-11'> - <control min='1536' unit='KiB' type='both' maxAllocs='4'/> + <control granularity='768' min='1536' unit='KiB' type='both' maxAllocs='4'/> </bank> </cache> </host> diff --git a/tests/vircaps2xmltest.c b/tests/vircaps2xmltest.c index ae1cd521111e..c0a67858fec3 100644 --- a/tests/vircaps2xmltest.c +++ b/tests/vircaps2xmltest.c @@ -120,6 +120,7 @@ mymain(void) DO_TEST_FULL("resctrl", VIR_ARCH_X86_64, true, true, true); DO_TEST_FULL("resctrl-cdp", VIR_ARCH_X86_64, true, true, true); + DO_TEST_FULL("resctrl-skx", VIR_ARCH_X86_64, true, true, true); return ret; } -- 2.13.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list