[PATCH] qemu_monitor_json: Implement logic for setting iothread.thread-pool-{min, max}

Michal Privoznik posted 1 patch 1 year, 10 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/e3a61bc19b43a4c61a8e0de439d6912324c00280.1656593281.git.mprivozn@redhat.com
src/qemu/qemu_monitor_json.c | 29 +++++++++++++++++++++++++++--
1 file changed, 27 insertions(+), 2 deletions(-)
[PATCH] qemu_monitor_json: Implement logic for setting iothread.thread-pool-{min, max}
Posted by Michal Privoznik 1 year, 10 months ago
When virDomainSetIOThreadParams() API is called, well its QEMU
impl: qemuDomainSetIOThreadParams() then typed params are parsed
by qemuDomainIOThreadParseParams() into this
qemuMonitorIOThreadInfo struct. In the struct we have a <int,
bool> pair for every IOThread attribute we can tune through
monitor. The struct is then passed to
qemuMonitorJSONSetIOThread() which looks at the bool and if set
then the corresponding attribute is set to given value. Each
attribute is thus changed in a separate call. While this works
for attributes independent of each other ("poll-max-ns",
"poll-grow", "poll-shrink"), it does not always work for the
other attributes ("thread-pool-min" and "thread-pool-max").

The limitation here is that the lower boundary (minimum) has to
be lower (or equal to) the upper boundary (maximum) at all times.

This means, that in some cases we might need to set attributes in
reversed order to meet the constraint.

Resolves: https://gitlab.com/libvirt/libvirt/-/issues/339
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
 src/qemu/qemu_monitor_json.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 3aad2ab212..80696de731 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -7428,6 +7428,7 @@ qemuMonitorJSONSetIOThread(qemuMonitor *mon,
 {
     g_autofree char *path = NULL;
     qemuMonitorJSONObjectProperty prop;
+    bool setMaxFirst = false;
 
     path = g_strdup_printf("/objects/iothread%u", iothreadInfo->iothread_id);
 
@@ -7443,8 +7444,32 @@ qemuMonitorJSONSetIOThread(qemuMonitor *mon,
     VIR_IOTHREAD_SET_PROP("poll-max-ns", poll_max_ns);
     VIR_IOTHREAD_SET_PROP("poll-grow", poll_grow);
     VIR_IOTHREAD_SET_PROP("poll-shrink", poll_shrink);
-    VIR_IOTHREAD_SET_PROP("thread-pool-min", thread_pool_min);
-    VIR_IOTHREAD_SET_PROP("thread-pool-max", thread_pool_max);
+
+    if (iothreadInfo->set_thread_pool_min &&
+        iothreadInfo->set_thread_pool_max) {
+        int curr_max = -1;
+
+        /* By default, the minimum is set first, followed by the maximum. But
+         * if the current maximum is below the minimum we want to set we need
+         * to set the maximum first. Otherwise would get an error because we
+         * would be attempting to shift minimum above maximum. */
+        prop.type = QEMU_MONITOR_OBJECT_PROPERTY_INT;
+        if (qemuMonitorJSONGetObjectProperty(mon, path,
+                                             "thread-pool-max", &prop) < 0)
+            return -1;
+        curr_max = prop.val.iv;
+
+        if (curr_max < iothreadInfo->thread_pool_min)
+            setMaxFirst = true;
+    }
+
+    if (setMaxFirst) {
+        VIR_IOTHREAD_SET_PROP("thread-pool-max", thread_pool_max);
+        VIR_IOTHREAD_SET_PROP("thread-pool-min", thread_pool_min);
+    } else {
+        VIR_IOTHREAD_SET_PROP("thread-pool-min", thread_pool_min);
+        VIR_IOTHREAD_SET_PROP("thread-pool-max", thread_pool_max);
+    }
 
 #undef VIR_IOTHREAD_SET_PROP
 
-- 
2.35.1
Re: [PATCH] qemu_monitor_json: Implement logic for setting iothread.thread-pool-{min, max}
Posted by Martin Kletzander 1 year, 9 months ago
On Thu, Jun 30, 2022 at 02:48:01PM +0200, Michal Privoznik wrote:
>When virDomainSetIOThreadParams() API is called, well its QEMU
>impl: qemuDomainSetIOThreadParams() then typed params are parsed
>by qemuDomainIOThreadParseParams() into this
>qemuMonitorIOThreadInfo struct. In the struct we have a <int,
>bool> pair for every IOThread attribute we can tune through
>monitor. The struct is then passed to
>qemuMonitorJSONSetIOThread() which looks at the bool and if set
>then the corresponding attribute is set to given value. Each
>attribute is thus changed in a separate call. While this works
>for attributes independent of each other ("poll-max-ns",
>"poll-grow", "poll-shrink"), it does not always work for the
>other attributes ("thread-pool-min" and "thread-pool-max").
>
>The limitation here is that the lower boundary (minimum) has to
>be lower (or equal to) the upper boundary (maximum) at all times.
>
>This means, that in some cases we might need to set attributes in
>reversed order to meet the constraint.
>
>Resolves: https://gitlab.com/libvirt/libvirt/-/issues/339
>Signed-off-by: Michal Privoznik <mprivozn@redhat.com>

Reviewed-by: Martin Kletzander <mkletzan@redhat.com>