f167ba3466
- apparmor: don't fail on non-apparmor <seclabel> apparmor-errormsg-fix.patch, apparmor-alt-seclabel.patch bsc#1023436 - libxl: fix reporting of domain maximum memory ff225538-libxl-autoballoon-setting.patch, c89a6e78-libxl-physinfo-cleanup.patch, d2b77608-libxl-maxmem-fix.patch, 79692c38-libxl-dom0-maxmem.patch bsc#1017762 - libxl: set disk format to raw if not specified and fix disk detach 321a28c6-libxl-default-disk-format.patch, bd116810-libxl-fix-disk-detach.patch bsc#1003379 - libxl: fix timer configurations 6e4759d0-libxl-timer-fix.patch, 87df87e0-libxl-timer-tsc-emulate.patch, b4386fda-xenconfig-timer-fix.patch, d3970925-timer-tests.patch bsc#1019969 OBS-URL: https://build.opensuse.org/request/show/456194 OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=583
146 lines
5.4 KiB
Diff
146 lines
5.4 KiB
Diff
commit b4386fdac7b063fc1775e1554f6f1f21b034b355
|
|
Author: Jim Fehlig <jfehlig@suse.com>
|
|
Date: Thu Jan 19 16:51:05 2017 -0700
|
|
|
|
xenconfig: add support for more timers
|
|
|
|
Currently xenconfig only supports the hpet timer for HVM domains.
|
|
Include support for tsc timer for both PV and HVM domains.
|
|
|
|
Index: libvirt-3.0.0/src/xenconfig/xen_common.c
|
|
===================================================================
|
|
--- libvirt-3.0.0.orig/src/xenconfig/xen_common.c
|
|
+++ libvirt-3.0.0/src/xenconfig/xen_common.c
|
|
@@ -490,6 +490,7 @@ xenParseCPUFeatures(virConfPtr conf,
|
|
unsigned long count = 0;
|
|
const char *str = NULL;
|
|
int val = 0;
|
|
+ virDomainTimerDefPtr timer;
|
|
|
|
if (xenConfigGetULong(conf, "vcpus", &count, 1) < 0)
|
|
return -1;
|
|
@@ -514,6 +515,29 @@ xenParseCPUFeatures(virConfPtr conf,
|
|
if (str && (virBitmapParse(str, &def->cpumask, 4096) < 0))
|
|
return -1;
|
|
|
|
+ if (xenConfigGetString(conf, "tsc_mode", &str, NULL) < 0)
|
|
+ return -1;
|
|
+
|
|
+ if (str) {
|
|
+ if (VIR_EXPAND_N(def->clock.timers, def->clock.ntimers, 1) < 0 ||
|
|
+ VIR_ALLOC(timer) < 0)
|
|
+ return -1;
|
|
+
|
|
+ timer->name = VIR_DOMAIN_TIMER_NAME_TSC;
|
|
+ timer->present = 1;
|
|
+ timer->tickpolicy = -1;
|
|
+ timer->mode = VIR_DOMAIN_TIMER_MODE_AUTO;
|
|
+ timer->track = -1;
|
|
+ if (STREQ_NULLABLE(str, "always_emulate"))
|
|
+ timer->mode = VIR_DOMAIN_TIMER_MODE_EMULATE;
|
|
+ else if (STREQ_NULLABLE(str, "native"))
|
|
+ timer->mode = VIR_DOMAIN_TIMER_MODE_NATIVE;
|
|
+ else if (STREQ_NULLABLE(str, "native_paravirt"))
|
|
+ timer->mode = VIR_DOMAIN_TIMER_MODE_PARAVIRT;
|
|
+
|
|
+ def->clock.timers[def->clock.ntimers - 1] = timer;
|
|
+ }
|
|
+
|
|
if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) {
|
|
if (xenConfigGetBool(conf, "pae", &val, 1) < 0)
|
|
return -1;
|
|
@@ -545,9 +569,7 @@ xenParseCPUFeatures(virConfPtr conf,
|
|
return -1;
|
|
|
|
if (val != -1) {
|
|
- virDomainTimerDefPtr timer;
|
|
-
|
|
- if (VIR_ALLOC_N(def->clock.timers, 1) < 0 ||
|
|
+ if (VIR_EXPAND_N(def->clock.timers, def->clock.ntimers, 1) < 0 ||
|
|
VIR_ALLOC(timer) < 0)
|
|
return -1;
|
|
|
|
@@ -557,8 +579,7 @@ xenParseCPUFeatures(virConfPtr conf,
|
|
timer->mode = -1;
|
|
timer->track = -1;
|
|
|
|
- def->clock.ntimers = 1;
|
|
- def->clock.timers[0] = timer;
|
|
+ def->clock.timers[def->clock.ntimers - 1] = timer;
|
|
}
|
|
}
|
|
|
|
@@ -1584,8 +1605,9 @@ static int
|
|
xenFormatCPUFeatures(virConfPtr conf, virDomainDefPtr def)
|
|
{
|
|
size_t i;
|
|
+ bool hvm = !!(def->os.type == VIR_DOMAIN_OSTYPE_HVM);
|
|
|
|
- if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) {
|
|
+ if (hvm) {
|
|
if (xenConfigSetInt(conf, "pae",
|
|
(def->features[VIR_DOMAIN_FEATURE_PAE] ==
|
|
VIR_TRISTATE_SWITCH_ON) ? 1 : 0) < 0)
|
|
@@ -1610,12 +1632,57 @@ xenFormatCPUFeatures(virConfPtr conf, vi
|
|
(def->features[VIR_DOMAIN_FEATURE_VIRIDIAN] ==
|
|
VIR_TRISTATE_SWITCH_ON) ? 1 : 0) < 0)
|
|
return -1;
|
|
+ }
|
|
+
|
|
+ for (i = 0; i < def->clock.ntimers; i++) {
|
|
+ switch ((virDomainTimerNameType) def->clock.timers[i]->name) {
|
|
+ case VIR_DOMAIN_TIMER_NAME_TSC:
|
|
+ switch (def->clock.timers[i]->mode) {
|
|
+ case VIR_DOMAIN_TIMER_MODE_NATIVE:
|
|
+ if (xenConfigSetString(conf, "tsc_mode", "native") < 0)
|
|
+ return -1;
|
|
+ break;
|
|
+ case VIR_DOMAIN_TIMER_MODE_PARAVIRT:
|
|
+ if (xenConfigSetString(conf, "tsc_mode", "native_paravirt") < 0)
|
|
+ return -1;
|
|
+ break;
|
|
+ case VIR_DOMAIN_TIMER_MODE_EMULATE:
|
|
+ if (xenConfigSetString(conf, "tsc_mode", "always_emulate") < 0)
|
|
+ return -1;
|
|
+ break;
|
|
+ default:
|
|
+ if (xenConfigSetString(conf, "tsc_mode", "default") < 0)
|
|
+ return -1;
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case VIR_DOMAIN_TIMER_NAME_HPET:
|
|
+ if (hvm) {
|
|
+ int enable_hpet = def->clock.timers[i]->present != 0;
|
|
|
|
- for (i = 0; i < def->clock.ntimers; i++) {
|
|
- if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_HPET &&
|
|
- def->clock.timers[i]->present != -1 &&
|
|
- xenConfigSetInt(conf, "hpet", def->clock.timers[i]->present) < 0)
|
|
+ /* disable hpet if 'present' is 0, enable otherwise */
|
|
+ if (xenConfigSetInt(conf, "hpet", enable_hpet) < 0)
|
|
+ return -1;
|
|
+ } else {
|
|
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
+ _("unsupported timer type (name) '%s'"),
|
|
+ virDomainTimerNameTypeToString(def->clock.timers[i]->name));
|
|
return -1;
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case VIR_DOMAIN_TIMER_NAME_PLATFORM:
|
|
+ case VIR_DOMAIN_TIMER_NAME_KVMCLOCK:
|
|
+ case VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK:
|
|
+ case VIR_DOMAIN_TIMER_NAME_RTC:
|
|
+ case VIR_DOMAIN_TIMER_NAME_PIT:
|
|
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
+ _("unsupported timer type (name) '%s'"),
|
|
+ virDomainTimerNameTypeToString(def->clock.timers[i]->name));
|
|
+ return -1;
|
|
+
|
|
+ case VIR_DOMAIN_TIMER_NAME_LAST:
|
|
+ break;
|
|
}
|
|
}
|
|
|