Hello community, here is the log from the commit of package libvirt for openSUSE:Factory checked in at 2017-02-22 13:48:57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libvirt (Old) and /work/SRC/openSUSE:Factory/.libvirt.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libvirt" Changes: -------- --- /work/SRC/openSUSE:Factory/libvirt/libvirt.changes 2017-02-10 09:45:22.736813615 +0100 +++ /work/SRC/openSUSE:Factory/.libvirt.new/libvirt.changes 2017-02-22 13:48:58.975187053 +0100 @@ -1,0 +2,47 @@ +Sat Feb 18 18:22:02 CET 2017 - [email protected] + +- Don't call insserv if we use systemd and don't require it. + +------------------------------------------------------------------- +Thu Feb 16 23:57:37 UTC 2017 - [email protected] + +- libxl: more fixes for dom0 maxmem setting + 4ab0c959-libxl-mem-leak.patch, 2dc1cf19-libxl-double-free.patch + bsc#1017762 + +------------------------------------------------------------------- +Fri Feb 10 20:29:46 UTC 2017 - [email protected] + +- apparmor: don't fail on non-apparmor <seclabel> + apparmor-errormsg-fix.patch, apparmor-alt-seclabel.patch + bsc#1023436 + +------------------------------------------------------------------- +Fri Feb 10 18:39:37 UTC 2017 - [email protected] + +- 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 + +------------------------------------------------------------------- +Fri Feb 10 16:47:49 UTC 2017 - [email protected] + +- 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 + +------------------------------------------------------------------- +Thu Feb 9 23:35:08 UTC 2017 - [email protected] + +- 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 + +------------------------------------------------------------------- New: ---- 2dc1cf19-libxl-double-free.patch 321a28c6-libxl-default-disk-format.patch 4ab0c959-libxl-mem-leak.patch 6e4759d0-libxl-timer-fix.patch 79692c38-libxl-dom0-maxmem.patch 87df87e0-libxl-timer-tsc-emulate.patch apparmor-alt-seclabel.patch apparmor-errormsg-fix.patch b4386fda-xenconfig-timer-fix.patch bd116810-libxl-fix-disk-detach.patch c89a6e78-libxl-physinfo-cleanup.patch d2b77608-libxl-maxmem-fix.patch d3970925-timer-tests.patch ff225538-libxl-autoballoon-setting.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libvirt.spec ++++++ --- /var/tmp/diff_new_pack.CIJTMH/_old 2017-02-22 13:49:00.398984355 +0100 +++ /var/tmp/diff_new_pack.CIJTMH/_new 2017-02-22 13:49:00.402983786 +0100 @@ -315,8 +315,22 @@ # Upstream patches Patch0: b018ada3-shunloadtest-build-fix.patch Patch1: f86a7a83-libxl-dom0-balloon-fix.patch +Patch2: 6e4759d0-libxl-timer-fix.patch +Patch3: 87df87e0-libxl-timer-tsc-emulate.patch +Patch4: b4386fda-xenconfig-timer-fix.patch +Patch5: d3970925-timer-tests.patch +Patch6: 321a28c6-libxl-default-disk-format.patch +Patch7: bd116810-libxl-fix-disk-detach.patch +Patch8: ff225538-libxl-autoballoon-setting.patch +Patch9: c89a6e78-libxl-physinfo-cleanup.patch +Patch10: d2b77608-libxl-maxmem-fix.patch +Patch11: 79692c38-libxl-dom0-maxmem.patch +Patch12: 4ab0c959-libxl-mem-leak.patch +Patch13: 2dc1cf19-libxl-double-free.patch # Patches pending upstream review Patch100: libxl-dom-reset.patch +Patch101: apparmor-errormsg-fix.patch +Patch102: apparmor-alt-seclabel.patch # Need to go upstream Patch150: xen-pv-cdrom.patch Patch151: blockcopy-check-dst-identical-device.patch @@ -725,9 +739,9 @@ %package libs Summary: Client side libraries -Group: Development/Libraries/C and C++ # So remote clients can access libvirt over SSH tunnel # (client invokes 'nc' against the UNIX socket on the server) +Group: Development/Libraries/C and C++ Requires: netcat-openbsd # Not technically required, but makes 'out-of-box' config # work correctly & doesn't have onerous dependencies @@ -795,7 +809,21 @@ %setup -q %patch0 -p1 %patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 +%patch11 -p1 +%patch12 -p1 +%patch13 -p1 %patch100 -p1 +%patch101 -p1 +%patch102 -p1 %patch150 -p1 %patch151 -p1 %patch152 -p1 @@ -1289,8 +1317,9 @@ %postun client %if %{with_systemd} %service_del_postun libvirt-guests.service -%endif +%else %insserv_cleanup +%endif %post libs /sbin/ldconfig ++++++ 2dc1cf19-libxl-double-free.patch ++++++ commit 2dc1cf19dbaf648662fbf3c810db65ddcf5d0444 Author: Jim Fehlig <[email protected]> Date: Wed Feb 15 10:45:27 2017 -0700 libxl: fix potential double free in libxlDriverGetDom0MaxmemConf Commit 4ab0c959 fixed a memory leak in libxlDriverGetDom0MaxmemConf but introduced a potential double free of mem_tokens *** Error in `/usr/sbin/libvirtd': double free or corruption (out): 0x00007fffc808cfd0 *** Avoid double free by setting mem_tokens to NULL after calling virStringListFree. Index: libvirt-3.0.0/src/libxl/libxl_conf.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_conf.c +++ libvirt-3.0.0/src/libxl/libxl_conf.c @@ -1623,6 +1623,7 @@ libxlDriverGetDom0MaxmemConf(libxlDriver } } virStringListFree(mem_tokens); + mem_tokens = NULL; } physmem: ++++++ 321a28c6-libxl-default-disk-format.patch ++++++ commit 321a28c6aef6fb31b4ba309a1b3d252f7cd0f05c Author: Jim Fehlig <[email protected]> Date: Tue Feb 7 11:00:33 2017 -0700 libxl: set default disk format in device post-parse When starting a domian, a libxl_domain_config object is created from virDomainDef. Any virDomainDiskDef devices with a format of VIR_STORAGE_FILE_NONE are mapped to LIBXL_DISK_FORMAT_RAW in the corresponding libxl_disk_device, but the virDomainDiskDef format is never updated to reflect the change. A better place to set a default format for disk devices is the device post-parse callback, ensuring the virDomainDiskDef object reflects the default format. Index: libvirt-3.0.0/src/libxl/libxl_conf.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_conf.c +++ libvirt-3.0.0/src/libxl/libxl_conf.c @@ -765,8 +765,6 @@ libxlMakeDisk(virDomainDiskDefPtr l_disk x_disk->format = LIBXL_DISK_FORMAT_VHD; x_disk->backend = LIBXL_DISK_BACKEND_TAP; break; - case VIR_STORAGE_FILE_NONE: - /* No subtype specified, default to raw/tap */ case VIR_STORAGE_FILE_RAW: x_disk->format = LIBXL_DISK_FORMAT_RAW; x_disk->backend = LIBXL_DISK_BACKEND_TAP; @@ -802,8 +800,6 @@ libxlMakeDisk(virDomainDiskDefPtr l_disk case VIR_STORAGE_FILE_VHD: x_disk->format = LIBXL_DISK_FORMAT_VHD; break; - case VIR_STORAGE_FILE_NONE: - /* No subtype specified, default to raw */ case VIR_STORAGE_FILE_RAW: x_disk->format = LIBXL_DISK_FORMAT_RAW; break; @@ -816,8 +812,7 @@ libxlMakeDisk(virDomainDiskDefPtr l_disk return -1; } } else if (STREQ(driver, "file")) { - if (format != VIR_STORAGE_FILE_NONE && - format != VIR_STORAGE_FILE_RAW) { + if (format != VIR_STORAGE_FILE_RAW) { virReportError(VIR_ERR_INTERNAL_ERROR, _("libxenlight does not support disk format %s " "with disk driver %s"), @@ -828,8 +823,7 @@ libxlMakeDisk(virDomainDiskDefPtr l_disk x_disk->format = LIBXL_DISK_FORMAT_RAW; x_disk->backend = LIBXL_DISK_BACKEND_QDISK; } else if (STREQ(driver, "phy")) { - if (format != VIR_STORAGE_FILE_NONE && - format != VIR_STORAGE_FILE_RAW) { + if (format != VIR_STORAGE_FILE_RAW) { virReportError(VIR_ERR_INTERNAL_ERROR, _("libxenlight does not support disk format %s " "with disk driver %s"), Index: libvirt-3.0.0/src/libxl/libxl_domain.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_domain.c +++ libvirt-3.0.0/src/libxl/libxl_domain.c @@ -362,16 +362,21 @@ libxlDomainDeviceDefPostParse(virDomainD } } - /* for network-based disks, set 'qemu' as the default driver */ if (dev->type == VIR_DOMAIN_DEVICE_DISK) { virDomainDiskDefPtr disk = dev->data.disk; int actual_type = virStorageSourceGetActualType(disk->src); + int format = virDomainDiskGetFormat(disk); + /* for network-based disks, set 'qemu' as the default driver */ if (actual_type == VIR_STORAGE_TYPE_NETWORK) { if (!virDomainDiskGetDriver(disk) && virDomainDiskSetDriver(disk, "qemu") < 0) return -1; } + + /* xl.cfg default format is raw. See xl-disk-configuration(5) */ + if (format == VIR_STORAGE_FILE_NONE) + virDomainDiskSetFormat(disk, VIR_STORAGE_FILE_RAW); } return 0; Index: libvirt-3.0.0/src/libxl/libxl_driver.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_driver.c +++ libvirt-3.0.0/src/libxl/libxl_driver.c @@ -5466,8 +5466,7 @@ libxlDomainBlockStatsGatherSingle(virDom disk_drv = "qemu"; if (STREQ(disk_drv, "phy")) { - if (disk_fmt != VIR_STORAGE_FILE_RAW && - disk_fmt != VIR_STORAGE_FILE_NONE) { + if (disk_fmt != VIR_STORAGE_FILE_RAW) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("unsupported format %s"), virStorageFileFormatTypeToString(disk_fmt)); ++++++ 4ab0c959-libxl-mem-leak.patch ++++++ commit 4ab0c959e936de7fa2752160ff532913740d4da9 Author: John Ferlan <[email protected]> Date: Fri Feb 10 06:54:56 2017 -0500 libxl: Resolve possible resource leak in dom0 maximum memory setting If either the "if (STRPREFIX(mem_tokens[j], "max:"))" is never entered or the "if (virStrToLong_ull(mem_tokens[j] + 4, &p, 10, maxmem) < 0)" break is hit, control goes back to the outer loop processing 'cmd_tokens' and it's possible that the 'mem_tokens' would be overwritten. Found by Coverity Index: libvirt-3.0.0/src/libxl/libxl_conf.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_conf.c +++ libvirt-3.0.0/src/libxl/libxl_conf.c @@ -1622,6 +1622,7 @@ libxlDriverGetDom0MaxmemConf(libxlDriver goto cleanup; } } + virStringListFree(mem_tokens); } physmem: ++++++ 6e4759d0-libxl-timer-fix.patch ++++++ commit 6e4759d0695429e36765f3e1c516939a369799f2 Author: Jim Fehlig <[email protected]> Date: Mon Jan 16 15:37:40 2017 -0700 libxl: fix timer configuration The current logic around configuring timers in libxl based on virDomainDef object is a bit brain dead. Unsupported timers are silently ignored and tsc is only recognized if it is the first timer specified. Change the logic to reject unsupported timers and honor the tsc timer regardless of its order when multiple timers are specified. Index: libvirt-3.0.0/src/libxl/libxl_conf.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_conf.c +++ libvirt-3.0.0/src/libxl/libxl_conf.c @@ -313,9 +313,10 @@ libxlMakeDomBuildInfo(virDomainDefPtr de for (i = 0; i < virDomainDefGetVcpus(def); i++) libxl_bitmap_set((&b_info->avail_vcpus), i); - if (def->clock.ntimers > 0 && - def->clock.timers[0]->name == VIR_DOMAIN_TIMER_NAME_TSC) { - switch (def->clock.timers[0]->mode) { + 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: b_info->tsc_mode = 2; break; @@ -324,8 +325,35 @@ libxlMakeDomBuildInfo(virDomainDefPtr de break; default: b_info->tsc_mode = 1; + } + break; + + case VIR_DOMAIN_TIMER_NAME_HPET: + if (!hvm) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported timer type (name) '%s'"), + virDomainTimerNameTypeToString(def->clock.timers[i]->name)); + return -1; + } + if (def->clock.timers[i]->present == 1) + libxl_defbool_set(&b_info->u.hvm.hpet, 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; } } + b_info->sched_params.weight = 1000; b_info->max_memkb = virDomainDefGetMemoryInitial(def); b_info->target_memkb = def->mem.cur_balloon; @@ -341,12 +369,6 @@ libxlMakeDomBuildInfo(virDomainDefPtr de libxl_defbool_set(&b_info->u.hvm.acpi, def->features[VIR_DOMAIN_FEATURE_ACPI] == VIR_TRISTATE_SWITCH_ON); - 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) { - libxl_defbool_set(&b_info->u.hvm.hpet, 1); - } - } if (def->nsounds > 0) { /* ++++++ 79692c38-libxl-dom0-maxmem.patch ++++++ commit 79692c387497a0b67f65b0293291d1137461985f Author: Jim Fehlig <[email protected]> Date: Tue Jan 31 17:10:34 2017 -0700 libxl: fix dom0 maximum memory setting When the libxl driver is initialized, it creates a virDomainDef object for dom0 and adds it to the list of domains. Total memory for dom0 was being set from the max_memkb field of libxl_dominfo struct retrieved from libxl, but this field can be set to LIBXL_MEMKB_DEFAULT (~0ULL) if dom0 maximum memory has not been explicitly set by the user. This patch adds some simple parsing of the Xen commandline, looking for a dom0_mem parameter that also specifies a 'max' value. If not specified, dom0 maximum memory is effectively all physical host memory. Signed-off-by: Jim Fehlig <[email protected]> Index: libvirt-3.0.0/src/libxl/libxl_conf.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_conf.c +++ libvirt-3.0.0/src/libxl/libxl_conf.c @@ -34,6 +34,7 @@ #include "internal.h" #include "virlog.h" #include "virerror.h" +#include "c-ctype.h" #include "datatypes.h" #include "virconf.h" #include "virfile.h" @@ -1559,6 +1560,88 @@ int libxlDriverConfigLoadFile(libxlDrive } +/* + * dom0's maximum memory can be controled by the user with the 'dom0_mem' Xen + * command line parameter. E.g. to set dom0's initial memory to 4G and max + * memory to 8G: dom0_mem=4G,max:8G + * Supported unit suffixes are [bBkKmMgGtT]. If not specified the default + * unit is kilobytes. + * + * If not constrained by the user, dom0 can effectively use all host memory. + * This function returns the configured maximum memory for dom0 in kilobytes, + * either the user-specified value or total physical memory as a default. + */ +int +libxlDriverGetDom0MaxmemConf(libxlDriverConfigPtr cfg, + unsigned long long *maxmem) +{ + char **cmd_tokens = NULL; + char **mem_tokens = NULL; + size_t i; + size_t j; + libxl_physinfo physinfo; + int ret = -1; + + if (cfg->verInfo->commandline == NULL || + !(cmd_tokens = virStringSplit(cfg->verInfo->commandline, " ", 0))) + goto physmem; + + for (i = 0; cmd_tokens[i] != NULL; i++) { + if (!STRPREFIX(cmd_tokens[i], "dom0_mem=")) + continue; + + if (!(mem_tokens = virStringSplit(cmd_tokens[i], ",", 0))) + break; + for (j = 0; mem_tokens[j] != NULL; j++) { + if (STRPREFIX(mem_tokens[j], "max:")) { + char *p = mem_tokens[j] + 4; + unsigned long long multiplier = 1; + + while (c_isdigit(*p)) + p++; + if (virStrToLong_ull(mem_tokens[j] + 4, &p, 10, maxmem) < 0) + break; + if (*p) { + switch (*p) { + case 'm': + case 'M': + multiplier = 1024; + break; + case 'g': + case 'G': + multiplier = 1024 * 1024; + break; + case 't': + case 'T': + multiplier = 1024 * 1024 * 1024; + break; + } + } + *maxmem = *maxmem * multiplier; + ret = 0; + goto cleanup; + } + } + } + + physmem: + /* No 'max' specified in dom0_mem, so dom0 can use all physical memory */ + libxl_physinfo_init(&physinfo); + if (libxl_get_physinfo(cfg->ctx, &physinfo)) { + VIR_WARN("libxl_get_physinfo failed"); + goto cleanup; + } + *maxmem = (physinfo.total_pages * cfg->verInfo->pagesize) / 1024; + libxl_physinfo_dispose(&physinfo); + ret = 0; + + cleanup: + virStringListFree(cmd_tokens); + virStringListFree(mem_tokens); + return ret; +} + + #ifdef LIBXL_HAVE_DEVICE_CHANNEL static int libxlPrepareChannel(virDomainChrDefPtr channel, Index: libvirt-3.0.0/src/libxl/libxl_conf.h =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_conf.h +++ libvirt-3.0.0/src/libxl/libxl_conf.h @@ -174,6 +174,10 @@ int libxlDriverConfigLoadFile(libxlDrive const char *filename); int +libxlDriverGetDom0MaxmemConf(libxlDriverConfigPtr cfg, + unsigned long long *maxmem); + +int libxlMakeDisk(virDomainDiskDefPtr l_dev, libxl_device_disk *x_dev); void Index: libvirt-3.0.0/src/libxl/libxl_driver.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_driver.c +++ libvirt-3.0.0/src/libxl/libxl_driver.c @@ -576,6 +576,7 @@ libxlAddDom0(libxlDriverPrivatePtr drive virDomainObjPtr vm = NULL; virDomainDefPtr oldDef = NULL; libxl_dominfo d_info; + unsigned long long maxmem; int ret = -1; libxl_dominfo_init(&d_info); @@ -615,7 +616,9 @@ libxlAddDom0(libxlDriverPrivatePtr drive if (virDomainDefSetVcpus(vm->def, d_info.vcpu_online) < 0) goto cleanup; vm->def->mem.cur_balloon = d_info.current_memkb; - virDomainDefSetMemoryTotal(vm->def, d_info.max_memkb); + if (libxlDriverGetDom0MaxmemConf(cfg, &maxmem) < 0) + maxmem = d_info.current_memkb; + virDomainDefSetMemoryTotal(vm->def, maxmem); ret = 0; ++++++ 87df87e0-libxl-timer-tsc-emulate.patch ++++++ commit 87df87e06b57dedd39906cd46166842179732668 Author: Jim Fehlig <[email protected]> Date: Thu Jan 19 16:21:34 2017 -0700 libxl: support emulate mode of tsc timer While at it, use members of libxl_tsc_mode enum instead of literal int values. Index: libvirt-3.0.0/src/libxl/libxl_conf.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_conf.c +++ libvirt-3.0.0/src/libxl/libxl_conf.c @@ -318,13 +318,16 @@ libxlMakeDomBuildInfo(virDomainDefPtr de case VIR_DOMAIN_TIMER_NAME_TSC: switch (def->clock.timers[i]->mode) { case VIR_DOMAIN_TIMER_MODE_NATIVE: - b_info->tsc_mode = 2; + b_info->tsc_mode = LIBXL_TSC_MODE_NATIVE; break; case VIR_DOMAIN_TIMER_MODE_PARAVIRT: - b_info->tsc_mode = 3; + b_info->tsc_mode = LIBXL_TSC_MODE_NATIVE_PARAVIRT; + break; + case VIR_DOMAIN_TIMER_MODE_EMULATE: + b_info->tsc_mode = LIBXL_TSC_MODE_ALWAYS_EMULATE; break; default: - b_info->tsc_mode = 1; + b_info->tsc_mode = LIBXL_TSC_MODE_DEFAULT; } break; ++++++ apparmor-alt-seclabel.patch ++++++ commit 8f6a7866102346691fce84ade9a6d8534aaffcdc Author: Jim Fehlig <[email protected]> Date: Thu Feb 2 19:26:13 2017 -0700 apparmor: don't fail on non-apparmor <seclabel> If the apparmor security driver is loaded/enabled and domain config contains a <seclabel> element whose type attribute is not 'apparmor', starting the domain fails when attempting to label resources such as tap FDs. Many of the apparmor driver entry points attempt to retrieve the apparmor security label from the domain def, returning failure if not found. Functions such as AppArmorSetFDLabel fail even though domain config contains an explicit 'none' secuirty driver, e.g. <seclabel type='none' model='none'/> Change the entry points to succeed if the domain config <seclabel> is not apparmor. This matches the behavior of the selinux driver. Index: libvirt-3.0.0/src/security/security_apparmor.c =================================================================== --- libvirt-3.0.0.orig/src/security/security_apparmor.c +++ libvirt-3.0.0/src/security/security_apparmor.c @@ -289,10 +289,7 @@ reload_profile(virSecurityManagerPtr mgr virSecurityLabelDefPtr secdef = virDomainDefGetSecurityLabelDef( def, SECURITY_APPARMOR_NAME); - if (!secdef) - return rc; - - if (!secdef->relabel) + if (!secdef || !secdef->relabel) return 0; if ((profile_name = get_profile_name(def)) == NULL) @@ -435,7 +432,7 @@ AppArmorGenSecurityLabel(virSecurityMana SECURITY_APPARMOR_NAME); if (!secdef) - return -1; + return 0; if ((secdef->type == VIR_DOMAIN_SECLABEL_STATIC) || (secdef->type == VIR_DOMAIN_SECLABEL_NONE)) @@ -495,10 +492,7 @@ AppArmorSetSecurityAllLabel(virSecurityM { virSecurityLabelDefPtr secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); - if (!secdef) - return -1; - - if (!secdef->relabel) + if (!secdef || !secdef->relabel) return 0; /* Reload the profile if stdin_path is specified. Note that @@ -559,12 +553,11 @@ AppArmorReleaseSecurityLabel(virSecurity { virSecurityLabelDefPtr secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); - if (!secdef) - return -1; - - VIR_FREE(secdef->model); - VIR_FREE(secdef->label); - VIR_FREE(secdef->imagelabel); + if (secdef) { + VIR_FREE(secdef->model); + VIR_FREE(secdef->label); + VIR_FREE(secdef->imagelabel); + } return 0; } @@ -580,7 +573,7 @@ AppArmorRestoreSecurityAllLabel(virSecur virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); if (!secdef) - return -1; + return 0; if (secdef->type == VIR_DOMAIN_SECLABEL_DYNAMIC) { if ((rc = remove_profile(secdef->label)) != 0) { @@ -604,10 +597,7 @@ AppArmorSetSecurityProcessLabel(virSecur virSecurityLabelDefPtr secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); - if (!secdef) - return -1; - - if (secdef->label == NULL) + if (!secdef || !secdef->label) return 0; if ((profile_name = get_profile_name(def)) == NULL) @@ -653,10 +643,7 @@ AppArmorSetSecurityChildProcessLabel(vir virSecurityLabelDefPtr secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); - if (!secdef) - goto cleanup; - - if (secdef->label == NULL) + if (!secdef || !secdef->label) return 0; if (STRNEQ(SECURITY_APPARMOR_NAME, secdef->model)) { @@ -738,10 +725,8 @@ AppArmorSetSecurityImageLabel(virSecurit if (!src->path || !virStorageSourceIsLocalStorage(src)) return 0; - if (!(secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME))) - return -1; - - if (!secdef->relabel) + secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); + if (!secdef || !secdef->relabel) return 0; if (secdef->imagelabel) { @@ -792,7 +777,7 @@ AppArmorSecurityVerify(virSecurityManage virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); if (!secdef) - return -1; + return 0; if (secdef->type == VIR_DOMAIN_SECLABEL_STATIC) { if (use_apparmor() < 0 || profile_status(secdef->label, 0) < 0) { @@ -829,10 +814,7 @@ AppArmorSetSecurityHostdevLabel(virSecur virDomainHostdevSubsysSCSIPtr scsisrc = &dev->source.subsys.u.scsi; virDomainHostdevSubsysSCSIVHostPtr hostsrc = &dev->source.subsys.u.scsi_host; - if (!secdef) - return -1; - - if (!secdef->relabel) + if (!secdef || !secdef->relabel) return 0; if (dev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) @@ -940,10 +922,7 @@ AppArmorRestoreSecurityHostdevLabel(virS virSecurityLabelDefPtr secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); - if (!secdef) - return -1; - - if (!secdef->relabel) + if (!secdef || !secdef->relabel) return 0; return reload_profile(mgr, def, NULL, false); @@ -978,10 +957,7 @@ AppArmorSetFDLabel(virSecurityManagerPtr virSecurityLabelDefPtr secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_APPARMOR_NAME); - if (!secdef) - return -1; - - if (secdef->imagelabel == NULL) + if (!secdef || !secdef->imagelabel) return 0; if (virAsprintf(&proc, "/proc/self/fd/%d", fd) == -1) ++++++ apparmor-errormsg-fix.patch ++++++ commit 789999f481b31398f147e547550184bf303ce729 Author: Jim Fehlig <[email protected]> Date: Thu Feb 2 19:17:29 2017 -0700 apparmor: don't overwrite error from reload_profile Like other callers of reload_profile, don't overwrite errors in AppArmorSetSecurityHostdevLabelHelper. Index: libvirt-3.0.0/src/security/security_apparmor.c =================================================================== --- libvirt-3.0.0.orig/src/security/security_apparmor.c +++ libvirt-3.0.0/src/security/security_apparmor.c @@ -322,19 +322,7 @@ AppArmorSetSecurityHostdevLabelHelper(co struct SDPDOP *ptr = opaque; virDomainDefPtr def = ptr->def; - if (reload_profile(ptr->mgr, def, file, true) < 0) { - virSecurityLabelDefPtr secdef = virDomainDefGetSecurityLabelDef( - def, SECURITY_APPARMOR_NAME); - if (!secdef) { - virReportOOMError(); - return -1; - } - virReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot update AppArmor profile \'%s\'"), - secdef->imagelabel); - return -1; - } - return 0; + return reload_profile(ptr->mgr, def, file, true); } static int ++++++ b4386fda-xenconfig-timer-fix.patch ++++++ commit b4386fdac7b063fc1775e1554f6f1f21b034b355 Author: Jim Fehlig <[email protected]> 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; } } ++++++ bd116810-libxl-fix-disk-detach.patch ++++++ commit bd1168101a0ea5efcf3b2dc5ee782af6ad911320 Author: Jim Fehlig <[email protected]> Date: Tue Feb 7 12:05:15 2017 -0700 libxl: fix disk detach when <driver> not specified When a user does not explicitly set a <driver> in the disk config, libvirt defers selection of a default to libxl. This approach works fine when starting a domain with such configuration or attaching a disk to a running domain. But when detaching such a disk, libxl will fail with "unrecognized disk backend type: 0". libxl makes no attempt to recalculate a default backend (driver) on detach and simply fails when uninitialized. This patch updates the libvirt disk config with the backend selected by libxl when starting a domain or attaching a disk to a running domain. Another benefit of this approach is that the live XML is also updated with the backend driver selected by libxl. Index: libvirt-3.0.0/src/libxl/libxl_conf.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_conf.c +++ libvirt-3.0.0/src/libxl/libxl_conf.c @@ -907,6 +907,38 @@ libxlMakeDiskList(virDomainDefPtr def, l return -1; } +/* + * Update libvirt disk config with libxl disk config. + * + * This function can be used to update the libvirt disk config with default + * values selected by libxl. Currently only the backend type is selected by + * libxl when not explicitly specified by the user. + */ +void +libxlUpdateDiskDef(virDomainDiskDefPtr l_disk, libxl_device_disk *x_disk) +{ + const char *driver = NULL; + + if (virDomainDiskGetDriver(l_disk)) + return; + + switch (x_disk->backend) { + case LIBXL_DISK_BACKEND_QDISK: + driver = "qemu"; + break; + case LIBXL_DISK_BACKEND_TAP: + driver = "tap"; + break; + case LIBXL_DISK_BACKEND_PHY: + driver = "phy"; + break; + case LIBXL_DISK_BACKEND_UNKNOWN: + break; + } + if (driver) + ignore_value(virDomainDiskSetDriver(l_disk, driver)); +} + int libxlMakeNic(virDomainDefPtr def, virDomainNetDefPtr l_nic, Index: libvirt-3.0.0/src/libxl/libxl_conf.h =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_conf.h +++ libvirt-3.0.0/src/libxl/libxl_conf.h @@ -175,6 +175,10 @@ int libxlDriverConfigLoadFile(libxlDrive int libxlMakeDisk(virDomainDiskDefPtr l_dev, libxl_device_disk *x_dev); + +void +libxlUpdateDiskDef(virDomainDiskDefPtr l_dev, libxl_device_disk *x_dev); + int libxlMakeNic(virDomainDefPtr def, virDomainNetDefPtr l_nic, Index: libvirt-3.0.0/src/libxl/libxl_domain.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_domain.c +++ libvirt-3.0.0/src/libxl/libxl_domain.c @@ -1072,6 +1072,30 @@ libxlDomainCreateIfaceNames(virDomainDef } } +static void +libxlDomainUpdateDiskParams(virDomainDefPtr def, libxl_ctx *ctx) +{ + libxl_device_disk *disks; + int num_disks = 0; + size_t i; + int idx; + + disks = libxl_device_disk_list(ctx, def->id, &num_disks); + if (!disks) + return; + + for (i = 0; i < num_disks; i++) { + if ((idx = virDomainDiskIndexByName(def, disks[i].vdev, false)) < 0) + continue; + + libxlUpdateDiskDef(def->disks[idx], &disks[i]); + } + + for (i = 0; i < num_disks; i++) + libxl_device_disk_dispose(&disks[i]); + VIR_FREE(disks); +} + #ifdef LIBXL_HAVE_DEVICE_CHANNEL static void libxlDomainCreateChannelPTY(virDomainDefPtr def, libxl_ctx *ctx) @@ -1315,6 +1339,7 @@ libxlDomainStart(libxlDriverPrivatePtr d goto destroy_dom; libxlDomainCreateIfaceNames(vm->def, &d_config); + libxlDomainUpdateDiskParams(vm->def, cfg->ctx); #ifdef LIBXL_HAVE_DEVICE_CHANNEL if (vm->def->nchannels > 0) Index: libvirt-3.0.0/src/libxl/libxl_driver.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_driver.c +++ libvirt-3.0.0/src/libxl/libxl_driver.c @@ -3028,6 +3028,7 @@ libxlDomainAttachDeviceDiskLive(virDomai goto cleanup; } + libxlUpdateDiskDef(l_disk, &x_disk); virDomainDiskInsertPreAlloced(vm->def, l_disk); } else { ++++++ c89a6e78-libxl-physinfo-cleanup.patch ++++++ commit c89a6e7878e630718cce0af940e9c070c132ce30 Author: Jim Fehlig <[email protected]> Date: Tue Jan 31 20:07:30 2017 -0700 libxl: use init and dispose functions with libxl_physinfo The typical pattern when calling libxl functions that populate a structure is libxl_foo foo; libxl_foo_init(&foo); libxl_get_foo(ctx, &foo); ... libxl_foo_dispose(&foo); Fix several instances of libxl_physinfo missing the init and dispose calls. Signed-off-by: Jim Fehlig <[email protected]> Index: libvirt-3.0.0/src/libxl/libxl_capabilities.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_capabilities.c +++ libvirt-3.0.0/src/libxl/libxl_capabilities.c @@ -211,27 +211,33 @@ libxlCapsInitHost(libxl_ctx *ctx, virCap const libxl_version_info *ver_info; enum libxlHwcapVersion version; libxl_physinfo phy_info; + int ret = -1; + libxl_physinfo_init(&phy_info); if (libxl_get_physinfo(ctx, &phy_info) != 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Failed to get node physical info from libxenlight")); - return -1; + goto cleanup; } if ((ver_info = libxl_get_version_info(ctx)) == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Failed to get version info from libxenlight")); - return -1; + goto cleanup; } version = (ver_info->xen_version_minor >= 7); if (libxlCapsInitCPU(caps, &phy_info, version) < 0) - return -1; + goto cleanup; if (virCapabilitiesSetNetPrefix(caps, LIBXL_GENERATED_PREFIX_XEN) < 0) - return -1; + goto cleanup; - return 0; + ret = 0; + + cleanup: + libxl_physinfo_dispose(&phy_info); + return ret; } static int Index: libvirt-3.0.0/src/libxl/libxl_conf.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_conf.c +++ libvirt-3.0.0/src/libxl/libxl_conf.c @@ -1969,6 +1969,7 @@ libxlDriverNodeGetInfo(libxlDriverPrivat libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); int ret = -1; + libxl_physinfo_init(&phy_info); if (libxl_get_physinfo(cfg->ctx, &phy_info)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("libxl_get_physinfo_info failed")); @@ -1993,6 +1994,7 @@ libxlDriverNodeGetInfo(libxlDriverPrivat ret = 0; cleanup: + libxl_physinfo_dispose(&phy_info); virObjectUnref(cfg); return ret; } Index: libvirt-3.0.0/src/libxl/libxl_driver.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_driver.c +++ libvirt-3.0.0/src/libxl/libxl_driver.c @@ -4284,6 +4284,7 @@ libxlNodeGetFreeMemory(virConnectPtr con libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); unsigned long long ret = 0; + libxl_physinfo_init(&phy_info); if (virNodeGetFreeMemoryEnsureACL(conn) < 0) goto cleanup; @@ -4296,6 +4297,7 @@ libxlNodeGetFreeMemory(virConnectPtr con ret = phy_info.free_pages * cfg->verInfo->pagesize; cleanup: + libxl_physinfo_dispose(&phy_info); virObjectUnref(cfg); return ret; } ++++++ d2b77608-libxl-maxmem-fix.patch ++++++ commit d2b77608e9e9c23416a9ac93a50054348cb51653 Author: Jim Fehlig <[email protected]> Date: Mon Jan 16 10:51:40 2017 -0700 libxl: fix reporting of maximum memory The libxl driver reports different values of maximum memory depending on state of a domain. If inactive, maximum memory value is reported correctly. When active, maximum memory is derived from max_pages value returned by the XEN_SYSCTL_getdomaininfolist sysctl operation. But max_pages can be changed by toolstacks and does not necessarily represent the maximum memory a domain can use during its active lifetime. A better location for determining a domain's maximum memory is the /local/domain/<id>/memory/static-max node in xenstore. This value is set from the libxl_domain_build_info.max_memkb field when creating the domain. Currently it cannot be changed nor can its value be exceeded by a balloon operation. From libvirt's perspective, always reporting maximum memory with virDomainDefGetMemoryTotal() will produce the same results as reading the static-max node in xenstore. Signed-off-by: Jim Fehlig <[email protected]> Index: libvirt-3.0.0/src/libxl/libxl_driver.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_driver.c +++ libvirt-3.0.0/src/libxl/libxl_driver.c @@ -1640,10 +1640,10 @@ libxlDomainGetInfo(virDomainPtr dom, vir if (virDomainGetInfoEnsureACL(dom->conn, vm->def) < 0) goto cleanup; + info->maxMem = virDomainDefGetMemoryTotal(vm->def); if (!virDomainObjIsActive(vm)) { info->cpuTime = 0; info->memory = vm->def->mem.cur_balloon; - info->maxMem = virDomainDefGetMemoryTotal(vm->def); } else { libxl_dominfo_init(&d_info); @@ -1655,7 +1655,6 @@ libxlDomainGetInfo(virDomainPtr dom, vir } info->cpuTime = d_info.cpu_time; info->memory = d_info.current_memkb; - info->maxMem = d_info.max_memkb; libxl_dominfo_dispose(&d_info); } @@ -5175,7 +5174,7 @@ libxlDomainMemoryStats(virDomainPtr dom, goto endjob; } mem = d_info.current_memkb; - maxmem = d_info.max_memkb; + maxmem = virDomainDefGetMemoryTotal(vm->def); LIBXL_SET_MEMSTAT(VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON, mem); LIBXL_SET_MEMSTAT(VIR_DOMAIN_MEMORY_STAT_AVAILABLE, maxmem); ++++++ d3970925-timer-tests.patch ++++++ commit d397092591518006b41131f9fc921f74248e60a3 Author: Jim Fehlig <[email protected]> Date: Thu Jan 19 17:19:18 2017 -0700 tests: add xlconfig tests for <timer> configurations Index: libvirt-3.0.0/tests/xlconfigdata/test-fullvirt-hpet-timer.cfg =================================================================== --- /dev/null +++ libvirt-3.0.0/tests/xlconfigdata/test-fullvirt-hpet-timer.cfg @@ -0,0 +1,27 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +pae = 1 +acpi = 1 +apic = 1 +hap = 0 +viridian = 0 +hpet = 1 +rtc_timeoffset = 0 +localtime = 0 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-system-i386" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000,rate=10240KB/s" ] +parallel = "none" +serial = "none" +builder = "hvm" +boot = "d" +disk = [ "format=raw,vdev=hda,access=rw,backendtype=phy,target=/dev/HostVG/XenGuest2", "format=qcow2,vdev=hdb,access=rw,backendtype=qdisk,target=/var/lib/libvirt/images/XenGuest2-home", "format=raw,vdev=hdc,access=ro,backendtype=qdisk,devtype=cdrom,target=/root/boot.iso" ] Index: libvirt-3.0.0/tests/xlconfigdata/test-fullvirt-hpet-timer.xml =================================================================== --- /dev/null +++ libvirt-3.0.0/tests/xlconfigdata/test-fullvirt-hpet-timer.xml @@ -0,0 +1,64 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>592896</memory> + <currentMemory unit='KiB'>403456</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='xenfv'>hvm</type> + <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + <hap state='off'/> + </features> + <clock offset='variable' adjustment='0' basis='utc'> + <timer name='hpet' present='yes'/> + </clock> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator> + <disk type='block' device='disk'> + <driver name='phy' type='raw'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/XenGuest2-home'/> + <target dev='hdb' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <bandwidth> + <outbound average='10240'/> + </bandwidth> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='8192' heads='1' primary='yes'/> + </video> + </devices> +</domain> Index: libvirt-3.0.0/tests/xlconfigdata/test-fullvirt-multi-timer.cfg =================================================================== --- /dev/null +++ libvirt-3.0.0/tests/xlconfigdata/test-fullvirt-multi-timer.cfg @@ -0,0 +1,28 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +pae = 1 +acpi = 1 +apic = 1 +hap = 0 +viridian = 0 +tsc_mode = "native" +hpet = 1 +rtc_timeoffset = 0 +localtime = 0 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-system-i386" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000,rate=10240KB/s" ] +parallel = "none" +serial = "none" +builder = "hvm" +boot = "d" +disk = [ "format=raw,vdev=hda,access=rw,backendtype=phy,target=/dev/HostVG/XenGuest2", "format=qcow2,vdev=hdb,access=rw,backendtype=qdisk,target=/var/lib/libvirt/images/XenGuest2-home", "format=raw,vdev=hdc,access=ro,backendtype=qdisk,devtype=cdrom,target=/root/boot.iso" ] Index: libvirt-3.0.0/tests/xlconfigdata/test-fullvirt-multi-timer.xml =================================================================== --- /dev/null +++ libvirt-3.0.0/tests/xlconfigdata/test-fullvirt-multi-timer.xml @@ -0,0 +1,65 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>592896</memory> + <currentMemory unit='KiB'>403456</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='xenfv'>hvm</type> + <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + <hap state='off'/> + </features> + <clock offset='variable' adjustment='0' basis='utc'> + <timer name='tsc' present='yes' mode='native'/> + <timer name='hpet' present='yes'/> + </clock> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator> + <disk type='block' device='disk'> + <driver name='phy' type='raw'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/XenGuest2-home'/> + <target dev='hdb' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <bandwidth> + <outbound average='10240'/> + </bandwidth> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='8192' heads='1' primary='yes'/> + </video> + </devices> +</domain> Index: libvirt-3.0.0/tests/xlconfigdata/test-fullvirt-tsc-timer.cfg =================================================================== --- /dev/null +++ libvirt-3.0.0/tests/xlconfigdata/test-fullvirt-tsc-timer.cfg @@ -0,0 +1,27 @@ +name = "XenGuest2" +uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809" +maxmem = 579 +memory = 394 +vcpus = 1 +pae = 1 +acpi = 1 +apic = 1 +hap = 0 +viridian = 0 +tsc_mode = "native" +rtc_timeoffset = 0 +localtime = 0 +on_poweroff = "destroy" +on_reboot = "restart" +on_crash = "restart" +device_model = "/usr/lib/xen/bin/qemu-system-i386" +sdl = 0 +vnc = 1 +vncunused = 1 +vnclisten = "127.0.0.1" +vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000,rate=10240KB/s" ] +parallel = "none" +serial = "none" +builder = "hvm" +boot = "d" +disk = [ "format=raw,vdev=hda,access=rw,backendtype=phy,target=/dev/HostVG/XenGuest2", "format=qcow2,vdev=hdb,access=rw,backendtype=qdisk,target=/var/lib/libvirt/images/XenGuest2-home", "format=raw,vdev=hdc,access=ro,backendtype=qdisk,devtype=cdrom,target=/root/boot.iso" ] Index: libvirt-3.0.0/tests/xlconfigdata/test-fullvirt-tsc-timer.xml =================================================================== --- /dev/null +++ libvirt-3.0.0/tests/xlconfigdata/test-fullvirt-tsc-timer.xml @@ -0,0 +1,64 @@ +<domain type='xen'> + <name>XenGuest2</name> + <uuid>c7a5fdb2-cdaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>592896</memory> + <currentMemory unit='KiB'>403456</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='xenfv'>hvm</type> + <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader> + <boot dev='cdrom'/> + </os> + <features> + <acpi/> + <apic/> + <pae/> + <hap state='off'/> + </features> + <clock offset='variable' adjustment='0' basis='utc'> + <timer name='tsc' present='yes' mode='native'/> + </clock> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator> + <disk type='block' device='disk'> + <driver name='phy' type='raw'/> + <source dev='/dev/HostVG/XenGuest2'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/XenGuest2-home'/> + <target dev='hdb' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:16:3e:66:92:9c'/> + <source bridge='xenbr1'/> + <bandwidth> + <outbound average='10240'/> + </bandwidth> + <script path='vif-bridge'/> + <model type='e1000'/> + </interface> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'> + <listen type='address' address='127.0.0.1'/> + </graphics> + <video> + <model type='cirrus' vram='8192' heads='1' primary='yes'/> + </video> + </devices> +</domain> Index: libvirt-3.0.0/tests/xlconfigtest.c =================================================================== --- libvirt-3.0.0.orig/tests/xlconfigtest.c +++ libvirt-3.0.0/tests/xlconfigtest.c @@ -265,6 +265,9 @@ mymain(void) DO_TEST("spice-features"); DO_TEST("vif-rate"); DO_TEST("fullvirt-nohap"); + DO_TEST("fullvirt-hpet-timer"); + DO_TEST("fullvirt-tsc-timer"); + DO_TEST("fullvirt-multi-timer"); DO_TEST("paravirt-cmdline"); DO_TEST_FORMAT("paravirt-cmdline-extra-root", false); ++++++ ff225538-libxl-autoballoon-setting.patch ++++++ commit ff225538d42f8e50bbc2c1c74d0a882ebaa73cd4 Author: Jim Fehlig <[email protected]> Date: Mon Jan 30 11:43:15 2017 -0700 libxl: honor autoballoon setting in libxl.conf libxlGetAutoballoonConf is supposed to honor user-specified autoballoon setting in libxl.conf. As written, the user-specified setting could be overwritten by the subsequent logic to check dom0_mem parameter. If user-specified setting is present and correct, accept it. Only fallback to checking Xen dom0_mem command line parameter if user-specfied setting is not present. Signed-off-by: Jim Fehlig <[email protected]> Index: libvirt-3.0.0/src/libxl/libxl_conf.c =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_conf.c +++ libvirt-3.0.0/src/libxl/libxl_conf.c @@ -1381,8 +1381,11 @@ libxlGetAutoballoonConf(libxlDriverConfi regex_t regex; int res; - if (virConfGetValueBool(conf, "autoballoon", &cfg->autoballoon) < 0) + res = virConfGetValueBool(conf, "autoballoon", &cfg->autoballoon); + if (res < 0) return -1; + else if (res == 1) + return 0; if ((res = regcomp(®ex, "(^| )dom0_mem=((|min:|max:)[0-9]+[bBkKmMgG]?,?)+($| )", ++++++ libxl-dom-reset.patch ++++++ --- /var/tmp/diff_new_pack.CIJTMH/_old 2017-02-22 13:49:00.714939375 +0100 +++ /var/tmp/diff_new_pack.CIJTMH/_new 2017-02-22 13:49:00.718938806 +0100 @@ -12,7 +12,7 @@ =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_driver.c +++ libvirt-3.0.0/src/libxl/libxl_driver.c -@@ -1386,6 +1386,61 @@ libxlDomainReboot(virDomainPtr dom, unsi +@@ -1389,6 +1389,61 @@ libxlDomainReboot(virDomainPtr dom, unsi } static int @@ -74,7 +74,7 @@ libxlDomainDestroyFlags(virDomainPtr dom, unsigned int flags) { -@@ -6438,6 +6493,7 @@ static virHypervisorDriver libxlHypervis +@@ -6442,6 +6497,7 @@ static virHypervisorDriver libxlHypervis .domainShutdown = libxlDomainShutdown, /* 0.9.0 */ .domainShutdownFlags = libxlDomainShutdownFlags, /* 0.9.10 */ .domainReboot = libxlDomainReboot, /* 0.9.0 */ ++++++ libxl-qemu-emulator-caps.patch ++++++ --- /var/tmp/diff_new_pack.CIJTMH/_old 2017-02-22 13:49:00.730937098 +0100 +++ /var/tmp/diff_new_pack.CIJTMH/_new 2017-02-22 13:49:00.734936528 +0100 @@ -20,7 +20,7 @@ #define VIR_FROM_THIS VIR_FROM_LIBXL -@@ -483,7 +484,7 @@ libxlCapsInitGuests(libxl_ctx *ctx, virC +@@ -489,7 +490,7 @@ libxlCapsInitGuests(libxl_ctx *ctx, virC if ((guest = virCapabilitiesAddGuest(caps, guest_archs[i].hvm ? VIR_DOMAIN_OSTYPE_HVM : VIR_DOMAIN_OSTYPE_XEN, guest_archs[i].arch, ++++++ libxl-set-cach-mode.patch ++++++ --- /var/tmp/diff_new_pack.CIJTMH/_old 2017-02-22 13:49:00.750934251 +0100 +++ /var/tmp/diff_new_pack.CIJTMH/_new 2017-02-22 13:49:00.754933681 +0100 @@ -7,7 +7,7 @@ =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_conf.c +++ libvirt-3.0.0/src/libxl/libxl_conf.c -@@ -583,6 +583,30 @@ libxlDiskSetDiscard(libxl_device_disk *x +@@ -609,6 +609,30 @@ libxlDiskSetDiscard(libxl_device_disk *x #endif } @@ -38,7 +38,7 @@ static char * libxlMakeNetworkDiskSrcStr(virStorageSourcePtr src, const char *username, -@@ -836,6 +860,7 @@ libxlMakeDisk(virDomainDiskDefPtr l_disk +@@ -856,6 +880,7 @@ libxlMakeDisk(virDomainDiskDefPtr l_disk x_disk->is_cdrom = l_disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM ? 1 : 0; if (libxlDiskSetDiscard(x_disk, l_disk->discard) < 0) return -1; ++++++ libxl-set-migration-constraints.patch ++++++ --- /var/tmp/diff_new_pack.CIJTMH/_old 2017-02-22 13:49:00.766931973 +0100 +++ /var/tmp/diff_new_pack.CIJTMH/_new 2017-02-22 13:49:00.770931404 +0100 @@ -56,7 +56,7 @@ =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_driver.c +++ libvirt-3.0.0/src/libxl/libxl_driver.c -@@ -6056,6 +6056,9 @@ libxlDomainMigratePerform3Params(virDoma +@@ -6060,6 +6060,9 @@ libxlDomainMigratePerform3Params(virDoma const char *dname = NULL; const char *uri = NULL; int ret = -1; @@ -66,7 +66,7 @@ #ifdef LIBXL_HAVE_NO_SUSPEND_RESUME virReportUnsupportedError(); -@@ -6072,6 +6075,18 @@ libxlDomainMigratePerform3Params(virDoma +@@ -6076,6 +6079,18 @@ libxlDomainMigratePerform3Params(virDoma virTypedParamsGetString(params, nparams, VIR_MIGRATE_PARAM_DEST_NAME, &dname) < 0 || @@ -85,7 +85,7 @@ virTypedParamsGetString(params, nparams, VIR_MIGRATE_PARAM_URI, &uri) < 0) -@@ -6086,11 +6101,11 @@ libxlDomainMigratePerform3Params(virDoma +@@ -6090,11 +6105,11 @@ libxlDomainMigratePerform3Params(virDoma if (flags & VIR_MIGRATE_PEER2PEER) { if (libxlDomainMigrationPerformP2P(driver, vm, dom->conn, dom_xml, ++++++ libxl-support-block-script.patch ++++++ --- /var/tmp/diff_new_pack.CIJTMH/_old 2017-02-22 13:49:00.782929696 +0100 +++ /var/tmp/diff_new_pack.CIJTMH/_new 2017-02-22 13:49:00.782929696 +0100 @@ -11,7 +11,7 @@ =================================================================== --- libvirt-3.0.0.orig/src/libxl/libxl_conf.c +++ libvirt-3.0.0/src/libxl/libxl_conf.c -@@ -583,6 +583,25 @@ libxlDiskSetDiscard(libxl_device_disk *x +@@ -609,6 +609,25 @@ libxlDiskSetDiscard(libxl_device_disk *x #endif } @@ -37,7 +37,7 @@ static void libxlDiskSetCacheMode(libxl_device_disk *x_disk, int cachemode) { -@@ -727,6 +746,7 @@ libxlMakeNetworkDiskSrc(virStorageSource +@@ -753,6 +772,7 @@ libxlMakeNetworkDiskSrc(virStorageSource int libxlMakeDisk(virDomainDiskDefPtr l_disk, libxl_device_disk *x_disk) { @@ -45,7 +45,7 @@ const char *driver = virDomainDiskGetDriver(l_disk); int format = virDomainDiskGetFormat(l_disk); int actual_type = virStorageSourceGetActualType(l_disk->src); -@@ -742,7 +762,7 @@ libxlMakeDisk(virDomainDiskDefPtr l_disk +@@ -768,7 +788,7 @@ libxlMakeDisk(virDomainDiskDefPtr l_disk if (libxlMakeNetworkDiskSrc(l_disk->src, &x_disk->pdev_path) < 0) return -1; } else { @@ -54,7 +54,7 @@ return -1; } -@@ -861,6 +881,9 @@ libxlMakeDisk(virDomainDiskDefPtr l_disk +@@ -881,6 +901,9 @@ libxlMakeDisk(virDomainDiskDefPtr l_disk if (libxlDiskSetDiscard(x_disk, l_disk->discard) < 0) return -1; libxlDiskSetCacheMode(x_disk, l_disk->cachemode);
