-- Best regards Eli
天涯无处不重逢 a leaf duckweed belongs to the sea, where not to meet in life Sent with Sparrow (http://www.sparrowmailapp.com/?sig) On Thursday, 16 March 2017 at 3:52 PM, Eli Qiao wrote: > > > -- > Best regards > Eli > > 天涯无处不重逢 > a leaf duckweed belongs to the sea, where not to meet in life > > Sent with Sparrow (http://www.sparrowmailapp.com/?sig) > > > On Wednesday, 15 March 2017 at 7:57 PM, Martin Kletzander wrote: > > > On Mon, Mar 06, 2017 at 06:06:30PM +0800, Eli Qiao wrote: > > > This patch adds some utils struct and functions to expose resctrl > > > information. > > > > > > virResCtrlAvailable: if resctrl interface exist on host. > > > virResCtrlGet: get specific type resource control information. > > > virResCtrlInit: initialize resctrl struct from the host's sys fs. > > > resctrlall[]: an array to maintain resource control information. > > > > > > Some of host cpu related information methods was added in virhostcpu.c > > > > So to be able to test all this we need to make a bit different approach. > > I'm not in favour of pushing this without proper tests. Some paths need > > to be configurable, some readings should be unified. Unfortunately lot > > of the code is just copy-paste mess from the past. Fortunately for you, > > > > > > > > I'm working on cleaning this up, at least a little bit, so that we can > > > > > > > > Good news. > > add the tests easily. I got almost up to the test (I stumbled upon few > > rabbit holes on the way and some clean-ups went wrong along the way), so > > it should be pretty easy for you to modify this code to use what I'll be > > proposing to add. It's not ready yet, but you can start rebasing your > > series on top of my branch pre-cat from my github repo [1]. The commits > > are not very well described right now (for some temporary ones I used > > whatthecommit.com (http://whatthecommit.com), sorry), but I'll fix all > > that. I'll be updating the > > branch, but it will be done with force pushes, so be careful when > > rebasing on top of newer versions. > > > > I can do that if you don't want, just let me know so we can coordinate. > > > of cause we can do some coordinate, but I am glad that you can help on this > to speed up the progress to merge them, as you know this patch is in V10 > already, and it has 12 patch set, kinds of hard to doing rebase… :( > > > > Just a quick heads-up, there will be virsysfs that will be used for the > > reads, some additional helper functions in virhostcpu and virfile, test > > that scans copy of /sys/devices/system (with that path faked thanks to > > using the aforementioned virsysfs) and outputs capabilities so that we > > can check the capability XML and so on. > > > > > > > > > Ah, that’s a good news.. > > > > Martin > > > > [1] https://github.com/nertpinx/libvirt hi Martin So, if I understand you correctly , you want all my patch set to rebased on top of pre-cat branch [1] , I checked that the last commit is 15th March, I wonder if that ’s ready to merged into master? so that I can start doing the rebasing Thx Eli. > > > > > Signed-off-by: Eli Qiao <liyong.q...@intel.com > > > (mailto:liyong.q...@intel.com)> > > > --- > > > include/libvirt/virterror.h | 1 + > > > po/POTFILES.in (http://POTFILES.in) | 1 + > > > src/Makefile.am (http://Makefile.am) | 1 + > > > src/libvirt_private.syms | 4 + > > > src/util/virerror.c | 1 + > > > src/util/virhostcpu.c | 186 ++++++++++++++++++++++++++++++++++++---- > > > src/util/virhostcpu.h | 6 ++ > > > src/util/virresctrl.c | 201 ++++++++++++++++++++++++++++++++++++++++++++ > > > src/util/virresctrl.h | 78 +++++++++++++++++ > > > 9 files changed, 462 insertions(+), 17 deletions(-) > > > create mode 100644 src/util/virresctrl.c > > > create mode 100644 src/util/virresctrl.h > > > > > > diff --git a/include/libvirt/virterror.h b/include/libvirt/virterror.h > > > index 2efee8f..3dd2d08 100644 > > > --- a/include/libvirt/virterror.h > > > +++ b/include/libvirt/virterror.h > > > @@ -132,6 +132,7 @@ typedef enum { > > > > > > VIR_FROM_PERF = 65, /* Error from perf */ > > > VIR_FROM_LIBSSH = 66, /* Error from libssh connection transport */ > > > + VIR_FROM_RESCTRL = 67, /* Error from resource control */ > > > > > > # ifdef VIR_ENUM_SENTINELS > > > VIR_ERR_DOMAIN_LAST > > > diff --git a/po/POTFILES.in (http://POTFILES.in) b/po/POTFILES.in > > > (http://POTFILES.in) > > > index 7c7f530..4147bc6 100644 > > > --- a/po/POTFILES.in (http://POTFILES.in) > > > +++ b/po/POTFILES.in (http://POTFILES.in) > > > @@ -241,6 +241,7 @@ src/util/virportallocator.c > > > src/util/virprocess.c > > > src/util/virqemu.c > > > src/util/virrandom.c > > > +src/util/virresctrl.c > > > src/util/virrotatingfile.c > > > src/util/virscsi.c > > > src/util/virscsihost.c > > > diff --git a/src/Makefile.am (http://Makefile.am) b/src/Makefile.am > > > (http://Makefile.am) > > > index 7d42eac..edb946a 100644 > > > --- a/src/Makefile.am (http://Makefile.am) > > > +++ b/src/Makefile.am (http://Makefile.am) > > > @@ -162,6 +162,7 @@ UTIL_SOURCES = \ > > > util/virprocess.c util/virprocess.h \ > > > util/virqemu.c util/virqemu.h \ > > > util/virrandom.h util/virrandom.c \ > > > + util/virresctrl.h util/virresctrl.c \ > > > util/virrotatingfile.h util/virrotatingfile.c \ > > > util/virscsi.c util/virscsi.h \ > > > util/virscsihost.c util/virscsihost.h \ > > > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms > > > index aed1d3d..bb7c3ad 100644 > > > --- a/src/libvirt_private.syms > > > +++ b/src/libvirt_private.syms > > > @@ -2320,6 +2320,10 @@ virRandomGenerateWWN; > > > virRandomInt; > > > > > > > > > +# util/virresctrl.h > > > +virResCtrlAvailable; > > > +virResCtrlInit; > > > + > > > # util/virrotatingfile.h > > > virRotatingFileReaderConsume; > > > virRotatingFileReaderFree; > > > diff --git a/src/util/virerror.c b/src/util/virerror.c > > > index ef17fb5..0ba15e6 100644 > > > --- a/src/util/virerror.c > > > +++ b/src/util/virerror.c > > > @@ -139,6 +139,7 @@ VIR_ENUM_IMPL(virErrorDomain, VIR_ERR_DOMAIN_LAST, > > > > > > "Perf", /* 65 */ > > > "Libssh transport layer", > > > + "Resouce Control", > > > ) > > > > > > > > > diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c > > > index f29f312..e6d5102 100644 > > > --- a/src/util/virhostcpu.c > > > +++ b/src/util/virhostcpu.c > > > @@ -206,29 +206,21 @@ void virHostCPUSetSysFSSystemPathLinux(const char > > > *path) > > > sysfs_system_path = SYSFS_SYSTEM_PATH; > > > } > > > > > > -/* Return the positive decimal contents of the given > > > - * DIR/cpu%u/FILE, or -1 on error. If DEFAULT_VALUE is non-negative > > > - * and the file could not be found, return that instead of an error; > > > - * this is useful for machines that cannot hot-unplug cpu0, or where > > > - * hot-unplugging is disabled, or where the kernel is too old > > > - * to support NUMA cells, etc. */ > > > +/* Get a String value*/ > > > static int > > > -virHostCPUGetValue(const char *dir, unsigned int cpu, const char *file, > > > - int default_value) > > > +virHostCPUGetStrValue(const char *dir, unsigned int cpu, const char > > > *file, char *value_str) > > > { > > > char *path; > > > FILE *pathfp; > > > - int value = -1; > > > - char value_str[INT_BUFSIZE_BOUND(value)]; > > > - char *tmp; > > > + int ret = -1; > > > > > > if (virAsprintf(&path, "%s/cpu%u/%s", dir, cpu, file) < 0) > > > return -1; > > > > > > pathfp = fopen(path, "r"); > > > if (pathfp == NULL) { > > > - if (default_value >= 0 && errno == ENOENT) > > > - value = default_value; > > > + if (errno == ENOENT) > > > + return -2; > > > else > > > virReportSystemError(errno, _("cannot open %s"), path); > > > goto cleanup; > > > @@ -238,17 +230,84 @@ virHostCPUGetValue(const char *dir, unsigned int > > > cpu, const char *file, > > > virReportSystemError(errno, _("cannot read from %s"), path); > > > goto cleanup; > > > } > > > + > > > + ret = 0; > > > + > > > + cleanup: > > > + VIR_FORCE_FCLOSE(pathfp); > > > + VIR_FREE(path); > > > + return ret; > > > +} > > > + > > > + > > > +/* Return the positive decimal contents of the given > > > + * DIR/cpu%u/FILE, or -1 on error. If DEFAULT_VALUE is non-negative > > > + * and the file could not be found, return that instead of an error; > > > + * this is useful for machines that cannot hot-unplug cpu0, or where > > > + * hot-unplugging is disabled, or where the kernel is too old > > > + * to support NUMA cells, etc. */ > > > +static int > > > +virHostCPUGetValue(const char *dir, unsigned int cpu, const char *file, > > > + int default_value) > > > +{ > > > + int value = -1; > > > + char value_str[INT_BUFSIZE_BOUND(value)]; > > > + char *tmp; > > > + int ret; > > > + > > > + if ((ret = (virHostCPUGetStrValue(dir, cpu, file, value_str))) < 0) { > > > + if (ret == -2 && default_value >= 0) > > > + return default_value; > > > + else > > > + return -1; > > > + } > > > + > > > if (virStrToLong_i(value_str, &tmp, 10, &value) < 0) { > > > virReportError(VIR_ERR_INTERNAL_ERROR, > > > _("could not convert '%s' to an integer"), > > > value_str); > > > - goto cleanup; > > > + return -1; > > > } > > > + return value; > > > +} > > > > > > - cleanup: > > > - VIR_FORCE_FCLOSE(pathfp); > > > - VIR_FREE(path); > > > +/* Return specific type cache size in KiB of given cpu > > > + -1 on error happened */ > > > +static > > > +int virHostCPUGetCache(unsigned int cpu, unsigned int type) > > > +{ > > > + char *cachedir = NULL; > > > + char *cpudir; > > > + char *unit = NULL; > > > + char *tmp; > > > + int value = -1; > > > + unsigned long long size; > > > + char value_str[INT_BUFSIZE_BOUND(value)]; > > > > > > + if (virAsprintf(&cpudir, "%s/cpu", sysfs_system_path) < 0) > > > + return -1; > > > + > > > + if (virAsprintf(&cachedir, "cache/index%u/size", type) < 0) > > > + goto error; > > > + > > > + if (virHostCPUGetStrValue(cpudir, cpu, cachedir, value_str) < 0) > > > + goto error; > > > + > > > + if ((tmp = strchr(value_str, '\n'))) *tmp = '\0'; > > > + > > > + if (virStrToLong_i(value_str, &unit, 10, &value) < 0) > > > + goto error; > > > + > > > + size = value; > > > + > > > + if (virScaleInteger(&size, unit, 1, ULLONG_MAX) < 0) > > > + goto error; > > > + > > > + return size / 1024; > > > + > > > + error: > > > + VIR_FREE(cpudir); > > > + VIR_FREE(cachedir); > > > return value; > > > } > > > > > > @@ -301,6 +360,23 @@ virHostCPUParseSocket(const char *dir, > > > return ret; > > > } > > > > > > +/* return socket id of a given cpu*/ > > > +static > > > +int virHostCPUGetSocketId(virArch hostarch, unsigned int cpu) > > > +{ > > > + char *cpu_dir; > > > + int ret = -1; > > > + > > > + if (virAsprintf(&cpu_dir, "%s/cpu", sysfs_system_path) < 0) > > > + goto cleanup; > > > + > > > + ret = virHostCPUParseSocket(cpu_dir, hostarch, cpu); > > > + > > > + cleanup: > > > + VIR_FREE(cpu_dir); > > > + return ret; > > > +} > > > + > > > /* parses a node entry, returning number of processors in the node and > > > * filling arguments */ > > > static int > > > @@ -1346,3 +1422,79 @@ virHostCPUGetKVMMaxVCPUs(void) > > > return -1; > > > } > > > #endif /* HAVE_LINUX_KVM_H */ > > > + > > > +/* Fill all cache bank informations > > > + * Return a list of virResCacheBankPtr, and fill cache bank information > > > + * by loop for all cpus on host, number of cache bank will be set in > > > nbanks > > > + * > > > + * NULL if error happened, and nbanks will be set 0. */ > > > +virResCacheBankPtr virHostCPUGetCacheBanks(virArch arch, int type, > > > size_t *nbanks, int cbm_len) > > > +{ > > > + int npresent_cpus; > > > + int idx; > > > + size_t i; > > > + virResCacheBankPtr bank; > > > + > > > + *nbanks = 0; > > > + if ((npresent_cpus = virHostCPUGetCount()) < 0) > > > + return NULL; > > > + > > > + switch (type) { > > > + case VIR_RDT_RESOURCE_L3: > > > + case VIR_RDT_RESOURCE_L3DATA: > > > + case VIR_RDT_RESOURCE_L3CODE: > > > + idx = 3; > > > + break; > > > + case VIR_RDT_RESOURCE_L2: > > > + idx = 2; > > > + break; > > > + default: > > > + idx = -1; > > > + } > > > + > > > + if (idx == -1) > > > + return NULL; > > > + > > > + if (VIR_ALLOC_N(bank, 1) < 0) > > > + return NULL; > > > + > > > + *nbanks = 1; > > > + > > > + for (i = 0; i < npresent_cpus; i ++) { > > > + int s_id; > > > + int cache_size; > > > + > > > + if ((s_id = virHostCPUGetSocketId(arch, i)) < 0) > > > + goto error; > > > + > > > + /* Expand cache bank array */ > > > + if (s_id > (*nbanks - 1)) { > > > + size_t cur = *nbanks; > > > + size_t exp = s_id - (*nbanks) + 1; > > > + if (VIR_EXPAND_N(bank, cur, exp) < 0) > > > + goto error; > > > + *nbanks = s_id + 1; > > > + } > > > + > > > + if (bank[s_id].cpu_mask == NULL) { > > > + if (!(bank[s_id].cpu_mask = virBitmapNew(npresent_cpus))) > > > + goto error; > > > + } > > > + > > > + ignore_value(virBitmapSetBit(bank[s_id].cpu_mask, i)); > > > + > > > + if (bank[s_id].cache_size == 0) { > > > + if ((cache_size = virHostCPUGetCache(i, idx)) < 0) > > > + goto error; > > > + > > > + bank[s_id].cache_size = cache_size; > > > + bank[s_id].cache_min = cache_size / cbm_len; > > > + } > > > + } > > > + return bank; > > > + > > > + error: > > > + *nbanks = 0; > > > + VIR_FREE(bank); > > > + return NULL; > > > +} > > > diff --git a/src/util/virhostcpu.h b/src/util/virhostcpu.h > > > index 39f7cf8..27f208e 100644 > > > --- a/src/util/virhostcpu.h > > > +++ b/src/util/virhostcpu.h > > > @@ -27,6 +27,7 @@ > > > # include "internal.h" > > > # include "virarch.h" > > > # include "virbitmap.h" > > > +# include "virresctrl.h" > > > > > > # define VIR_HOST_CPU_MASK_LEN 1024 > > > > > > @@ -58,4 +59,9 @@ int virHostCPUStatsAssign(virNodeCPUStatsPtr param, > > > const char *name, > > > unsigned long long value); > > > > > > +virResCacheBankPtr virHostCPUGetCacheBanks(virArch arch, > > > + int type, > > > + size_t *nbanks, > > > + int cbm_len); > > > + > > > #endif /* __VIR_HOSTCPU_H__*/ > > > diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c > > > new file mode 100644 > > > index 0000000..44a47cc > > > --- /dev/null > > > +++ b/src/util/virresctrl.c > > > @@ -0,0 +1,201 @@ > > > +/* > > > + * virresctrl.c: methods for managing resource control > > > + * > > > + * This library is free software; you can redistribute it and/or > > > + * modify it under the terms of the GNU Lesser General Public > > > + * License as published by the Free Software Foundation; either > > > + * version 2.1 of the License, or (at your option) any later version. > > > + * > > > + * This library is distributed in the hope that it will be useful, > > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > > > + * Lesser General Public License for more details. > > > + * > > > + * You should have received a copy of the GNU Lesser General Public > > > + * License along with this library. If not, see > > > + * <http://www.gnu.org/licenses/>. > > > + * > > > + * Authors: > > > + * Eli Qiao <liyong.q...@intel.com (mailto:liyong.q...@intel.com)> > > > + */ > > > +#include <config.h> > > > + > > > +#include "virresctrl.h" > > > +#include "viralloc.h" > > > +#include "virerror.h" > > > +#include "virfile.h" > > > +#include "virhostcpu.h" > > > +#include "virlog.h" > > > +#include "virstring.h" > > > +#include "virarch.h" > > > + > > > +VIR_LOG_INIT("util.resctrl"); > > > + > > > +#define VIR_FROM_THIS VIR_FROM_RESCTRL > > > + > > > +#define RESCTRL_DIR "/sys/fs/resctrl" > > > +#define RESCTRL_INFO_DIR "/sys/fs/resctrl/info" > > > +#define SYSFS_SYSTEM_PATH "/sys/devices/system" > > > + > > > +#define MAX_CPU_SOCKET_NUM 8 > > > +#define MAX_CBM_BIT_LEN 32 > > > +#define MAX_SCHEMATA_LEN 1024 > > > +#define MAX_FILE_LEN (10 * 1024 * 1024) > > > + > > > +static unsigned int host_id; > > > + > > > +static virResCtrl resctrlall[] = { > > > + { > > > + .name = "L3", > > > + .cache_level = "l3", > > > + }, > > > + { > > > + .name = "L3DATA", > > > + .cache_level = "l3", > > > + }, > > > + { > > > + .name = "L3CODE", > > > + .cache_level = "l3", > > > + }, > > > + { > > > + .name = "L2", > > > + .cache_level = "l2", > > > + }, > > > +}; > > > + > > > +static int virResCtrlGetInfoStr(const int type, const char *item, char > > > **str) > > > +{ > > > + int ret = 0; > > > + char *tmp; > > > + char *path; > > > + > > > + if (virAsprintf(&path, "%s/%s/%s", RESCTRL_INFO_DIR, > > > resctrlall[type].name, item) < 0) > > > + return -1; > > > + if (virFileReadAll(path, 10, str) < 0) { > > > + ret = -1; > > > + goto cleanup; > > > + } > > > + > > > + if ((tmp = strchr(*str, '\n'))) *tmp = '\0'; > > > + > > > + cleanup: > > > + VIR_FREE(path); > > > + return ret; > > > +} > > > + > > > +static int virResCtrlReadConfig(virArch arch, int type) > > > +{ > > > + int ret; > > > + size_t i, nbanks; > > > + char *str; > > > + > > > + /* Read num_closids from resctrl. > > > + eg: /sys/fs/resctrl/info/L3/num_closids */ > > > + if ((ret = virResCtrlGetInfoStr(type, "num_closids", &str)) < 0) > > > + goto error; > > > + > > > + if ((ret = virStrToLong_i(str, NULL, 10, &resctrlall[type].num_closid)) > > > < 0) > > > + goto error; > > > + > > > + VIR_FREE(str); > > > + > > > + /* Read min_cbm_bits from resctrl. > > > + eg: /sys/fs/resctrl/info/L3/cbm_mask */ > > > + if ((ret = virResCtrlGetInfoStr(type, "min_cbm_bits", &str)) < 0) > > > + goto error; > > > + > > > + if ((ret = virStrToLong_i(str, NULL, 10, > > > &resctrlall[type].min_cbm_bits)) < 0) > > > + goto error; > > > + > > > + VIR_FREE(str); > > > + > > > + /* Read cbm_mask string from resctrl. > > > + eg: /sys/fs/resctrl/info/L3/cbm_mask */ > > > + if ((ret = virResCtrlGetInfoStr(type, "cbm_mask", &str)) < 0) > > > + goto error; > > > + > > > + /* cbm_mask is in hex, eg: "fffff", calculate cbm length from the > > > default > > > + cbm_mask. */ > > > + resctrlall[type].cbm_len = strlen(str) * 4; > > > + > > > + /* Get all cache bank informations */ > > > + resctrlall[type].cache_banks = virHostCPUGetCacheBanks(arch, > > > + type, > > > + &nbanks, resctrlall[type].cbm_len); > > > + > > > + if (resctrlall[type].cache_banks == NULL) > > > + goto error; > > > + > > > + resctrlall[type].num_banks = nbanks; > > > + > > > + for (i = 0; i < resctrlall[type].num_banks; i++) { > > > + /* L3CODE and L3DATA shares same L3 resource, so they should > > > + * have same host_id. */ > > > + if (type == VIR_RDT_RESOURCE_L3CODE) > > > + resctrlall[type].cache_banks[i].host_id = > > > resctrlall[VIR_RDT_RESOURCE_L3DATA].cache_banks[i].host_id; > > > + else > > > + resctrlall[type].cache_banks[i].host_id = host_id++; > > > + } > > > + > > > + resctrlall[type].enabled = true; > > > + > > > + ret = 0; > > > + > > > + error: > > > + VIR_FREE(str); > > > + return ret; > > > +} > > > + > > > +int > > > +virResCtrlInit(void) > > > +{ > > > + size_t i = 0; > > > + char *tmp; > > > + int rc = 0; > > > + > > > + virArch hostarch; > > > + > > > + hostarch = virArchFromHost(); > > > + > > > + for (i = 0; i < VIR_RDT_RESOURCE_LAST; i++) { > > > + if ((rc = virAsprintf(&tmp, "%s/%s", RESCTRL_INFO_DIR, > > > resctrlall[i].name)) < 0) { > > > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > > > + _("Failed to initialize resource control config")); > > > + goto cleanup; > > > + } > > > + > > > + if (virFileExists(tmp)) { > > > + if ((rc = virResCtrlReadConfig(hostarch, i)) < 0) { > > > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > > > + _("Failed to get resource control config")); > > > + goto cleanup; > > > + } > > > + } > > > + VIR_FREE(tmp); > > > + } > > > + > > > + cleanup: > > > + VIR_FREE(tmp); > > > + return rc; > > > +} > > > + > > > +/* > > > + * Test whether the host support resource control > > > + */ > > > +bool > > > +virResCtrlAvailable(void) > > > +{ > > > + if (!virFileExists(RESCTRL_INFO_DIR)) > > > + return false; > > > + return true; > > > +} > > > + > > > +/* > > > + * Return an virResCtrlPtr point to virResCtrl object, > > > + * We should not modify it out side of virresctrl.c > > > + */ > > > +virResCtrlPtr > > > +virResCtrlGet(int type) > > > +{ > > > + return &resctrlall[type]; > > > +} > > > diff --git a/src/util/virresctrl.h b/src/util/virresctrl.h > > > new file mode 100644 > > > index 0000000..5a6a344 > > > --- /dev/null > > > +++ b/src/util/virresctrl.h > > > @@ -0,0 +1,78 @@ > > > +/* > > > + * virresctrl.h: header for managing resctrl control > > > + * > > > + * Copyright (C) 2016 Intel, Inc. > > > + * > > > + * This library is free software; you can redistribute it and/or > > > + * modify it under the terms of the GNU Lesser General Public > > > + * License as published by the Free Software Foundation; either > > > + * version 2.1 of the License, or (at your option) any later version. > > > + * > > > + * This library is distributed in the hope that it will be useful, > > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > > > + * Lesser General Public License for more details. > > > + * > > > + * You should have received a copy of the GNU Lesser General Public > > > + * License along with this library. If not, see > > > + * <http://www.gnu.org/licenses/>. > > > + * > > > + * Authors: > > > + * Eli Qiao <liyong.q...@intel.com (mailto:liyong.q...@intel.com)> > > > + */ > > > + > > > +#ifndef __VIR_RESCTRL_H__ > > > +# define __VIR_RESCTRL_H__ > > > + > > > +# include "virbitmap.h" > > > + > > > +enum { > > > + VIR_RDT_RESOURCE_L3, > > > + VIR_RDT_RESOURCE_L3DATA, > > > + VIR_RDT_RESOURCE_L3CODE, > > > + VIR_RDT_RESOURCE_L2, > > > + /* Must be the last */ > > > + VIR_RDT_RESOURCE_LAST, > > > +}; > > > + > > > + > > > +typedef struct _virResCacheBank virResCacheBank; > > > +typedef virResCacheBank *virResCacheBankPtr; > > > +struct _virResCacheBank { > > > + unsigned int host_id; > > > + unsigned long long cache_size; > > > + unsigned long long cache_left; > > > + unsigned long long cache_min; > > > + virBitmapPtr cpu_mask; > > > +}; > > > + > > > +/** > > > + * struct rdt_resource - attributes of an RDT resource > > > + * @enabled: Is this feature enabled on this machine > > > + * @name: Name to use in "schemata" file > > > + * @num_closid: Number of CLOSIDs available > > > + * @max_cbm: Largest Cache Bit Mask allowed > > > + * @min_cbm_bits: Minimum number of consecutive bits to be set > > > + * in a cache bit mask > > > + * @cache_level: Which cache level defines scope of this domain > > > + * @num_banks: Number of cache bank on this machine. > > > + * @cache_banks: Array of cache bank > > > + */ > > > +typedef struct _virResCtrl virResCtrl; > > > +typedef virResCtrl *virResCtrlPtr; > > > +struct _virResCtrl { > > > + bool enabled; > > > + const char *name; > > > + int num_closid; > > > + int cbm_len; > > > + int min_cbm_bits; > > > + const char* cache_level; > > > + int num_banks; > > > + virResCacheBankPtr cache_banks; > > > +}; > > > + > > > +bool virResCtrlAvailable(void); > > > +int virResCtrlInit(void); > > > +virResCtrlPtr virResCtrlGet(int); > > > + > > > +#endif > > > -- > > > 1.9.1 > > > > > > -- > > > libvir-list mailing list > > > libvir-list@redhat.com (mailto:libvir-list@redhat.com) > > > https://www.redhat.com/mailman/listinfo/libvir-list > > > > > > > > > > > > >
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list