Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP1:Update
libvirt.10484
b4386fda-xenconfig-timer-fix.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File b4386fda-xenconfig-timer-fix.patch of Package libvirt.10484
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-1.2.18.4/src/xenconfig/xen_common.c =================================================================== --- libvirt-1.2.18.4.orig/src/xenconfig/xen_common.c +++ libvirt-1.2.18.4/src/xenconfig/xen_common.c @@ -497,6 +497,7 @@ xenParseCPUFeatures(virConfPtr conf, vir unsigned long count = 0; const char *str = NULL; int val = 0; + virDomainTimerDefPtr timer; if (xenConfigGetULong(conf, "vcpus", &count, 1) < 0 || MAX_VIRT_CPUS < count) @@ -513,6 +514,29 @@ xenParseCPUFeatures(virConfPtr conf, vir if (str && (virBitmapParse(str, 0, &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; @@ -544,9 +568,7 @@ xenParseCPUFeatures(virConfPtr conf, vir 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; @@ -554,8 +576,7 @@ xenParseCPUFeatures(virConfPtr conf, vir timer->present = val; timer->tickpolicy = -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, int xendConfigVersion) { 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) @@ -1612,12 +1634,56 @@ xenFormatCPUFeatures(virConfPtr conf, vi VIR_TRISTATE_SWITCH_ON) ? 1 : 0) < 0) return -1; } + } - 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) - 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; + /* 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; } }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor