Sorry for the delays. Apart from some details (some even mentioned before) this looks quite alright. I'll fix up few things here and there not to bother you with another version and resend it with one fix that's also needed in my previous code. On Wed, May 31, 2017 at 09:24:37AM +0800, Eli Qiao wrote:
ping On Wednesday, 17 May 2017 at 5:08 PM, taget wrote:From: Eli Qiao <liyong.qiao@xxxxxxxxx (mailto:liyong.qiao@xxxxxxxxx)> * This patch amends the cache bank capability as follow: <cache> <bank id='0' level='3' type='unified' size='15360' unit='KiB' cpus='0-5'> <control min='768' unit='KiB' scope='both' max_allocation='4'/> </bank> <bank id='1' level='3' type='unified' size='15360' unit='KiB' cpus='6-11'> <control min='768' unit='KiB' scope='both' max_allocation='4'/> </bank> </cache> For CDP enabled on x86 arch, we will have: <cache> <bank id='0' level='3' type='unified' size='15360' unit='KiB' cpus='0-5'> <control min='768' unit='KiB' scope='code' max_allocation='4'/> <control min='768' unit='KiB' scope='data' max_allocation='4'/> </bank> ... * Added a new testdata directory `linux-resctrl-cdp` to test CDP enabled case. * Along with vircaps2xmltest case updated. P.S. here the scope is from /sys/fs/resctrl/info/L3{"" "code" "data"}, I keep it capital upper as I need to use a macro to convert from enum to string easily. Signed-off-by: Eli Qiao <liyong.qiao@xxxxxxxxx (mailto:liyong.qiao@xxxxxxxxx)> --- docs/schemas/capability.rng | 20 ++++ src/conf/capabilities.c | 133 ++++++++++++++++++++- src/conf/capabilities.h | 10 ++ .../vircaps2xmldata/linux-resctrl-cdp/resctrl/cpus | 1 + .../linux-resctrl-cdp/resctrl/info/L3CODE/cbm_mask | 1 + .../resctrl/info/L3CODE/min_cbm_bits | 1 + .../resctrl/info/L3CODE/num_closids | 1 + .../linux-resctrl-cdp/resctrl/info/L3DATA/cbm_mask | 1 + .../resctrl/info/L3DATA/min_cbm_bits | 1 + .../resctrl/info/L3DATA/num_closids | 1 + .../linux-resctrl-cdp/resctrl/manualres/cpus | 1 + .../linux-resctrl-cdp/resctrl/manualres/schemata | 2 + .../linux-resctrl-cdp/resctrl/manualres/tasks | 0 .../linux-resctrl-cdp/resctrl/schemata | 2 + .../linux-resctrl-cdp/resctrl/tasks | 0 tests/vircaps2xmldata/linux-resctrl-cdp/system | 1 + .../vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml | 55 +++++++++ tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml | 8 +- tests/vircaps2xmltest.c | 8 ++ 19 files changed, 244 insertions(+), 3 deletions(-) create mode 100644 tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/cpus create mode 100755 tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3CODE/cbm_mask create mode 100755 tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3CODE/min_cbm_bits create mode 100755 tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3CODE/num_closids create mode 100755 tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3DATA/cbm_mask create mode 100755 tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3DATA/min_cbm_bits create mode 100755 tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3DATA/num_closids create mode 100644 tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/manualres/cpus create mode 100644 tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/manualres/schemata create mode 100644 tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/manualres/tasks create mode 100644 tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/schemata create mode 100644 tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/tasks create mode 120000 tests/vircaps2xmldata/linux-resctrl-cdp/system create mode 100644 tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml diff --git a/docs/schemas/capability.rng b/docs/schemas/capability.rng index 26f0aa2..927fc18 100644 --- a/docs/schemas/capability.rng +++ b/docs/schemas/capability.rng @@ -277,6 +277,26 @@ <attribute name='cpus'> <ref name='cpuset'/> </attribute> + <zeroOrMore> + <element name='control'> + <attribute name='min'> + <ref name='unsignedInt'/> + </attribute> + <attribute name='unit'> + <ref name='unit'/> + </attribute> + <attribute name='scope'> + <choice> + <value>both</value> + <value>code</value> + <value>data</value> + </choice> + </attribute> + <attribute name='max_allocation'> + <ref name='unsignedInt'/> + </attribute> + </element> + </zeroOrMore> </element> </oneOrMore> </element> diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index d699b08..c4a1fdf 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -51,6 +51,7 @@ #define VIR_FROM_THIS VIR_FROM_CAPABILITIES #define SYSFS_SYSTEM_PATH "/sys/devices/system" +#define SYSFS_RESCTRL_PATH "/sys/fs/resctrl" VIR_LOG_INIT("conf.capabilities") @@ -872,6 +873,9 @@ virCapabilitiesFormatCaches(virBufferPtr buf, virCapsHostCacheBankPtr *caches) { size_t i = 0; + size_t j = 0; + int indent = virBufferGetIndent(buf, false); + virBuffer controlBuf = VIR_BUFFER_INITIALIZER; if (!ncaches) return 0; @@ -893,13 +897,35 @@ virCapabilitiesFormatCaches(virBufferPtr buf, */ virBufferAsprintf(buf, "<bank id='%u' level='%u' type='%s' " - "size='%llu' unit='%s' cpus='%s'/>\n", + "size='%llu' unit='%s' cpus='%s'", bank->id, bank->level, virCacheTypeToString(bank->type), bank->size >> (kilos * 10), kilos ? "KiB" : "B", cpus_str); + virBufferAdjustIndent(&controlBuf, indent + 4); + for (j = 0; j < bank->ncontrols; j++) { + bool min_kilos = !(bank->controls[j]->min % 1024); + virBufferAsprintf(&controlBuf, + "<control min='%llu' unit='%s' " + "scope='%s' max_allocation='%u'/>\n", + bank->controls[j]->min >> (min_kilos * 10), + min_kilos ? "KiB" : "B", + virCacheTypeToString(bank->controls[j]->scope), + bank->controls[j]->max_allocation); + } + + if (virBufferUse(&controlBuf)) { + virBufferAddLit(buf, ">\n"); + virBufferAddBuffer(buf, &controlBuf); + virBufferAddLit(buf, "</bank>\n"); + + } else { + virBufferAddLit(buf, "/>\n"); + } + + virBufferFreeAndReset(&controlBuf); VIR_FREE(cpus_str); } @@ -1519,13 +1545,102 @@ virCapsHostCacheBankEquals(virCapsHostCacheBankPtr a, void virCapsHostCacheBankFree(virCapsHostCacheBankPtr ptr) { + size_t i; + if (!ptr) return; virBitmapFree(ptr->cpus); + for (i = 0; i < ptr->ncontrols; i++) + VIR_FREE(ptr->controls[i]); + VIR_FREE(ptr->controls); VIR_FREE(ptr); } +/* test which TYPE of cache control supported + * -1: don't support + * 0: cat + * 1: cdp + */ +static int +virCapabilitiesGetCacheControlType(virCapsHostCacheBankPtr bank) +{ + int ret = -1; + char *path = NULL; + if (virAsprintf(&path, + SYSFS_RESCTRL_PATH "/info/L%u", + bank->level) < 0) + return -1; + + if (virFileExists(path)) { + ret = 0; + } else { + VIR_FREE(path); + /* for CDP enabled case, CODE and DATA will show together */ + if (virAsprintf(&path, + SYSFS_RESCTRL_PATH "/info/L%uCODE", + bank->level) < 0) + return -1; + if (virFileExists(path)) + ret = 1; + } + + VIR_FREE(path); + return ret; +} + +static int +virCapabilitiesGetCacheControl(virCapsHostCacheBankPtr bank, + virCacheType scope) +{ + int ret = -1; + char *path = NULL; + char *cbm_mask = NULL; + char *type_upper = NULL; + virCapsHostCacheControlPtr control; + + if (VIR_ALLOC(control) < 0) + goto cleanup; + + if ((scope > VIR_CACHE_TYPE_BOTH) + && (virStringToUpper(&type_upper, virCacheTypeToString(scope)) < 0)) + goto cleanup; + + if (virFileReadValueUint(&control->max_allocation, + SYSFS_RESCTRL_PATH "/info/L%u%s/num_closids", + bank->level, + type_upper ? type_upper : "") < 0) + goto cleanup; + + if (virFileReadValueString(&cbm_mask, + SYSFS_RESCTRL_PATH + "/info/L%u%s/cbm_mask", + bank->level, + type_upper ? type_upper: "") < 0) + goto cleanup; + + virStringTrimOptionalNewline(cbm_mask); + + /* cbm_mask: cache bit mask, it's in hex, eg: fffff */ + control->min = bank->size / (strlen(cbm_mask) * 4); + + control->scope = scope; + + if (VIR_APPEND_ELEMENT(bank->controls, + bank->ncontrols, + control) < 0) + goto cleanup; + + ret = 0; + + cleanup: + VIR_FREE(path); + VIR_FREE(cbm_mask); + VIR_FREE(type_upper); + VIR_FREE(control); + return ret; +} + int virCapabilitiesInitCaches(virCapsPtr caps) { @@ -1534,6 +1649,7 @@ virCapabilitiesInitCaches(virCapsPtr caps) ssize_t pos = -1; DIR *dirp = NULL; int ret = -1; + int typeret; char *path = NULL; char *type = NULL; struct dirent *ent = NULL; @@ -1607,12 +1723,27 @@ virCapabilitiesInitCaches(virCapsPtr caps) SYSFS_SYSTEM_PATH, pos, ent->d_name) < 0) goto cleanup; + typeret = virCapabilitiesGetCacheControlType(bank); + + if (typeret == 0) { + if (virCapabilitiesGetCacheControl(bank, + VIR_CACHE_TYPE_BOTH) < 0) + goto cleanup; + } else if (typeret == 1) { + if ((virCapabilitiesGetCacheControl(bank, + VIR_CACHE_TYPE_CODE) < 0) || + (virCapabilitiesGetCacheControl(bank, + VIR_CACHE_TYPE_DATA) < 0)) + goto cleanup; + } + kernel_type = virCacheKernelTypeFromString(type); if (kernel_type < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Unknown cache type '%s'"), type); goto cleanup; } + bank->type = kernel_type; VIR_FREE(type); diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h index a8cccf7..ee87d59 100644 --- a/src/conf/capabilities.h +++ b/src/conf/capabilities.h @@ -148,6 +148,14 @@ typedef enum { VIR_ENUM_DECL(virCache); +typedef struct _virCapsHostCacheControl virCapsHostCacheControl; +typedef virCapsHostCacheControl *virCapsHostCacheControlPtr; +struct _virCapsHostCacheControl { + unsigned long long min; /* minimum cache control size in B */ + virCacheType scope; /* data, code or both */ + unsigned int max_allocation; /* max number of supported allocations */ +}; + typedef struct _virCapsHostCacheBank virCapsHostCacheBank; typedef virCapsHostCacheBank *virCapsHostCacheBankPtr; struct _virCapsHostCacheBank { @@ -156,6 +164,8 @@ struct _virCapsHostCacheBank { unsigned long long size; /* B */ virCacheType type; /* Data, Instruction or Unified */ virBitmapPtr cpus; /* All CPUs that share this bank */ + size_t ncontrols; + virCapsHostCacheControlPtr *controls; }; typedef struct _virCapsHost virCapsHost; diff --git a/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/cpus b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/cpus new file mode 100644 index 0000000..b3a79aa --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/cpus @@ -0,0 +1 @@ +ffffff,ffffffff,ffffffff diff --git a/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3CODE/cbm_mask b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3CODE/cbm_mask new file mode 100755 index 0000000..78031da --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3CODE/cbm_mask @@ -0,0 +1 @@ +fffff diff --git a/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3CODE/min_cbm_bits b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3CODE/min_cbm_bits new file mode 100755 index 0000000..d00491f --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3CODE/min_cbm_bits @@ -0,0 +1 @@ +1 diff --git a/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3CODE/num_closids b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3CODE/num_closids new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3CODE/num_closids @@ -0,0 +1 @@ +8 diff --git a/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3DATA/cbm_mask b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3DATA/cbm_mask new file mode 100755 index 0000000..78031da --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3DATA/cbm_mask @@ -0,0 +1 @@ +fffff diff --git a/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3DATA/min_cbm_bits b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3DATA/min_cbm_bits new file mode 100755 index 0000000..d00491f --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3DATA/min_cbm_bits @@ -0,0 +1 @@ +1 diff --git a/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3DATA/num_closids b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3DATA/num_closids new file mode 100755 index 0000000..45a4fb7 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/info/L3DATA/num_closids @@ -0,0 +1 @@ +8 diff --git a/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/manualres/cpus b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/manualres/cpus new file mode 100644 index 0000000..ede4cc2 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/manualres/cpus @@ -0,0 +1 @@ +000000,00000000,00000000 diff --git a/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/manualres/schemata b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/manualres/schemata new file mode 100644 index 0000000..a0ef381 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/manualres/schemata @@ -0,0 +1,2 @@ +L3DATA:0=c0000;1=c0000 +L3CODE:0=30000;1=30000 diff --git a/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/manualres/tasks b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/manualres/tasks new file mode 100644 index 0000000..e69de29 diff --git a/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/schemata b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/schemata new file mode 100644 index 0000000..89dc76b --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/schemata @@ -0,0 +1,2 @@ +L3DATA:0=fffff;1=fffff +L3CODE:0=fffff;1=fffff diff --git a/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/tasks b/tests/vircaps2xmldata/linux-resctrl-cdp/resctrl/tasks new file mode 100644 index 0000000..e69de29 diff --git a/tests/vircaps2xmldata/linux-resctrl-cdp/system b/tests/vircaps2xmldata/linux-resctrl-cdp/system new file mode 120000 index 0000000..2f3a1d9 --- /dev/null +++ b/tests/vircaps2xmldata/linux-resctrl-cdp/system @@ -0,0 +1 @@ +../linux-resctrl/system/ \ No newline at end of file diff --git a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml new file mode 100644 index 0000000..c9f460d --- /dev/null +++ b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml @@ -0,0 +1,55 @@ +<capabilities> + + <host> + <cpu> + <arch>x86_64</arch> + </cpu> + <power_management/> + <migration_features> + <live/> + </migration_features> + <topology> + <cells num='2'> + <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='6'> + <cpu id='0' socket_id='0' core_id='0' siblings='0'/> + <cpu id='1' socket_id='0' core_id='1' siblings='1'/> + <cpu id='2' socket_id='0' core_id='2' siblings='2'/> + <cpu id='3' socket_id='0' core_id='3' siblings='3'/> + <cpu id='4' socket_id='0' core_id='4' siblings='4'/> + <cpu id='5' socket_id='0' core_id='5' siblings='5'/> + </cpus> + </cell> + <cell id='1'> + <memory unit='KiB'>2097152</memory> + <pages unit='KiB' size='4'>4096</pages> + <pages unit='KiB' size='2048'>6144</pages> + <pages unit='KiB' size='1048576'>8192</pages> + <cpus num='6'> + <cpu id='6' socket_id='1' core_id='0' siblings='6'/> + <cpu id='7' socket_id='1' core_id='1' siblings='7'/> + <cpu id='8' socket_id='1' core_id='2' siblings='8'/> + <cpu id='9' socket_id='1' core_id='3' siblings='9'/> + <cpu id='10' socket_id='1' core_id='4' siblings='10'/> + <cpu id='11' socket_id='1' core_id='5' siblings='11'/> + </cpus> + </cell> + </cells> + </topology> + <cache> + <bank id='0' level='3' type='both' size='15360' unit='KiB' cpus='0-5'> + <control min='768' unit='KiB' scope='code' max_allocation='8'/> + <control min='768' unit='KiB' scope='data' max_allocation='8'/> + </bank> + <bank id='1' level='3' type='both' size='15360' unit='KiB' cpus='6-11'> + <control min='768' unit='KiB' scope='code' max_allocation='8'/> + <control min='768' unit='KiB' scope='data' max_allocation='8'/> + </bank> + </cache> + </host> + +</capabilities> diff --git a/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml b/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml index 6677791..04a5eb8 100644 --- a/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml +++ b/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml @@ -41,8 +41,12 @@ </cells> </topology> <cache> - <bank id='0' level='3' type='both' size='15360' unit='KiB' cpus='0-5'/> - <bank id='1' level='3' type='both' size='15360' unit='KiB' cpus='6-11'/> + <bank id='0' level='3' type='both' size='15360' unit='KiB' cpus='0-5'> + <control min='768' unit='KiB' scope='both' max_allocation='4'/> + </bank> + <bank id='1' level='3' type='both' size='15360' unit='KiB' cpus='6-11'> + <control min='768' unit='KiB' scope='both' max_allocation='4'/> + </bank> </cache> </host> diff --git a/tests/vircaps2xmltest.c b/tests/vircaps2xmltest.c index 137598e..ae1cd52 100644 --- a/tests/vircaps2xmltest.c +++ b/tests/vircaps2xmltest.c @@ -47,6 +47,7 @@ test_virCapabilities(const void *opaque) char *capsXML = NULL; char *path = NULL; char *dir = NULL; + char *resctrl = NULL; int ret = -1; /* @@ -58,7 +59,12 @@ test_virCapabilities(const void *opaque) data->resctrl ? "/system" : "") < 0) goto cleanup; + if (virAsprintf(&resctrl, "%s/vircaps2xmldata/linux-%s/resctrl", + abs_srcdir, data->filename) < 0) + goto cleanup; + virFileWrapperAddPrefix("/sys/devices/system", dir); + virFileWrapperAddPrefix("/sys/fs/resctrl", resctrl); caps = virCapabilitiesNew(data->arch, data->offlineMigrate, data->liveMigrate); if (!caps) @@ -84,6 +90,7 @@ test_virCapabilities(const void *opaque) cleanup: VIR_FREE(dir); + VIR_FREE(resctrl); VIR_FREE(path); VIR_FREE(capsXML); virObjectUnref(caps); @@ -112,6 +119,7 @@ mymain(void) DO_TEST("caches", VIR_ARCH_X86_64); DO_TEST_FULL("resctrl", VIR_ARCH_X86_64, true, true, true); + DO_TEST_FULL("resctrl-cdp", VIR_ARCH_X86_64, true, true, true); return ret; } -- 1.9.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx (mailto:libvir-list@xxxxxxxxxx) https://www.redhat.com/mailman/listinfo/libvir-list
Attachment:
signature.asc
Description: Digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list