Re: [libvirt] [PATCH v2] qemu: Add entry for balloon stats stat-htlb-pgalloc and stat-htlb-pgfail

2019-05-12 Thread Han Han
ping

On Sun, Apr 28, 2019 at 5:18 PM Han Han  wrote:

> Qemu added reporting of virtio balloon new statistics stat-htlb-pgalloc and
> stat-htlb-pgfail since qemu-3.0 commit b7b12644297. The value of
> stat-htlb-pgalloc represents the number of successful hugetlb page
> allocations
> while stat-htlb-pgfail represents the number of failed ones. Add this
> statistics reporting to libvirt.
>
> To enable this feature for vm, guest kenel >= 4.17 is required because
> the exporting hugetlb page allocation for virtio balloon is introduced
> since 6c64fe7f.
>
> Signed-off-by: Han Han 
> ---
>  include/libvirt/libvirt-domain.h | 14 +-
>  src/libvirt-domain.c |  5 -
>  src/qemu/qemu_driver.c   |  2 ++
>  src/qemu/qemu_monitor_json.c |  5 +
>  tools/virsh-domain-monitor.c |  4 
>  tools/virsh.pod  |  2 ++
>  6 files changed, 30 insertions(+), 2 deletions(-)
>
> diff --git a/include/libvirt/libvirt-domain.h
> b/include/libvirt/libvirt-domain.h
> index 7d36820b5a..192d25c1db 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -636,11 +636,23 @@ typedef enum {
>   */
>  VIR_DOMAIN_MEMORY_STAT_DISK_CACHES = 10,
>
> +/*
> + * The amount of successful hugetlb(Huge Page Tables) allocations via
> + * virtio balloon.
> + */
> +VIR_DOMAIN_MEMORY_STAT_HUGETLB_PGALLOC= 11,
> +
> +/*
> + * The amount of failed hugetlb(Huge Page Tables) allocations via
> + * virtio balloon.
> + */
> +VIR_DOMAIN_MEMORY_STAT_HUGETLB_PGFAIL= 12,
> +
>  /*
>   * The number of statistics supported by this version of the
> interface.
>   * To add new statistics, add them to the enum and increase this
> value.
>   */
> -VIR_DOMAIN_MEMORY_STAT_NR  = 11,
> +VIR_DOMAIN_MEMORY_STAT_NR  = 13,
>
>  # ifdef VIR_ENUM_SENTINELS
>  VIR_DOMAIN_MEMORY_STAT_LAST = VIR_DOMAIN_MEMORY_STAT_NR
> diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
> index 80284a99f0..a95690e8a4 100644
> --- a/src/libvirt-domain.c
> +++ b/src/libvirt-domain.c
> @@ -5734,7 +5734,10 @@ virDomainGetInterfaceParameters(virDomainPtr domain,
>   * VIR_DOMAIN_MEMORY_STAT_DISK_CACHES
>   * Memory that can be reclaimed without additional I/O, typically disk
>   * caches (in kb).
> - *
> + * VIR_DOMAIN_MEMORY_STAT_HUGETLB_PGALLOC
> + * The amount of successful hugetlb(Huge Page Tables) allocations
> + * VIR_DOMAIN_MEMORY_STAT_HUGETLB_PGFAIL
> + * The amount of failed hugetlb(Huge Page Tables) allocations
>   * Returns: The number of stats provided or -1 in case of failure.
>   */
>  int
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index f48d9256e4..2d849beac8 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -20245,6 +20245,8 @@ qemuDomainGetStatsBalloon(virQEMUDriverPtr driver,
>  STORE_MEM_RECORD(LAST_UPDATE, "last-update")
>  STORE_MEM_RECORD(USABLE, "usable")
>  STORE_MEM_RECORD(DISK_CACHES, "disk_caches")
> +STORE_MEM_RECORD(HUGETLB_PGALLOC, "hugetlb_pgalloc")
> +STORE_MEM_RECORD(HUGETLB_PGFAIL, "hugetlb_pgfail")
>  }
>
>  #undef STORE_MEM_RECORD
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index 908967f46c..5e3df5e759 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -2150,6 +2150,11 @@ int qemuMonitorJSONGetMemoryStats(qemuMonitorPtr
> mon,
>VIR_DOMAIN_MEMORY_STAT_LAST_UPDATE, 1);
>  GET_BALLOON_STATS(statsdata, "stat-disk-caches",
>VIR_DOMAIN_MEMORY_STAT_DISK_CACHES, 1024);
> +GET_BALLOON_STATS(statsdata, "stat-htlb-pgalloc",
> +  VIR_DOMAIN_MEMORY_STAT_HUGETLB_PGALLOC, 1);
> +GET_BALLOON_STATS(statsdata, "stat-htlb-pgfail",
> +  VIR_DOMAIN_MEMORY_STAT_HUGETLB_PGFAIL, 1);
> +
>  ret = got;
>   cleanup:
>  virJSONValueFree(cmd);
> diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
> index d87475f6f6..0092a9786e 100644
> --- a/tools/virsh-domain-monitor.c
> +++ b/tools/virsh-domain-monitor.c
> @@ -376,6 +376,10 @@ cmdDomMemStat(vshControl *ctl, const vshCmd *cmd)
>  vshPrint(ctl, "last_update %llu\n", stats[i].val);
>  if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_DISK_CACHES)
>  vshPrint(ctl, "disk_caches %llu\n", stats[i].val);
> +if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_HUGETLB_PGALLOC)
> +vshPrint(ctl, "hugetlb_pgalloc %llu\n", stats[i].val);
> +if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_HUGETLB_PGFAIL)
> +vshPrint(ctl, "hugetlb_pgfail %llu\n", stats[i].val);
>  }
>
>  ret = true;
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index afc1684db0..ef27c527d6 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -938,6 +938,8 @@ without causing host swapping (in KiB)
>last-update

