[libvirt] [PATCH 7/7] add cpu time to iothreadinfo

Ján Tomko jtomko at redhat.com
Wed Mar 25 18:39:12 UTC 2015


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




More information about the libvir-list mailing list