{
return virCHMonitorGet(mon, URL_VM_INFO, info);
}
+
+/**
+ * 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;
+ size_t niothreads = 0;
+ int thd_index;
+ virDomainIOThreadInfo **iothreadinfolist = NULL;
+ virDomainIOThreadInfo *iothreadinfo = NULL;
+
+ *iothreads = NULL;
+ nthreads = virCHMonitorRefreshThreadInfo(mon);
+
+ iothreadinfolist = g_new0(virDomainIOThreadInfo*, nthreads + 1);
+
+ for (thd_index = 0; thd_index < nthreads; thd_index++) {
+ g_autoptr(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 error;
+
+ if (virBitmapToData(map, &(iothreadinfo->cpumap),
+ &(iothreadinfo->cpumaplen)) < 0) {
+ goto error;
+ }
+
+ /* Append to iothreadinfolist */
+ iothreadinfolist[niothreads] = g_steal_pointer(&iothreadinfo);
+ niothreads++;
+ }
+ }
+
+ VIR_DEBUG("niothreads = %ld", niothreads);
+ *iothreads = g_steal_pointer(iothreadinfolist);
+ return niothreads;
+
+ error:
+ if (iothreadinfolist) {
+ for (thd_index = 0; thd_index < niothreads; thd_index++)
+ virDomainIOThreadInfoFree(iothreadinfolist[thd_index]);
+ VIR_FREE(iothreadinfolist);
+ }
+ virDomainIOThreadInfoFree(iothreadinfo);
+ return -1;
+}
#define START_VM_POSTFIX ": starting up vm\n"
-
static virCHMonitor *
virCHProcessConnectMonitor(virCHDriver *driver,
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
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 (virDomainCgroupSetupGlobalCpuCgroup(vm,
priv->cgroup,