Re: [PATCH v2 1/2] vfio/mdev: add version attribute for mdev device

2019-05-12 Thread Yan Zhao
On Fri, May 10, 2019 at 05:48:38PM +0800, Cornelia Huck wrote:
> On Fri, 10 May 2019 10:36:09 +0100
> "Dr. David Alan Gilbert"  wrote:
> 
> > * Cornelia Huck (coh...@redhat.com) wrote:
> > > On Thu, 9 May 2019 17:48:26 +0100
> > > "Dr. David Alan Gilbert"  wrote:
> > >   
> > > > * Cornelia Huck (coh...@redhat.com) wrote:  
> > > > > On Thu, 9 May 2019 16:48:57 +0100
> > > > > "Dr. David Alan Gilbert"  wrote:
> > > > > 
> > > > > > * Cornelia Huck (coh...@redhat.com) wrote:
> > > > > > > On Tue, 7 May 2019 15:18:26 -0600
> > > > > > > Alex Williamson  wrote:
> > > > > > >   
> > > > > > > > On Sun,  5 May 2019 21:49:04 -0400
> > > > > > > > Yan Zhao  wrote:  
> > > > > > >   
> > > > > > > > > +  Errno:
> > > > > > > > > +  If vendor driver wants to claim a mdev device incompatible 
> > > > > > > > > to all other mdev
> > > > > > > > > +  devices, it should not register version attribute for this 
> > > > > > > > > mdev device. But if
> > > > > > > > > +  a vendor driver has already registered version attribute 
> > > > > > > > > and it wants to claim
> > > > > > > > > +  a mdev device incompatible to all other mdev devices, it 
> > > > > > > > > needs to return
> > > > > > > > > +  -ENODEV on access to this mdev device's version attribute.
> > > > > > > > > +  If a mdev device is only incompatible to certain mdev 
> > > > > > > > > devices, write of
> > > > > > > > > +  incompatible mdev devices's version strings to its version 
> > > > > > > > > attribute should
> > > > > > > > > +  return -EINVAL;
> > > > > > > > 
> > > > > > > > I think it's best not to define the specific errno returned for 
> > > > > > > > a
> > > > > > > > specific situation, let the vendor driver decide, userspace 
> > > > > > > > simply
> > > > > > > > needs to know that an errno on read indicates the device does 
> > > > > > > > not
> > > > > > > > support migration version comparison and that an errno on write
> > > > > > > > indicates the devices are incompatible or the target doesn't 
> > > > > > > > support
> > > > > > > > migration versions.  
> > > > > > > 
> > > > > > > I think I have to disagree here: It's probably valuable to have an
> > > > > > > agreed error for 'cannot migrate at all' vs 'cannot migrate 
> > > > > > > between
> > > > > > > those two particular devices'. Userspace might want to do 
> > > > > > > different
> > > > > > > things (e.g. trying with different device pairs).  
> > > > > > 
> > > > > > Trying to stuff these things down an errno seems a bad idea; we 
> > > > > > can't
> > > > > > get much information that way.
> > > > > 
> > > > > So, what would be a reasonable approach? Userspace should first read
> > > > > the version attributes on both devices (to find out whether migration
> > > > > is supported at all), and only then figure out via writing whether 
> > > > > they
> > > > > are compatible?
> > > > > 
> > > > > (Or just go ahead and try, if it does not care about the reason.)
> > > > 
> > > > Well, I'm OK with something like writing to test whether it's
> > > > compatible, it's just we need a better way of saying 'no'.
> > > > I'm not sure if that involves reading back from somewhere after
> > > > the write or what.  
> > > 
> > > Hm, so I basically see two ways of doing that:
> > > - standardize on some error codes... problem: error codes can be hard
> > >   to fit to reasons
> > > - make the error available in some attribute that can be read
> > > 
> > > I'm not sure how we can serialize the readback with the last write,
> > > though (this looks inherently racy).
> > > 
> > > How important is detailed error reporting here?  
> > 
> > I think we need something, otherwise we're just going to get vague
> > user reports of 'but my VM doesn't migrate'; I'd like the error to be
> > good enough to point most users to something they can understand
> > (e.g. wrong card family/too old a driver etc).
> 
> Ok, that sounds like a reasonable point. Not that I have a better idea
> how to achieve that, though... we could also log a more verbose error
> message to the kernel log, but that's not necessarily where a user will
> look first.
> 
> Ideally, we'd want to have the user space program setting up things
> querying the general compatibility for migration (so that it becomes
> their problem on how to alert the user to problems :), but I'm not sure
> how to eliminate the race between asking the vendor driver for
> compatibility and getting the result of that operation.
> 
> Unless we introduce an interface that can retrieve _all_ results
> together with the written value? Or is that not going to be much of a
> problem in practice?
what about defining a migration_errors attribute, storing recent 10 error
records with format like:
input string: error
as identical input strings always have the same error string, the 10 error
records may meet 10+ reason querying operations. And in practice, I think there
wouldn't be 10 simultaneous migration requests?

