[libvirt PATCH 12/13] ch_process: Setup emulator and iothread settings

Vineeth Pillai posted 13 patches 4 years, 3 months ago
There is a newer version of this series
[libvirt PATCH 12/13] ch_process: Setup emulator and iothread settings
Posted by Vineeth Pillai 4 years, 3 months ago
From: Praveen K Paladugu <prapal@linux.microsoft.com>

using virCHProcessSetupPid

Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
Signed-off-by: Vineeth Pillai <viremana@linux.microsoft.com>
---
 src/ch/ch_monitor.c | 60 ++++++++++++++++++++++++++++++++++
 src/ch/ch_monitor.h |  2 ++
 src/ch/ch_process.c | 78 +++++++++++++++++++++++++++++++++++++++++++--
 3 files changed, 138 insertions(+), 2 deletions(-)

diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c
index 095779cb3f..924d510a2f 100644
--- a/src/ch/ch_monitor.c
+++ b/src/ch/ch_monitor.c
@@ -920,3 +920,63 @@ virCHMonitorResumeVM(virCHMonitor *mon)
 {
     return virCHMonitorPutNoContent(mon, URL_VM_RESUME);
 }
+
+/**
+ * virCHMonitorGetIOThreads:
+ * @mon: Pointer to the monitor
+ * @iothreads: Location to return array of IOThreadInfo data
+ *
+ * Retrieve the list of iothreads defined/running for the machine
+ *
+ * Returns count of IOThreadInfo structures on success
+ *        -1 on error.
+ */
+int virCHMonitorGetIOThreads(virCHMonitor *mon,
+                            virDomainIOThreadInfo ***iothreads)
+{
+    size_t nthreads = 0, niothreads = 0;
+    int thd_index;
+    virDomainIOThreadInfo **iothreadinfolist = NULL, *iothreadinfo = NULL;
+
+    *iothreads = NULL;
+    nthreads = virCHMonitorRefreshThreadInfo(mon);
+
+    iothreadinfolist = g_new0(virDomainIOThreadInfo*, nthreads);
+
+    for (thd_index = 0; thd_index < nthreads; thd_index++) {
+        virBitmap *map = NULL;
+        if (mon->threads[thd_index].type == virCHThreadTypeIO) {
+            iothreadinfo = g_new0(virDomainIOThreadInfo, 1);
+
+            iothreadinfo->iothread_id = mon->threads[thd_index].ioInfo.tid;
+
+            if (!(map = virProcessGetAffinity(iothreadinfo->iothread_id)))
+                goto cleanup;
+
+            if (virBitmapToData(map, &(iothreadinfo->cpumap),
+                            &(iothreadinfo->cpumaplen)) < 0) {
+                virBitmapFree(map);
+                goto cleanup;
+            }
+            virBitmapFree(map);
+            //Append to iothreadinfolist
+            iothreadinfolist[niothreads] = iothreadinfo;
+            niothreads++;
+        }
+    }
+    VIR_DELETE_ELEMENT_INPLACE(iothreadinfolist,
+                                       niothreads, nthreads);
+    *iothreads = iothreadinfolist;
+    VIR_DEBUG("niothreads = %ld", niothreads);
+    return niothreads;
+
+    cleanup:
+        if (iothreadinfolist) {
+            for (thd_index = 0; thd_index < niothreads; thd_index++)
+                VIR_FREE(iothreadinfolist[thd_index]);
+            VIR_FREE(iothreadinfolist);
+        }
+        if (iothreadinfo)
+            VIR_FREE(iothreadinfo);
+        return -1;
+}
diff --git a/src/ch/ch_monitor.h b/src/ch/ch_monitor.h
index f8c3fa75e8..98edb0faf9 100644
--- a/src/ch/ch_monitor.h
+++ b/src/ch/ch_monitor.h
@@ -118,3 +118,5 @@ int virCHMonitorGetCPUInfo(virCHMonitor *mon,
                        size_t maxvcpus);
 size_t virCHMonitorGetThreadInfo(virCHMonitor *mon, bool refresh,
                                  virCHMonitorThreadInfo **threads);
+int virCHMonitorGetIOThreads(virCHMonitor *mon,
+                            virDomainIOThreadInfo ***iothreads);
diff --git a/src/ch/ch_process.c b/src/ch/ch_process.c
index 8dce737adb..25c2910f9c 100644
--- a/src/ch/ch_process.c
+++ b/src/ch/ch_process.c
@@ -41,7 +41,6 @@ VIR_LOG_INIT("ch.ch_process");
 #define START_VM_POSTFIX ": starting up vm\n"
 
 
