9119d9
From 248157defba2872ca75f3055d518e956daa33697 Mon Sep 17 00:00:00 2001
9119d9
Message-Id: <248157defba2872ca75f3055d518e956daa33697@dist-git>
9119d9
From: Eric Blake <eblake@redhat.com>
9119d9
Date: Wed, 17 Dec 2014 03:09:08 -0700
9119d9
Subject: [PATCH] getstats: split block stats reporting for easier recursion
9119d9
9119d9
https://bugzilla.redhat.com/show_bug.cgi?id=1041569
9119d9
9119d9
In order to report stats on backing chains, we need to separate
9119d9
the output of stats for one block from how we traverse blocks.
9119d9
9119d9
* src/qemu/qemu_driver.c (qemuDomainGetStatsBlock): Split...
9119d9
(qemuDomainGetStatsOneBlock): ...into new helper.
9119d9
9119d9
Signed-off-by: Eric Blake <eblake@redhat.com>
9119d9
(cherry picked from commit c2d380bff8f1bad8e6df047c34ab1a4f8f623e3e)
9119d9
9119d9
Conflicts:
9119d9
	src/qemu/qemu_driver.c - no offline stats (commit 596a137)
9119d9
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
9119d9
---
9119d9
 src/qemu/qemu_driver.c | 107 +++++++++++++++++++++++++++++++------------------
9119d9
 1 file changed, 67 insertions(+), 40 deletions(-)
9119d9
9119d9
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
9119d9
index 6be180e..a2535f4 100644
9119d9
--- a/src/qemu/qemu_driver.c
9119d9
+++ b/src/qemu/qemu_driver.c
9119d9
@@ -18007,6 +18007,69 @@ do { \
9119d9
         goto cleanup; \
9119d9
 } while (0)
9119d9
 
9119d9
+
9119d9
+static int
9119d9
+qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
9119d9
+                           virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED,
9119d9
+                           virDomainObjPtr dom ATTRIBUTE_UNUSED,
9119d9
+                           virDomainStatsRecordPtr record,
9119d9
+                           int *maxparams,
9119d9
+                           virDomainDiskDefPtr disk,
9119d9
+                           virStorageSourcePtr src,
9119d9
+                           size_t block_idx,
9119d9
+                           bool abbreviated,
9119d9
+                           virHashTablePtr stats)
9119d9
+{
9119d9
+    qemuBlockStats *entry;
9119d9
+    int ret = -1;
9119d9
+
9119d9
+    QEMU_ADD_NAME_PARAM(record, maxparams, "block", "name", block_idx,
9119d9
+                        disk->dst);
9119d9
+    if (virStorageSourceIsLocalStorage(src) && src->path)
9119d9
+        QEMU_ADD_NAME_PARAM(record, maxparams, "block", "path",
9119d9
+                            block_idx, src->path);
9119d9
+
9119d9
+    if (abbreviated || !disk->info.alias ||
9119d9
+        !(entry = virHashLookup(stats, disk->info.alias))) {
9119d9
+        /* FIXME: we could still look up sizing by sharing code
9119d9
+         * with qemuDomainGetBlockInfo */
9119d9
+        ret = 0;
9119d9
+        goto cleanup;
9119d9
+    }
9119d9
+
9119d9
+    QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
9119d9
+                            "rd.reqs", entry->rd_req);
9119d9
+    QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
9119d9
+                            "rd.bytes", entry->rd_bytes);
9119d9
+    QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
9119d9
+                            "rd.times", entry->rd_total_times);
9119d9
+    QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
9119d9
+                            "wr.reqs", entry->wr_req);
9119d9
+    QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
9119d9
+                            "wr.bytes", entry->wr_bytes);
9119d9
+    QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
9119d9
+                            "wr.times", entry->wr_total_times);
9119d9
+    QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
9119d9
+                            "fl.reqs", entry->flush_req);
9119d9
+    QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, block_idx,
9119d9
+                            "fl.times", entry->flush_total_times);
9119d9
+
9119d9
+    QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, block_idx,
9119d9
+                             "allocation", entry->wr_highest_offset);
9119d9
+
9119d9
+    if (entry->capacity)
9119d9
+        QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, block_idx,
9119d9
+                                 "capacity", entry->capacity);
9119d9
+    if (entry->physical)
9119d9
+        QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, block_idx,
9119d9
+                                 "physical", entry->physical);
9119d9
+
9119d9
+    ret = 0;
9119d9
+ cleanup:
9119d9
+    return ret;
9119d9
+}
9119d9
+
9119d9
+
9119d9
 static int
9119d9
 qemuDomainGetStatsBlock(virQEMUDriverPtr driver,
9119d9
                         virDomainObjPtr dom,
9119d9
@@ -18044,48 +18107,12 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver,
9119d9
     QEMU_ADD_COUNT_PARAM(record, maxparams, "block", 0);
9119d9
 
9119d9
     for (i = 0; i < dom->def->ndisks; i++) {
9119d9
-        qemuBlockStats *entry;
9119d9
         virDomainDiskDefPtr disk = dom->def->disks[i];
9119d9
 
9119d9
-        QEMU_ADD_NAME_PARAM(record, maxparams, "block", "name", i, disk->dst);
9119d9
-        if (virStorageSourceIsLocalStorage(disk->src) && disk->src->path)
9119d9
-            QEMU_ADD_NAME_PARAM(record, maxparams, "block", "path",
9119d9
-                                i, disk->src->path);
9119d9
-
9119d9
-        if (abbreviated || !disk->info.alias ||
9119d9
-            !(entry = virHashLookup(stats, disk->info.alias))) {
9119d9
-            /* FIXME: we could still look up sizing by sharing code
9119d9
-             * with qemuDomainGetBlockInfo */
9119d9
-            continue;
9119d9
-        }
9119d9
-
9119d9
-        QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, i,
9119d9
-                                "rd.reqs", entry->rd_req);
9119d9
-        QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, i,
9119d9
-                                "rd.bytes", entry->rd_bytes);
9119d9
-        QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, i,
9119d9
-                                "rd.times", entry->rd_total_times);
9119d9
-        QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, i,
9119d9
-                                "wr.reqs", entry->wr_req);
9119d9
-        QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, i,
9119d9
-                                "wr.bytes", entry->wr_bytes);
9119d9
-        QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, i,
9119d9
-                                "wr.times", entry->wr_total_times);
9119d9
-        QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, i,
9119d9
-                                "fl.reqs", entry->flush_req);
9119d9
-        QEMU_ADD_BLOCK_PARAM_LL(record, maxparams, i,
9119d9
-                                "fl.times", entry->flush_total_times);
9119d9
-
9119d9
-        QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, i,
9119d9
-                                 "allocation", entry->wr_highest_offset);
9119d9
-
9119d9
-        if (entry->capacity)
9119d9
-            QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, i,
9119d9
-                                     "capacity", entry->capacity);
9119d9
-        if (entry->physical)
9119d9
-            QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, i,
9119d9
-                                     "physical", entry->physical);
9119d9
-
9119d9
+        if (qemuDomainGetStatsOneBlock(driver, NULL, dom, record, maxparams,
9119d9
+                                       disk, disk->src, i, abbreviated,
9119d9
+                                       stats) < 0)
9119d9
+            goto cleanup;
9119d9
     }
9119d9
 
9119d9
     record->params[count_index].value.ui = i;
9119d9
-- 
9119d9
2.2.0
9119d9