or 

[libvirt] [PATCH v2] test_driver: implement virDomainGetDiskErrors

2019-05-12 Thread Ilias Stamatis
Return the number of disks present in the configuration of the test
domain when called with @errors as NULL and @maxerrors as 0.

Otherwise report an error for every second disk, assigning available
error codes in a cyclic order.

Signed-off-by: Ilias Stamatis 
---
 src/test/test_driver.c | 42 ++
 1 file changed, 42 insertions(+)

diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index a06d1fc402..527c2f5d3b 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -3046,6 +3046,47 @@ static int testDomainSetAutostart(virDomainPtr domain,
 return 0;
 }

+static int testDomainGetDiskErrors(virDomainPtr dom,
+   virDomainDiskErrorPtr errors,
+   unsigned int maxerrors,
+   unsigned int flags)
+{
+virDomainObjPtr vm = NULL;
+int ret = -1;
+size_t i;
+int n = 0;
+int codes[] = {VIR_DOMAIN_DISK_ERROR_UNSPEC, 
VIR_DOMAIN_DISK_ERROR_NO_SPACE};
+size_t ncodes = sizeof(codes) / sizeof(codes[0]);
+
+virCheckFlags(0, -1);
+
+if (!(vm = testDomObjFromDomain(dom)))
+goto cleanup;
+
+if (virDomainObjCheckActive(vm) < 0)
+goto cleanup;
+
+if (!errors) {
+ret = vm->def->ndisks;
+} else {
+for (i = 1; i < vm->def->ndisks && n < maxerrors; i += 2) {
+if (VIR_STRDUP(errors[n].disk, vm->def->disks[i]->dst) < 0)
+goto cleanup;
+errors[n].error = codes[n % ncodes];
+n++;
+}
+ret = n;
+}
+
+ cleanup:
+virDomainObjEndAPI();
+if (ret < 0) {
+for (i = 0; i < n; i++)
+VIR_FREE(errors[i].disk);
+}
+return ret;
+}
+
 static char *testDomainGetSchedulerType(virDomainPtr domain ATTRIBUTE_UNUSED,
 int *nparams)
 {
@@ -6832,6 +6873,7 @@ static virHypervisorDriver testHypervisorDriver = {
 .domainUndefineFlags = testDomainUndefineFlags, /* 0.9.4 */
 .domainGetAutostart = testDomainGetAutostart, /* 0.3.2 */
 .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */
+.domainGetDiskErrors = testDomainGetDiskErrors, /* 5.4.0 */
 .domainGetSchedulerType = testDomainGetSchedulerType, /* 0.3.2 */
 .domainGetSchedulerParameters = testDomainGetSchedulerParameters, /* 0.3.2 
*/
 .domainGetSchedulerParametersFlags = 
testDomainGetSchedulerParametersFlags, /* 0.9.2 */
--
2.21.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list