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
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;
>
© 2016 - 2026 Red Hat, Inc.