]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Check for and return IOThread polling values if available
authorJohn Ferlan <jferlan@redhat.com>
Wed, 3 Oct 2018 11:38:34 +0000 (07:38 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Mon, 19 Nov 2018 12:26:40 +0000 (07:26 -0500)
If there are IOThread polling values in the query-iothreads return
buffer, then fill them in and set a bool indicating their presence.
This will allow for displaying in a domain stats output eventually.

Note that the QEMU values are managed a bit differently (as int's
stored in int64_t's) than we will manage them (as unsigned long and
int values). This is intentional to allow for value validation
checking when it comes time to provide the values to QEMU.

Signed-off-by: John Ferlan <jferlan@redhat.com>
ACKed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c

index 48b142a4f4cc47c8ca4d36780fb883b4de95b80f..c2991e2b161f0f7cafe4cd07efe20423834446a0 100644 (file)
@@ -1116,6 +1116,10 @@ typedef qemuMonitorIOThreadInfo *qemuMonitorIOThreadInfoPtr;
 struct _qemuMonitorIOThreadInfo {
     unsigned int iothread_id;
     int thread_id;
+    bool poll_valid;
+    unsigned long long poll_max_ns;
+    unsigned int poll_grow;
+    unsigned int poll_shrink;
 };
 int qemuMonitorGetIOThreads(qemuMonitorPtr mon,
                             qemuMonitorIOThreadInfoPtr **iothreads);
index 3de298c9e25cfa45b9084c63ae63d90d87c4c38a..2e92984b4496d7ea17309db5d4e86f62e2812be8 100644 (file)
@@ -7441,6 +7441,21 @@ qemuMonitorJSONGetIOThreads(qemuMonitorPtr mon,
                              "'thread-id' data"));
             goto cleanup;
         }
+
+        /* Fetch poll values (since QEMU 2.9 ) if available. QEMU
+         * stores these values as int64_t's; however, the qapi type
+         * is an int. The qapi/misc.json also mis-describes the grow
+         * and shrink values as pure add/remove values. The source
+         * util/aio-posix.c function aio_poll uses them as a factor
+         * or divisor in it's calculation. We will fetch and store
+         * them as defined in our structures. */
+        if (virJSONValueObjectGetNumberUlong(child, "poll-max-ns",
+                                             &info->poll_max_ns) == 0 &&
+            virJSONValueObjectGetNumberUint(child, "poll-grow",
+                                            &info->poll_grow) == 0 &&
+            virJSONValueObjectGetNumberUint(child, "poll-shrink",
+                                            &info->poll_shrink) == 0)
+            info->poll_valid = true;
     }
 
     ret = n;