Re: [libvirt] [PATCHv8 16/17] qemu: Report cache occupancy (CMT) with domstats
> -Original Message- > From: Wang, Huaqiang > Sent: Thursday, November 15, 2018 8:41 PM > To: John Ferlan ; libvir-list@redhat.com > Cc: Feng, Shaohe ; Ding, Jian-feng feng.d...@intel.com>; Zang, Rui > Subject: RE: [PATCHv8 16/17] qemu: Report cache occupancy (CMT) with > domstats > > > > > -Original Message- > > From: John Ferlan [mailto:jfer...@redhat.com] > > Sent: Thursday, November 15, 2018 12:18 AM > > To: Wang, Huaqiang ; libvir-list@redhat.com > > Cc: Feng, Shaohe ; Ding, Jian-feng > feng.d...@intel.com>; Zang, Rui > > Subject: Re: [PATCHv8 16/17] qemu: Report cache occupancy (CMT) with > > domstats > > > > > > > > On 11/12/18 8:31 AM, Wang Huaqiang wrote: > > > Adding the interface in qemu to report CMT statistic information > > > through command 'virsh domstats --cpu-total'. > > > > > > Below is a typical output: > > > > > > # virsh domstats 1 --cpu-total > > > Domain: 'ubuntu16.04-base' > > >... > > >cpu.cache.monitor.count=2 > > >cpu.cache.monitor.0.name=vcpus_1 > > >cpu.cache.monitor.0.vcpus=1 > > >cpu.cache.monitor.0.bank.count=2 > > >cpu.cache.monitor.0.bank.0.id=0 > > >cpu.cache.monitor.0.bank.0.bytes=4505600 > > >cpu.cache.monitor.0.bank.1.id=1 > > >cpu.cache.monitor.0.bank.1.bytes=5586944 > > >cpu.cache.monitor.1.name=vcpus_4-6 > > >cpu.cache.monitor.1.vcpus=4,5,6 > > >cpu.cache.monitor.1.bank.count=2 > > >cpu.cache.monitor.1.bank.0.id=0 > > >cpu.cache.monitor.1.bank.0.bytes=17571840 > > >cpu.cache.monitor.1.bank.1.id=1 > > >cpu.cache.monitor.1.bank.1.bytes=29106176 > > > > > > Signed-off-by: Wang Huaqiang > > > --- > > > src/libvirt-domain.c | 9 +++ > > > src/qemu/qemu_driver.c | 198 > > > + > > > 2 files changed, 207 insertions(+) > > > > > > diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index > > > 7690339..4895f9f 100644 > > > --- a/src/libvirt-domain.c > > > +++ b/src/libvirt-domain.c > > > @@ -11345,6 +11345,15 @@ > > > virConnectGetDomainCapabilities(virConnectPtr > > conn, > > > * "cpu.user" - user cpu time spent in nanoseconds as unsigned long > long. > > > * "cpu.system" - system cpu time spent in nanoseconds as unsigned > long > > > *long. > > > + * "cpu.cache.monitor.count" - tocal cache monitoring groups > > > + * "cpu.cache.monitor.M.name" - name of cache monitoring group > 'M' > > > + * "cpu.cache.monitor.M.vcpus" - vcpus for cache monitoring group > 'M' > > > + * "cpu.cache.monitor.M.bank.count" - total bank number of cache > > monitoring > > > + *group 'M' > > > + * "cpu.cache.monitor.M.bank.N.id" - OS assigned cache bank id for > cache > > > + *'N' in cache monitoring group 'M' > > > + * "cpu.cache.monitor.M.bank.N.bytes" - monitor's cache occupancy > of > > cache > > > + *bank 'N' in cache monitoring group 'M' > > > > I'll comment on these in your update... > > > > > * > > > * VIR_DOMAIN_STATS_BALLOON: > > > * Return memory balloon device information. > > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index > > > 89d46ee..d41ae66 100644 > > > --- a/src/qemu/qemu_driver.c > > > +++ b/src/qemu/qemu_driver.c > > > @@ -19698,6 +19698,199 @@ typedef enum { #define > HAVE_JOB(flags) > > > ((flags) & QEMU_DOMAIN_STATS_HAVE_JOB) > > > > > > > > > +typedef struct _virQEMUCpuResMonitorData > virQEMUCpuResMonitorData; > > > +typedef virQEMUCpuResMonitorData > *virQEMUCpuResMonitorDataPtr; > > struct > > > +_virQEMUCpuResMonitorData{ > > > > Data { > > > > Got. One space before '{' > > > > +const char *name; > > > +char *vcpus; > > > +virResctrlMonitorType tag; > > > +virResctrlMonitorStatsPtr stats; > > > +size_t nstats; > > > +}; > > > + > > > + > > > +static int > > > +qemuDomainGetCpuResMonitorData(virDomainObjPtr dom, > > > + virQEMUCpuResMonitorDataPtr mondata) { > > > +virDomainResctrlDefPtr resctrl = NULL; > > > +size_t i = 0; > > > +size_t j = 0; > > > +size_t l = 0; > > > + > > > +for (i = 0; i < dom->def->nresctrls; i++) { > > > +resctrl = dom->def->resctrls[i]; > > > + > > > +for (j = 0; j < resctrl->nmonitors; j++) { > > > +virDomainResctrlMonDefPtr domresmon = NULL; > > > +virResctrlMonitorPtr monitor = > > > + resctrl->monitors[j]->instance; > > > + > > > +domresmon = resctrl->monitors[j]; > > > +mondata[l].tag = domresmon->tag; > > > > Why "l" (BTW: 'k' would be preferred because '1' and 'l' are very > > difficult to delineate). > > This 'l' and the occurrences in below will be substituted with 'k'. > > > > > > + > > > +/* If virBitmapFormat successfully returns an vcpu string,
Re: [libvirt] [PATCHv8 16/17] qemu: Report cache occupancy (CMT) with domstats
> -Original Message- > From: John Ferlan [mailto:jfer...@redhat.com] > Sent: Thursday, November 15, 2018 12:18 AM > To: Wang, Huaqiang ; libvir-list@redhat.com > Cc: Feng, Shaohe ; Ding, Jian-feng feng.d...@intel.com>; Zang, Rui > Subject: Re: [PATCHv8 16/17] qemu: Report cache occupancy (CMT) with > domstats > > > > On 11/12/18 8:31 AM, Wang Huaqiang wrote: > > Adding the interface in qemu to report CMT statistic information > > through command 'virsh domstats --cpu-total'. > > > > Below is a typical output: > > > > # virsh domstats 1 --cpu-total > > Domain: 'ubuntu16.04-base' > >... > >cpu.cache.monitor.count=2 > >cpu.cache.monitor.0.name=vcpus_1 > >cpu.cache.monitor.0.vcpus=1 > >cpu.cache.monitor.0.bank.count=2 > >cpu.cache.monitor.0.bank.0.id=0 > >cpu.cache.monitor.0.bank.0.bytes=4505600 > >cpu.cache.monitor.0.bank.1.id=1 > >cpu.cache.monitor.0.bank.1.bytes=5586944 > >cpu.cache.monitor.1.name=vcpus_4-6 > >cpu.cache.monitor.1.vcpus=4,5,6 > >cpu.cache.monitor.1.bank.count=2 > >cpu.cache.monitor.1.bank.0.id=0 > >cpu.cache.monitor.1.bank.0.bytes=17571840 > >cpu.cache.monitor.1.bank.1.id=1 > >cpu.cache.monitor.1.bank.1.bytes=29106176 > > > > Signed-off-by: Wang Huaqiang > > --- > > src/libvirt-domain.c | 9 +++ > > src/qemu/qemu_driver.c | 198 > > + > > 2 files changed, 207 insertions(+) > > > > diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index > > 7690339..4895f9f 100644 > > --- a/src/libvirt-domain.c > > +++ b/src/libvirt-domain.c > > @@ -11345,6 +11345,15 @@ virConnectGetDomainCapabilities(virConnectPtr > conn, > > * "cpu.user" - user cpu time spent in nanoseconds as unsigned long > > long. > > * "cpu.system" - system cpu time spent in nanoseconds as unsigned long > > *long. > > + * "cpu.cache.monitor.count" - tocal cache monitoring groups > > + * "cpu.cache.monitor.M.name" - name of cache monitoring group 'M' > > + * "cpu.cache.monitor.M.vcpus" - vcpus for cache monitoring group 'M' > > + * "cpu.cache.monitor.M.bank.count" - total bank number of cache > monitoring > > + *group 'M' > > + * "cpu.cache.monitor.M.bank.N.id" - OS assigned cache bank id for > > cache > > + *'N' in cache monitoring group 'M' > > + * "cpu.cache.monitor.M.bank.N.bytes" - monitor's cache occupancy of > cache > > + *bank 'N' in cache monitoring group 'M' > > I'll comment on these in your update... > > > * > > * VIR_DOMAIN_STATS_BALLOON: > > * Return memory balloon device information. > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index > > 89d46ee..d41ae66 100644 > > --- a/src/qemu/qemu_driver.c > > +++ b/src/qemu/qemu_driver.c > > @@ -19698,6 +19698,199 @@ typedef enum { #define HAVE_JOB(flags) > > ((flags) & QEMU_DOMAIN_STATS_HAVE_JOB) > > > > > > +typedef struct _virQEMUCpuResMonitorData virQEMUCpuResMonitorData; > > +typedef virQEMUCpuResMonitorData *virQEMUCpuResMonitorDataPtr; > struct > > +_virQEMUCpuResMonitorData{ > > Data { > Got. One space before '{' > > +const char *name; > > +char *vcpus; > > +virResctrlMonitorType tag; > > +virResctrlMonitorStatsPtr stats; > > +size_t nstats; > > +}; > > + > > + > > +static int > > +qemuDomainGetCpuResMonitorData(virDomainObjPtr dom, > > + virQEMUCpuResMonitorDataPtr mondata) { > > +virDomainResctrlDefPtr resctrl = NULL; > > +size_t i = 0; > > +size_t j = 0; > > +size_t l = 0; > > + > > +for (i = 0; i < dom->def->nresctrls; i++) { > > +resctrl = dom->def->resctrls[i]; > > + > > +for (j = 0; j < resctrl->nmonitors; j++) { > > +virDomainResctrlMonDefPtr domresmon = NULL; > > +virResctrlMonitorPtr monitor = > > + resctrl->monitors[j]->instance; > > + > > +domresmon = resctrl->monitors[j]; > > +mondata[l].tag = domresmon->tag; > > Why "l" (BTW: 'k' would be preferred because '1' and 'l' are very difficult to > delineate). This 'l' and the occurrences in below will be substituted with 'k'. > > > + > > +/* If virBitmapFormat successfully returns an vcpu string, then > > + * mondata[l].vcpus is assigned with an memory space holding > > it, > > + * let this newly allocated memory buffer to be freed along > > with > > + * the free of 'mondata' */ > > +if (!(mondata[l].vcpus = virBitmapFormat(domresmon->vcpus))) > > +return -1; > > + > > +if (!(mondata[l].name = virResctrlMonitorGetID(monitor))) { > > +virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > > + _("Could not get monitor ID"));
Re: [libvirt] [PATCHv8 16/17] qemu: Report cache occupancy (CMT) with domstats
On 11/12/18 8:31 AM, Wang Huaqiang wrote: > Adding the interface in qemu to report CMT statistic information > through command 'virsh domstats --cpu-total'. > > Below is a typical output: > > # virsh domstats 1 --cpu-total > Domain: 'ubuntu16.04-base' >... >cpu.cache.monitor.count=2 >cpu.cache.monitor.0.name=vcpus_1 >cpu.cache.monitor.0.vcpus=1 >cpu.cache.monitor.0.bank.count=2 >cpu.cache.monitor.0.bank.0.id=0 >cpu.cache.monitor.0.bank.0.bytes=4505600 >cpu.cache.monitor.0.bank.1.id=1 >cpu.cache.monitor.0.bank.1.bytes=5586944 >cpu.cache.monitor.1.name=vcpus_4-6 >cpu.cache.monitor.1.vcpus=4,5,6 >cpu.cache.monitor.1.bank.count=2 >cpu.cache.monitor.1.bank.0.id=0 >cpu.cache.monitor.1.bank.0.bytes=17571840 >cpu.cache.monitor.1.bank.1.id=1 >cpu.cache.monitor.1.bank.1.bytes=29106176 > > Signed-off-by: Wang Huaqiang > --- > src/libvirt-domain.c | 9 +++ > src/qemu/qemu_driver.c | 198 > + > 2 files changed, 207 insertions(+) > > diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c > index 7690339..4895f9f 100644 > --- a/src/libvirt-domain.c > +++ b/src/libvirt-domain.c > @@ -11345,6 +11345,15 @@ virConnectGetDomainCapabilities(virConnectPtr conn, > * "cpu.user" - user cpu time spent in nanoseconds as unsigned long long. > * "cpu.system" - system cpu time spent in nanoseconds as unsigned long > *long. > + * "cpu.cache.monitor.count" - tocal cache monitoring groups > + * "cpu.cache.monitor.M.name" - name of cache monitoring group 'M' > + * "cpu.cache.monitor.M.vcpus" - vcpus for cache monitoring group 'M' > + * "cpu.cache.monitor.M.bank.count" - total bank number of cache > monitoring > + *group 'M' > + * "cpu.cache.monitor.M.bank.N.id" - OS assigned cache bank id for cache > + *'N' in cache monitoring group 'M' > + * "cpu.cache.monitor.M.bank.N.bytes" - monitor's cache occupancy of > cache > + *bank 'N' in cache monitoring group 'M' I'll comment on these in your update... > * > * VIR_DOMAIN_STATS_BALLOON: > * Return memory balloon device information. > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index 89d46ee..d41ae66 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -19698,6 +19698,199 @@ typedef enum { > #define HAVE_JOB(flags) ((flags) & QEMU_DOMAIN_STATS_HAVE_JOB) > > > +typedef struct _virQEMUCpuResMonitorData virQEMUCpuResMonitorData; > +typedef virQEMUCpuResMonitorData *virQEMUCpuResMonitorDataPtr; > +struct _virQEMUCpuResMonitorData{ Data { > +const char *name; > +char *vcpus; > +virResctrlMonitorType tag; > +virResctrlMonitorStatsPtr stats; > +size_t nstats; > +}; > + > + > +static int > +qemuDomainGetCpuResMonitorData(virDomainObjPtr dom, > + virQEMUCpuResMonitorDataPtr mondata) > +{ > +virDomainResctrlDefPtr resctrl = NULL; > +size_t i = 0; > +size_t j = 0; > +size_t l = 0; > + > +for (i = 0; i < dom->def->nresctrls; i++) { > +resctrl = dom->def->resctrls[i]; > + > +for (j = 0; j < resctrl->nmonitors; j++) { > +virDomainResctrlMonDefPtr domresmon = NULL; > +virResctrlMonitorPtr monitor = resctrl->monitors[j]->instance; > + > +domresmon = resctrl->monitors[j]; > +mondata[l].tag = domresmon->tag; Why "l" (BTW: 'k' would be preferred because '1' and 'l' are very difficult to delineate). > + > +/* If virBitmapFormat successfully returns an vcpu string, then > + * mondata[l].vcpus is assigned with an memory space holding it, > + * let this newly allocated memory buffer to be freed along with > + * the free of 'mondata' */ > +if (!(mondata[l].vcpus = virBitmapFormat(domresmon->vcpus))) > +return -1; > + > +if (!(mondata[l].name = virResctrlMonitorGetID(monitor))) { > +virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("Could not get monitor ID")); > +return -1; > +} > + > +if (domresmon->tag == VIR_RESCTRL_MONITOR_TYPE_CACHE) { Something doesn't quite add up with this... Since we're only filling in types with 'cache' types and erroring out otherwise ... see [1] data points below... > +if (virResctrlMonitorGetCacheOccupancy(monitor, > + &mondata[l].stats, > + &mondata[l].nstats) < > 0) > +return -1; > +} else { > +virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > +
Re: [libvirt] [PATCHv8 16/17] qemu: Report cache occupancy (CMT) with domstats
> -Original Message- > From: John Ferlan [mailto:jfer...@redhat.com] > Sent: Wednesday, November 14, 2018 7:57 AM > To: Wang, Huaqiang ; libvir-list@redhat.com > Cc: Feng, Shaohe ; Ding, Jian-feng feng.d...@intel.com>; Zang, Rui > Subject: Re: [PATCHv8 16/17] qemu: Report cache occupancy (CMT) with > domstats > > > > On 11/12/18 8:31 AM, Wang Huaqiang wrote: > > Adding the interface in qemu to report CMT statistic information > > through command 'virsh domstats --cpu-total'. > > I believe virsh.pod needs an update to list this type of data in the domstats > -- > cpu-total output. Thanks for mentioning, I haven't realized virsh.pod need a fix. I will send out a standalone patch for patch16 and adding this fix soon. > > In any case, I need to drop off for the evening - I'll pick this up in the > morning. > You can send an update to this patch and I can merge it in. > > The first 15 patches look good with some minor adjustments... > > John > Thanks for your review and all your hard work. Huaqiang > > > > Below is a typical output: > > > > # virsh domstats 1 --cpu-total > > Domain: 'ubuntu16.04-base' > >... > >cpu.cache.monitor.count=2 > >cpu.cache.monitor.0.name=vcpus_1 > >cpu.cache.monitor.0.vcpus=1 > >cpu.cache.monitor.0.bank.count=2 > >cpu.cache.monitor.0.bank.0.id=0 > >cpu.cache.monitor.0.bank.0.bytes=4505600 > >cpu.cache.monitor.0.bank.1.id=1 > >cpu.cache.monitor.0.bank.1.bytes=5586944 > >cpu.cache.monitor.1.name=vcpus_4-6 > >cpu.cache.monitor.1.vcpus=4,5,6 > >cpu.cache.monitor.1.bank.count=2 > >cpu.cache.monitor.1.bank.0.id=0 > >cpu.cache.monitor.1.bank.0.bytes=17571840 > >cpu.cache.monitor.1.bank.1.id=1 > >cpu.cache.monitor.1.bank.1.bytes=29106176 > > > > Signed-off-by: Wang Huaqiang > > --- > > src/libvirt-domain.c | 9 +++ > > src/qemu/qemu_driver.c | 198 > > + > > 2 files changed, 207 insertions(+) > > > > diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index > > 7690339..4895f9f 100644 > > --- a/src/libvirt-domain.c > > +++ b/src/libvirt-domain.c > > @@ -11345,6 +11345,15 @@ virConnectGetDomainCapabilities(virConnectPtr > conn, > > * "cpu.user" - user cpu time spent in nanoseconds as unsigned long > > long. > > * "cpu.system" - system cpu time spent in nanoseconds as unsigned long > > *long. > > + * "cpu.cache.monitor.count" - tocal cache monitoring groups > > + * "cpu.cache.monitor.M.name" - name of cache monitoring group 'M' > > + * "cpu.cache.monitor.M.vcpus" - vcpus for cache monitoring group 'M' > > + * "cpu.cache.monitor.M.bank.count" - total bank number of cache > monitoring > > + *group 'M' > > + * "cpu.cache.monitor.M.bank.N.id" - OS assigned cache bank id for > > cache > > + *'N' in cache monitoring group 'M' > > + * "cpu.cache.monitor.M.bank.N.bytes" - monitor's cache occupancy of > cache > > + *bank 'N' in cache monitoring group 'M' > > * > > * VIR_DOMAIN_STATS_BALLOON: > > * Return memory balloon device information. > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index > > 89d46ee..d41ae66 100644 > > --- a/src/qemu/qemu_driver.c > > +++ b/src/qemu/qemu_driver.c > > @@ -19698,6 +19698,199 @@ typedef enum { #define HAVE_JOB(flags) > > ((flags) & QEMU_DOMAIN_STATS_HAVE_JOB) > > > > > > +typedef struct _virQEMUCpuResMonitorData virQEMUCpuResMonitorData; > > +typedef virQEMUCpuResMonitorData *virQEMUCpuResMonitorDataPtr; > struct > > +_virQEMUCpuResMonitorData{ > > Data { > > > +const char *name; > > +char *vcpus; > > +virResctrlMonitorType tag; > > +virResctrlMonitorStatsPtr stats; > > +size_t nstats; > > +}; > > + > > + > > +static int > > +qemuDomainGetCpuResMonitorData(virDomainObjPtr dom, > > + virQEMUCpuResMonitorDataPtr mondata) { > > +virDomainResctrlDefPtr resctrl = NULL; > > +size_t i = 0; > > +size_t j = 0; > > +size_t l = 0; > > + > > +for (i = 0; i < dom->def->nresctrls; i++) { > > +resctrl = dom->def->resctrls[i]; > > + > > +for (j = 0; j < resctrl->nmonitors; j++) { > > +virDomainResctrlMonDefPtr domresmon = NULL; > > +virResctrlMonitorPtr monitor = > > + resctrl->monitors[j]->instance; > > + > > +domresmon = resctrl->monitors[j]; > > +mondata[l].tag = domresmon->tag; > > + > > +/* If virBitmapFormat successfully returns an vcpu string, then > > + * mondata[l].vcpus is assigned with an memory space holding > > it, > > + * let this newly allocated memory buffer to be freed along > > with > > + * the free of 'mondata' */ > > +if (!(mondata[l]
Re: [libvirt] [PATCHv8 16/17] qemu: Report cache occupancy (CMT) with domstats
On 11/12/18 8:31 AM, Wang Huaqiang wrote: > Adding the interface in qemu to report CMT statistic information > through command 'virsh domstats --cpu-total'. I believe virsh.pod needs an update to list this type of data in the domstats --cpu-total output. In any case, I need to drop off for the evening - I'll pick this up in the morning. You can send an update to this patch and I can merge it in. The first 15 patches look good with some minor adjustments... John > > Below is a typical output: > > # virsh domstats 1 --cpu-total > Domain: 'ubuntu16.04-base' >... >cpu.cache.monitor.count=2 >cpu.cache.monitor.0.name=vcpus_1 >cpu.cache.monitor.0.vcpus=1 >cpu.cache.monitor.0.bank.count=2 >cpu.cache.monitor.0.bank.0.id=0 >cpu.cache.monitor.0.bank.0.bytes=4505600 >cpu.cache.monitor.0.bank.1.id=1 >cpu.cache.monitor.0.bank.1.bytes=5586944 >cpu.cache.monitor.1.name=vcpus_4-6 >cpu.cache.monitor.1.vcpus=4,5,6 >cpu.cache.monitor.1.bank.count=2 >cpu.cache.monitor.1.bank.0.id=0 >cpu.cache.monitor.1.bank.0.bytes=17571840 >cpu.cache.monitor.1.bank.1.id=1 >cpu.cache.monitor.1.bank.1.bytes=29106176 > > Signed-off-by: Wang Huaqiang > --- > src/libvirt-domain.c | 9 +++ > src/qemu/qemu_driver.c | 198 > + > 2 files changed, 207 insertions(+) > > diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c > index 7690339..4895f9f 100644 > --- a/src/libvirt-domain.c > +++ b/src/libvirt-domain.c > @@ -11345,6 +11345,15 @@ virConnectGetDomainCapabilities(virConnectPtr conn, > * "cpu.user" - user cpu time spent in nanoseconds as unsigned long long. > * "cpu.system" - system cpu time spent in nanoseconds as unsigned long > *long. > + * "cpu.cache.monitor.count" - tocal cache monitoring groups > + * "cpu.cache.monitor.M.name" - name of cache monitoring group 'M' > + * "cpu.cache.monitor.M.vcpus" - vcpus for cache monitoring group 'M' > + * "cpu.cache.monitor.M.bank.count" - total bank number of cache > monitoring > + *group 'M' > + * "cpu.cache.monitor.M.bank.N.id" - OS assigned cache bank id for cache > + *'N' in cache monitoring group 'M' > + * "cpu.cache.monitor.M.bank.N.bytes" - monitor's cache occupancy of > cache > + *bank 'N' in cache monitoring group 'M' > * > * VIR_DOMAIN_STATS_BALLOON: > * Return memory balloon device information. > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index 89d46ee..d41ae66 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -19698,6 +19698,199 @@ typedef enum { > #define HAVE_JOB(flags) ((flags) & QEMU_DOMAIN_STATS_HAVE_JOB) > > > +typedef struct _virQEMUCpuResMonitorData virQEMUCpuResMonitorData; > +typedef virQEMUCpuResMonitorData *virQEMUCpuResMonitorDataPtr; > +struct _virQEMUCpuResMonitorData{ Data { > +const char *name; > +char *vcpus; > +virResctrlMonitorType tag; > +virResctrlMonitorStatsPtr stats; > +size_t nstats; > +}; > + > + > +static int > +qemuDomainGetCpuResMonitorData(virDomainObjPtr dom, > + virQEMUCpuResMonitorDataPtr mondata) > +{ > +virDomainResctrlDefPtr resctrl = NULL; > +size_t i = 0; > +size_t j = 0; > +size_t l = 0; > + > +for (i = 0; i < dom->def->nresctrls; i++) { > +resctrl = dom->def->resctrls[i]; > + > +for (j = 0; j < resctrl->nmonitors; j++) { > +virDomainResctrlMonDefPtr domresmon = NULL; > +virResctrlMonitorPtr monitor = resctrl->monitors[j]->instance; > + > +domresmon = resctrl->monitors[j]; > +mondata[l].tag = domresmon->tag; > + > +/* If virBitmapFormat successfully returns an vcpu string, then > + * mondata[l].vcpus is assigned with an memory space holding it, > + * let this newly allocated memory buffer to be freed along with > + * the free of 'mondata' */ > +if (!(mondata[l].vcpus = virBitmapFormat(domresmon->vcpus))) > +return -1; > + > +if (!(mondata[l].name = virResctrlMonitorGetID(monitor))) { > +virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("Could not get monitor ID")); > +return -1; > +} > + > +if (domresmon->tag == VIR_RESCTRL_MONITOR_TYPE_CACHE) { > +if (virResctrlMonitorGetCacheOccupancy(monitor, > + &mondata[l].stats, > + &mondata[l].nstats) < > 0) > +return -1; > +} else { > +virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > +
[libvirt] [PATCHv8 16/17] qemu: Report cache occupancy (CMT) with domstats
Adding the interface in qemu to report CMT statistic information through command 'virsh domstats --cpu-total'. Below is a typical output: # virsh domstats 1 --cpu-total Domain: 'ubuntu16.04-base' ... cpu.cache.monitor.count=2 cpu.cache.monitor.0.name=vcpus_1 cpu.cache.monitor.0.vcpus=1 cpu.cache.monitor.0.bank.count=2 cpu.cache.monitor.0.bank.0.id=0 cpu.cache.monitor.0.bank.0.bytes=4505600 cpu.cache.monitor.0.bank.1.id=1 cpu.cache.monitor.0.bank.1.bytes=5586944 cpu.cache.monitor.1.name=vcpus_4-6 cpu.cache.monitor.1.vcpus=4,5,6 cpu.cache.monitor.1.bank.count=2 cpu.cache.monitor.1.bank.0.id=0 cpu.cache.monitor.1.bank.0.bytes=17571840 cpu.cache.monitor.1.bank.1.id=1 cpu.cache.monitor.1.bank.1.bytes=29106176 Signed-off-by: Wang Huaqiang --- src/libvirt-domain.c | 9 +++ src/qemu/qemu_driver.c | 198 + 2 files changed, 207 insertions(+) diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 7690339..4895f9f 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -11345,6 +11345,15 @@ virConnectGetDomainCapabilities(virConnectPtr conn, * "cpu.user" - user cpu time spent in nanoseconds as unsigned long long. * "cpu.system" - system cpu time spent in nanoseconds as unsigned long *long. + * "cpu.cache.monitor.count" - tocal cache monitoring groups + * "cpu.cache.monitor.M.name" - name of cache monitoring group 'M' + * "cpu.cache.monitor.M.vcpus" - vcpus for cache monitoring group 'M' + * "cpu.cache.monitor.M.bank.count" - total bank number of cache monitoring + *group 'M' + * "cpu.cache.monitor.M.bank.N.id" - OS assigned cache bank id for cache + *'N' in cache monitoring group 'M' + * "cpu.cache.monitor.M.bank.N.bytes" - monitor's cache occupancy of cache + *bank 'N' in cache monitoring group 'M' * * VIR_DOMAIN_STATS_BALLOON: * Return memory balloon device information. diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 89d46ee..d41ae66 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -19698,6 +19698,199 @@ typedef enum { #define HAVE_JOB(flags) ((flags) & QEMU_DOMAIN_STATS_HAVE_JOB) +typedef struct _virQEMUCpuResMonitorData virQEMUCpuResMonitorData; +typedef virQEMUCpuResMonitorData *virQEMUCpuResMonitorDataPtr; +struct _virQEMUCpuResMonitorData{ +const char *name; +char *vcpus; +virResctrlMonitorType tag; +virResctrlMonitorStatsPtr stats; +size_t nstats; +}; + + +static int +qemuDomainGetCpuResMonitorData(virDomainObjPtr dom, + virQEMUCpuResMonitorDataPtr mondata) +{ +virDomainResctrlDefPtr resctrl = NULL; +size_t i = 0; +size_t j = 0; +size_t l = 0; + +for (i = 0; i < dom->def->nresctrls; i++) { +resctrl = dom->def->resctrls[i]; + +for (j = 0; j < resctrl->nmonitors; j++) { +virDomainResctrlMonDefPtr domresmon = NULL; +virResctrlMonitorPtr monitor = resctrl->monitors[j]->instance; + +domresmon = resctrl->monitors[j]; +mondata[l].tag = domresmon->tag; + +/* If virBitmapFormat successfully returns an vcpu string, then + * mondata[l].vcpus is assigned with an memory space holding it, + * let this newly allocated memory buffer to be freed along with + * the free of 'mondata' */ +if (!(mondata[l].vcpus = virBitmapFormat(domresmon->vcpus))) +return -1; + +if (!(mondata[l].name = virResctrlMonitorGetID(monitor))) { +virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Could not get monitor ID")); +return -1; +} + +if (domresmon->tag == VIR_RESCTRL_MONITOR_TYPE_CACHE) { +if (virResctrlMonitorGetCacheOccupancy(monitor, + &mondata[l].stats, + &mondata[l].nstats) < 0) +return -1; +} else { +virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Invalid CPU resource type")); +return -1; +} + +l++; +} +} + +return 0; +} + + +static int +qemuDomainGetStatsCpuResMonitorPerTag(virQEMUCpuResMonitorDataPtr mondata, + size_t nmondata, + virResctrlMonitorType tag, + virDomainStatsRecordPtr record, + int *maxparams) +{ +char param_name[VIR_TYPED_PARAM_FIELD_LENGTH]; +unsigned int nmonitors = 0; +const