Add cpuTime to virDomainIOThreadInfo, fill it out in the qemu driver and print it in virsh. --- daemon/remote.c | 1 + include/libvirt/libvirt-domain.h | 1 + src/qemu/qemu_driver.c | 10 ++++++++++ src/remote/remote_driver.c | 1 + src/remote/remote_protocol.x | 1 + src/remote_protocol-structs | 1 + tools/virsh-domain.c | 18 ++++++++++++++---- 7 files changed, 29 insertions(+), 4 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 2f4df48..1f44ed5 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -2317,6 +2317,7 @@ remoteDispatchDomainGetIOThreadInfo(virNetServerPtr server ATTRIBUTE_UNUSED, */ dst->cpumap.cpumap_len = info[i]->cpumaplen; dst->cpumap.cpumap_val = (char *)info[i]->cpumap; + dst->cpu_time = info[i]->cpuTime; info[i]->cpumap = NULL; } } else { diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h index 7be4219..cca08ca 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -1603,6 +1603,7 @@ struct _virDomainIOThreadInfo { unsigned char *cpumap; /* CPU map for thread. A pointer to an */ /* array of real CPUs (in 8-bit bytes) */ int cpumaplen; /* cpumap size */ + unsigned long long cpuTime; /* CPU time used, in nanoseconds */ }; void virDomainIOThreadInfoFree(virDomainIOThreadInfoPtr info); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index bef1223..51f59cb 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5776,6 +5776,16 @@ qemuDomainGetIOThreadsLive(virQEMUDriverPtr driver, goto endjob; } virBitmapFree(map); + + if (qemuGetProcessInfo(&(info_ret[i]->cpuTime), + NULL, + NULL, + vm->pid, + iothreads[i]->thread_id) < 0) { + virReportSystemError(errno, "%s", + _("cannot get IO thread cpu time")); + goto endjob; + } } *info = info_ret; diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 8bd54e6..9182c33 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -2372,6 +2372,7 @@ remoteDomainGetIOThreadInfo(virDomainPtr dom, memcpy(info_ret[i]->cpumap, src->cpumap.cpumap_val, src->cpumap.cpumap_len); info_ret[i]->cpumaplen = src->cpumap.cpumap_len; + info_ret[i]->cpuTime = src->cpu_time; } *info = info_ret; info_ret = NULL; diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index d90e6b5..b1ddf48 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -1193,6 +1193,7 @@ struct remote_domain_get_max_vcpus_ret { struct remote_domain_iothread_info { unsigned int iothread_id; opaque cpumap<REMOTE_CPUMAP_MAX>; + unsigned hyper cpu_time; }; struct remote_domain_get_iothread_info_args { diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index e614f77..5645d8c 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -813,6 +813,7 @@ struct remote_domain_iothread_info { u_int cpumap_len; char * cpumap_val; } cpumap; + uint64_t cpu_time; }; struct remote_domain_get_iothread_info_args { remote_nonnull_domain dom; diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index cb9cb9d..929cceb 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -6860,8 +6860,8 @@ cmdIOThreadInfo(vshControl *ctl, const vshCmd *cmd) goto cleanup; } - vshPrintExtra(ctl, " %-15s %-15s\n", - _("IOThread ID"), _("CPU Affinity")); + vshPrintExtra(ctl, " %-15s %-15s %-15s\n", + _("IOThread ID"), _("CPU Affinity"), _("CPU time")); vshPrintExtra(ctl, "---------------------------------------------------\n"); for (i = 0; i < niothreads; i++) { char *mapstr = NULL; @@ -6875,12 +6875,22 @@ cmdIOThreadInfo(vshControl *ctl, const vshCmd *cmd) vshPrint(ctl, " %-15u ", info[i]->iothread_id); vshPrint(ctl, " %-15s ", mapstr); + if (info[i]->cpuTime != 0) { + double cpuUsed = info[i]->cpuTime; + + cpuUsed /= 1000000000.0; + + vshPrint(ctl, " %.1lf s ", cpuUsed); + } vshPrint(ctl, "\n"); - virDomainIOThreadInfoFree(info[i]); } - VIR_FREE(info); cleanup: + if (niothreads > 0) { + for (i = 0; i < niothreads; i++) + virDomainIOThreadInfoFree(info[i]); + VIR_FREE(info); + } virBitmapFree(map); virDomainFree(dom); return niothreads >= 0; -- 2.0.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list