-
 static virCHMonitor *
 virCHProcessConnectMonitor(virCHDriver *driver,
                            virDomainObj *vm)
@@ -131,7 +130,6 @@ virCHProcessUpdateInfo(virDomainObj *vm)
     virCHProcessUpdateConsole(vm, info);
 
     virJSONValueFree(info);
-
     return 0;
 }
 
@@ -313,6 +311,74 @@ virCHProcessSetupPid(virDomainObj *vm,
     return ret;
 }
 
+static int
+virCHProcessSetupIOThread(virDomainObj *vm,
+                         virDomainIOThreadInfo *iothread)
+{
+    virCHDomainObjPrivate *priv = vm->privateData;
+    return virCHProcessSetupPid(vm, iothread->iothread_id,
+                               VIR_CGROUP_THREAD_IOTHREAD,
+                               iothread->iothread_id,
+                               priv->autoCpuset, // This should be updated when CLH supports accepting
+                                     // iothread settings from input domain definition
+                               vm->def->cputune.iothread_period,
+                               vm->def->cputune.iothread_quota,
+                               NULL); // CLH doesn't allow choosing a scheduler for iothreads.
+}
+
+static int
+virCHProcessSetupIOThreads(virDomainObj *vm)
+{
+    virCHDomainObjPrivate *priv = vm->privateData;
+    virDomainIOThreadInfo **iothreads = NULL;
+    size_t i;
+    size_t  niothreads;
+
+    niothreads = virCHMonitorGetIOThreads(priv->monitor, &iothreads);
+    for (i = 0; i < niothreads; i++) {
+        VIR_DEBUG("IOThread index = %ld , tid = %d", i, iothreads[i]->iothread_id);
+        if (virCHProcessSetupIOThread(vm, iothreads[i]) < 0)
+            return -1;
+    }
+    return 0;
+}
+
+
+static int
+virCHProcessSetupEmulatorThread(virDomainObj *vm,
+                         virCHMonitorEmuThreadInfo emuthread)
+{
+    return virCHProcessSetupPid(vm, emuthread.tid, VIR_CGROUP_THREAD_EMULATOR,
+                               0, vm->def->cputune.emulatorpin,
+                               vm->def->cputune.emulator_period,
+                               vm->def->cputune.emulator_quota,
+                               vm->def->cputune.emulatorsched);
+}
+
+static int
+virCHProcessSetupEmulatorThreads(virDomainObj *vm)
+{
+    int thd_index = 0;
+    virCHDomainObjPrivate *priv = vm->privateData;
+    /*
+    Cloud-hypervisor start 4 Emulator threads by default:
+    vmm
+    cloud-hypervisor
+    http-server
+    signal_handler
+    */
+    for (thd_index = 0; thd_index < priv->monitor->nthreads; thd_index++) {
+        if (priv->monitor->threads[thd_index].type == virCHThreadTypeEmulator) {
+            VIR_DEBUG("Setup tid = %d (%s) Emulator thread", priv->monitor->threads[thd_index].emuInfo.tid,
+                priv->monitor->threads[thd_index].emuInfo.thrName);
+
+            if (virCHProcessSetupEmulatorThread(vm, priv->monitor->threads[thd_index].emuInfo) < 0)
+                return -1;
+        }
+    }
+    return 0;
+}
+
 /**
  * virCHProcessSetupVcpu:
  * @vm: domain object
@@ -439,6 +505,14 @@ int virCHProcessStart(virCHDriver *driver,
 
     virCHDomainRefreshThreadInfo(vm);
 
+    VIR_DEBUG("Setting emulator tuning/settings");
+    if (virCHProcessSetupEmulatorThreads(vm) < 0)
+        goto cleanup;
+
+    VIR_DEBUG("Setting iothread tuning/settings");
+    if (virCHProcessSetupIOThreads(vm) < 0)
+        goto cleanup;
+
     VIR_DEBUG("Setting global CPU cgroup (if required)");
     if (chSetupGlobalCpuCgroup(vm) < 0)
         goto cleanup;
-- 
2.27.0


Re: [libvirt PATCH 12/13] ch_process: Setup emulator and iothread settings
Posted by Daniel Henrique Barboza 4 years, 2 months ago

On 10/21/21 16:31, Vineeth Pillai wrote:
> From: Praveen K Paladugu <prapal@linux.microsoft.com>
> 
> using virCHProcessSetupPid
> 
> Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
> Signed-off-by: Vineeth Pillai <viremana@linux.microsoft.com>
> ---
>   src/ch/ch_monitor.c | 60 ++++++++++++++++++++++++++++++++++
>   src/ch/ch_monitor.h |  2 ++
>   src/ch/ch_process.c | 78 +++++++++++++++++++++++++++++++++++++++++++--
>   3 files changed, 138 insertions(+), 2 deletions(-)
> 
> diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c
> index 095779cb3f..924d510a2f 100644
> --- a/src/ch/ch_monitor.c
> +++ b/src/ch/ch_monitor.c
> @@ -920,3 +920,63 @@ virCHMonitorResumeVM(virCHMonitor *mon)
>   {
>       return virCHMonitorPutNoContent(mon, URL_VM_RESUME);
>   }
> +
> +/**
> + * virCHMonitorGetIOThreads:
> + * @mon: Pointer to the monitor
> + * @iothreads: Location to return array of IOThreadInfo data
> + *
> + * Retrieve the list of iothreads defined/running for the machine
> + *
> + * Returns count of IOThreadInfo structures on success
> + *        -1 on error.
> + */
> +int virCHMonitorGetIOThreads(virCHMonitor *mon,
> +                            virDomainIOThreadInfo ***iothreads)
> +{
> +    size_t nthreads = 0, niothreads = 0;
> +    int thd_index;
> +    virDomainIOThreadInfo **iothreadinfolist = NULL, *iothreadinfo = NULL;
> +
> +    *iothreads = NULL;
> +    nthreads = virCHMonitorRefreshThreadInfo(mon);
> +
> +    iothreadinfolist = g_new0(virDomainIOThreadInfo*, nthreads);
> +
> +    for (thd_index = 0; thd_index < nthreads; thd_index++) {
> +        virBitmap *map = NULL;
> +        if (mon->threads[thd_index].type == virCHThreadTypeIO) {
> +            iothreadinfo = g_new0(virDomainIOThreadInfo, 1);
> +
> +            iothreadinfo->iothread_id = mon->threads[thd_index].ioInfo.tid;
> +
> +            if (!(map = virProcessGetAffinity(iothreadinfo->iothread_id)))
> +                goto cleanup;
> +
> +            if (virBitmapToData(map, &(iothreadinfo->cpumap),
> +                            &(iothreadinfo->cpumaplen)) < 0) {
> +                virBitmapFree(map);
> +                goto cleanup;
> +            }
> +            virBitmapFree(map);
> +            //Append to iothreadinfolist
> +            iothreadinfolist[niothreads] = iothreadinfo;
> +            niothreads++;
> +        }
> +    }
> +    VIR_DELETE_ELEMENT_INPLACE(iothreadinfolist,
> +                                       niothreads, nthreads);
> +    *iothreads = iothreadinfolist;
> +    VIR_DEBUG("niothreads = %ld", niothreads);
> +    return niothreads;
> +
> +    cleanup:
> +        if (iothreadinfolist) {
> +            for (thd_index = 0; thd_index < niothreads; thd_index++)
> +                VIR_FREE(iothreadinfolist[thd_index]);
> +            VIR_FREE(iothreadinfolist);
> +        }
> +        if (iothreadinfo)
> +            VIR_FREE(iothreadinfo);
> +        return -1;
> +}
> diff --git a/src/ch/ch_monitor.h b/src/ch/ch_monitor.h
> index f8c3fa75e8..98edb0faf9 100644
> --- a/src/ch/ch_monitor.h
> +++ b/src/ch/ch_monitor.h
> @@ -118,3 +118,5 @@ int virCHMonitorGetCPUInfo(virCHMonitor *mon,
>                          size_t maxvcpus);
>   size_t virCHMonitorGetThreadInfo(virCHMonitor *mon, bool refresh,
>                                    virCHMonitorThreadInfo **threads);
> +int virCHMonitorGetIOThreads(virCHMonitor *mon,
> +                            virDomainIOThreadInfo ***iothreads);
> diff --git a/src/ch/ch_process.c b/src/ch/ch_process.c
> index 8dce737adb..25c2910f9c 100644
> --- a/src/ch/ch_process.c
> +++ b/src/ch/ch_process.c
> @@ -41,7 +41,6 @@ VIR_LOG_INIT("ch.ch_process");
>   #define START_VM_POSTFIX ": starting up vm\n"
>   
>   
> -
>   static virCHMonitor *
>   virCHProcessConnectMonitor(virCHDriver *driver,
>                              virDomainObj *vm)
> @@ -131,7 +130,6 @@ virCHProcessUpdateInfo(virDomainObj *vm)
>       virCHProcessUpdateConsole(vm, info);
>   
>       virJSONValueFree(info);
> -
>       return 0;
>   }
>   
> @@ -313,6 +311,74 @@ virCHProcessSetupPid(virDomainObj *vm,
>       return ret;
>   }
>   
> +static int
> +virCHProcessSetupIOThread(virDomainObj *vm,
> +                         virDomainIOThreadInfo *iothread)
> +{
> +    virCHDomainObjPrivate *priv = vm->privateData;
> +    return virCHProcessSetupPid(vm, iothread->iothread_id,
> +                               VIR_CGROUP_THREAD_IOTHREAD,
> +                               iothread->iothread_id,
> +                               priv->autoCpuset, // This should be updated when CLH supports accepting
> +                                     // iothread settings from input domain definition
> +                               vm->def->cputune.iothread_period,
> +                               vm->def->cputune.iothread_quota,
> +                               NULL); // CLH doesn't allow choosing a scheduler for iothreads.
> +}
> +
> +static int
> +virCHProcessSetupIOThreads(virDomainObj *vm)
> +{
> +    virCHDomainObjPrivate *priv = vm->privateData;
> +    virDomainIOThreadInfo **iothreads = NULL;
> +    size_t i;
> +    size_t  niothreads;
> +
> +    niothreads = virCHMonitorGetIOThreads(priv->monitor, &iothreads);
> +    for (i = 0; i < niothreads; i++) {
> +        VIR_DEBUG("IOThread index = %ld , tid = %d", i, iothreads[i]->iothread_id);
> +        if (virCHProcessSetupIOThread(vm, iothreads[i]) < 0)
> +            return -1;
> +    }
> +    return 0;
> +}
> +
> +
> +static int
> +virCHProcessSetupEmulatorThread(virDomainObj *vm,
> +                         virCHMonitorEmuThreadInfo emuthread)
> +{
> +    return virCHProcessSetupPid(vm, emuthread.tid, VIR_CGROUP_THREAD_EMULATOR,
> +                               0, vm->def->cputune.emulatorpin,
> +                               vm->def->cputune.emulator_period,
> +                               vm->def->cputune.emulator_quota,
> +                               vm->def->cputune.emulatorsched);
> +}
> +
> +static int
> +virCHProcessSetupEmulatorThreads(virDomainObj *vm)
> +{
> +    int thd_index = 0;
> +    virCHDomainObjPrivate *priv = vm->privateData;
> +    /*
> +    Cloud-hypervisor start 4 Emulator threads by default:
> +    vmm
> +    cloud-hypervisor
> +    http-server
> +    signal_handler
> +    */

Please use "*" at the start of each new line in the block comment:

> +    /*
> +     * Cloud-hypervisor start 4 Emulator threads by default:
> +     * vmm
> +     * cloud-hypervisor
> +     * http-server
> +     * signal_handler
> +     */



Daniel

> +    for (thd_index = 0; thd_index < priv->monitor->nthreads; thd_index++) {
> +        if (priv->monitor->threads[thd_index].type == virCHThreadTypeEmulator) {
> +            VIR_DEBUG("Setup tid = %d (%s) Emulator thread", priv->monitor->threads[thd_index].emuInfo.tid,
> +                priv->monitor->threads[thd_index].emuInfo.thrName);
> +
> +            if (virCHProcessSetupEmulatorThread(vm, priv->monitor->threads[thd_index].emuInfo) < 0)
> +                return -1;
> +        }
> +    }
> +    return 0;
> +}
> +
>   /**
>    * virCHProcessSetupVcpu:
>    * @vm: domain object
> @@ -439,6 +505,14 @@ int virCHProcessStart(virCHDriver *driver,
>   
>       virCHDomainRefreshThreadInfo(vm);
>   
> +    VIR_DEBUG("Setting emulator tuning/settings");
> +    if (virCHProcessSetupEmulatorThreads(vm) < 0)
> +        goto cleanup;
> +
> +    VIR_DEBUG("Setting iothread tuning/settings");
> +    if (virCHProcessSetupIOThreads(vm) < 0)
> +        goto cleanup;
> +
>       VIR_DEBUG("Setting global CPU cgroup (if required)");
>       if (chSetupGlobalCpuCgroup(vm) < 0)
>           goto cleanup;
>