Re: [libvirt] [PATCH v2] qemu: Add entry for balloon stats stat-htlb-pgalloc and stat-htlb-pgfail
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
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 coul
[libvirt] [PATCH v2] test_driver: implement virDomainGetDiskErrors
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(&vm); +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