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

2015-03-26 Thread Peter Krempa
On Wed, Mar 25, 2015 at 19:39:12 +0100, Ján Tomko wrote:
 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 */

Perhaps add a note that 0 is returned for offline VMs?

  };
  
  void virDomainIOThreadInfoFree(virDomainIOThreadInfoPtr 
 info);

...

 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

...

 @@ -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 /= 10.0;
 +
 +vshPrint(ctl,  %.1lf s , cpuUsed);
 +}

Should we print a dash or something when the data is not present?


  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);

If you initialize info to NULL when it's defined you can avoid having
the if (niothreads  0) condition.

 +}
  virBitmapFree(map);
  virDomainFree(dom);
  return niothreads = 0;

ACK. I'll not insisting on fixing all the comments, but I'd prefer to
have a dash in the output if CPU time doesn't make sense.

Peter


signature.asc
Description: Digital signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

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

2015-03-25 Thread Ján Tomko
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 cpumapREMOTE_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 /= 10.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

--