diff --git a/04197350-hap2.patch b/04197350-hap2.patch new file mode 100644 index 0000000..8b202d4 --- /dev/null +++ b/04197350-hap2.patch @@ -0,0 +1,89 @@ +commit 041973504f715bcff7de3b17cd258617244b79c4 +Author: Jim Fehlig +Date: Wed Jan 5 15:16:57 2011 -0700 + + Add support for HAP feature to xen drivers + + xen-unstable c/s 16931 introduced a per-domain setting for hvm + guests to enable/disable hardware assisted paging. If disabled, + software techniques such as shadow page tables are used. If enabled, + and the feature exists in underlying hardware, hardware support for + paging is used. + + This provides implementation for mapping HAP setting to/from + domxml/native formats in xen drivers. + +diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c +index 6ce0c3f..d3633ee 100644 +--- a/src/xen/xend_internal.c ++++ b/src/xen/xend_internal.c +@@ -2210,6 +2210,8 @@ xenDaemonParseSxpr(virConnectPtr conn, + def->features |= (1 << VIR_DOMAIN_FEATURE_APIC); + if (sexpr_int(root, "domain/image/hvm/pae")) + def->features |= (1 << VIR_DOMAIN_FEATURE_PAE); ++ if (sexpr_int(root, "domain/image/hvm/hap")) ++ def->features |= (1 << VIR_DOMAIN_FEATURE_HAP); + + /* Old XenD only allows localtime here for HVM */ + if (sexpr_int(root, "domain/image/hvm/localtime")) +@@ -5923,6 +5925,8 @@ xenDaemonFormatSxpr(virConnectPtr conn, + virBufferAddLit(&buf, "(apic 1)"); + if (def->features & (1 << VIR_DOMAIN_FEATURE_PAE)) + virBufferAddLit(&buf, "(pae 1)"); ++ if (def->features & (1 << VIR_DOMAIN_FEATURE_HAP)) ++ virBufferAddLit(&buf, "(hap 1)"); + + virBufferAddLit(&buf, "(usb 1)"); + +diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c +index 4d6b41b..ec618aa 100644 +--- a/src/xen/xm_internal.c ++++ b/src/xen/xm_internal.c +@@ -830,6 +830,10 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) { + goto cleanup; + else if (val) + def->features |= (1 << VIR_DOMAIN_FEATURE_APIC); ++ if (xenXMConfigGetBool(conf, "hap", &val, 0) < 0) ++ goto cleanup; ++ else if (val) ++ def->features |= (1 << VIR_DOMAIN_FEATURE_HAP); + } + if (xenXMConfigGetBool(conf, "localtime", &vmlocaltime, 0) < 0) + goto cleanup; +@@ -2409,6 +2413,10 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn, + (1 << VIR_DOMAIN_FEATURE_APIC)) ? 1 : 0) < 0) + goto no_memory; + ++ if (xenXMConfigSetInt(conf, "hap", ++ (def->features & ++ (1 << VIR_DOMAIN_FEATURE_HAP)) ? 1 : 0) < 0) ++ goto no_memory; + + if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME) { + if (def->clock.data.timezone) { +diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c +index 6fff276..fffa617 100644 +--- a/src/xenapi/xenapi_driver.c ++++ b/src/xenapi/xenapi_driver.c +@@ -1358,6 +1358,8 @@ xenapiDomainDumpXML (virDomainPtr dom, int flags ATTRIBUTE_UNUSED) + defPtr->features = defPtr->features | (1<contents[i].key, "pae")) + defPtr->features = defPtr->features | (1<contents[i].key, "hap")) ++ defPtr->features = defPtr->features | (1<features & (1 << VIR_DOMAIN_FEATURE_PAE)) + allocStringMap(&strings, (char *)"pae", (char *)"true"); ++ if (def->features & (1 << VIR_DOMAIN_FEATURE_HAP)) ++ allocStringMap(&strings, (char *)"hap", (char *)"true"); + } + if (strings != NULL) + (*record)->platform = strings; diff --git a/094c6f4a-hap-fix.patch b/094c6f4a-hap-fix.patch new file mode 100644 index 0000000..70bcf68 --- /dev/null +++ b/094c6f4a-hap-fix.patch @@ -0,0 +1,32 @@ +commit 094c6f4a24165d2d07f64bbd70243b3306a34d5b +Author: Jim Fehlig +Date: Fri Jan 14 11:12:46 2011 -0700 + + Fix 'make check' after commit 04197350 + + I broke 'make check' with commit 04197350 by unconditionally + emitting 'hap=' in xen xm driver. Only emit 'hap=' if + xendConfigVersion >= 3. I've tested sending 'hap=' to a Xen 3.2 + machine without support for hap setting and verified that xend + silently drops the unrecognized setting. + +diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c +index ec618aa..bfb6698 100644 +--- a/src/xen/xm_internal.c ++++ b/src/xen/xm_internal.c +@@ -2413,10 +2413,11 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn, + (1 << VIR_DOMAIN_FEATURE_APIC)) ? 1 : 0) < 0) + goto no_memory; + +- if (xenXMConfigSetInt(conf, "hap", +- (def->features & +- (1 << VIR_DOMAIN_FEATURE_HAP)) ? 1 : 0) < 0) +- goto no_memory; ++ if (priv->xendConfigVersion >= 3) ++ if (xenXMConfigSetInt(conf, "hap", ++ (def->features & ++ (1 << VIR_DOMAIN_FEATURE_HAP)) ? 1 : 0) < 0) ++ goto no_memory; + + if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME) { + if (def->clock.data.timezone) { diff --git a/4301b95a-json-cont-cmd.patch b/4301b95a-json-cont-cmd.patch new file mode 100644 index 0000000..002929a --- /dev/null +++ b/4301b95a-json-cont-cmd.patch @@ -0,0 +1,54 @@ +commit 4301b95af7f554700de8e69ecf3f3bb3148b1d44 +Author: Jim Fehlig +Date: Thu Jan 13 12:52:23 2011 -0700 + + [v2] qemu: Retry JSON monitor cont cmd on MigrationExpected error + + When restoring a saved qemu instance via JSON monitor, the vm is + left in a paused state. Turns out the 'cont' cmd was failing with + "MigrationExpected" error class and "An incoming migration is + expected before this command can be executed" error description + due to migration (restore) not yet complete. + + Detect if 'cont' cmd fails with "MigrationExpecte" error class and + retry 'cont' cmd. + + V2: Fix potential double-free noted by Laine Stump + +diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c +index 2e159c7..ca06e7e 100644 +--- a/src/qemu/qemu_monitor_json.c ++++ b/src/qemu/qemu_monitor_json.c +@@ -702,13 +702,29 @@ qemuMonitorJSONStartCPUs(qemuMonitorPtr mon, + int ret; + virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("cont", NULL); + virJSONValuePtr reply = NULL; ++ int i = 0, timeout = 3; + if (!cmd) + return -1; + +- ret = qemuMonitorJSONCommand(mon, cmd, &reply); ++ do { ++ ret = qemuMonitorJSONCommand(mon, cmd, &reply); + +- if (ret == 0) +- ret = qemuMonitorJSONCheckError(cmd, reply); ++ if (ret != 0) ++ break; ++ ++ /* If no error, we're done */ ++ if ((ret = qemuMonitorJSONCheckError(cmd, reply)) == 0) ++ break; ++ ++ /* If error class is not MigrationExpected, we're done. ++ * Otherwise try 'cont' cmd again */ ++ if (!qemuMonitorJSONHasError(reply, "MigrationExpected")) ++ break; ++ ++ virJSONValueFree(reply); ++ reply = NULL; ++ usleep(250000); ++ } while (++i <= timeout); + + virJSONValueFree(cmd); + virJSONValueFree(reply); diff --git a/48a5dccd-hap1.patch b/48a5dccd-hap1.patch new file mode 100644 index 0000000..2127da2 --- /dev/null +++ b/48a5dccd-hap1.patch @@ -0,0 +1,41 @@ +commit 48a5dccda905b5c6e8a02a37c093c42a9ef4e350 +Author: Jim Fehlig +Date: Wed Jan 5 14:56:48 2011 -0700 + + Add HAP to virDomainFeature enum + + Extend the virDomainFeature enumeration to include HAP (hardware + assisted paging) feature. + + Hardware features such as Extended Page Table and Nested Page + Table augment hypervisor software techniques such as shadow + page table. Adding HAP to the virDomainFeature enumeration + allows users to select between hardware and software memory + management mechanisms for their guests. + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index b4df38c..2c54683 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -75,7 +75,8 @@ VIR_ENUM_IMPL(virDomainBoot, VIR_DOMAIN_BOOT_LAST, + VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST, + "acpi", + "apic", +- "pae") ++ "pae", ++ "hap") + + VIR_ENUM_IMPL(virDomainLifecycle, VIR_DOMAIN_LIFECYCLE_LAST, + "destroy", +diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h +index a459a22..6a8ec64 100644 +--- a/src/conf/domain_conf.h ++++ b/src/conf/domain_conf.h +@@ -730,6 +730,7 @@ enum virDomainFeature { + VIR_DOMAIN_FEATURE_ACPI, + VIR_DOMAIN_FEATURE_APIC, + VIR_DOMAIN_FEATURE_PAE, ++ VIR_DOMAIN_FEATURE_HAP, + + VIR_DOMAIN_FEATURE_LAST + }; diff --git a/79f56c66-hap4.patch b/79f56c66-hap4.patch new file mode 100644 index 0000000..6f47596 --- /dev/null +++ b/79f56c66-hap4.patch @@ -0,0 +1,56 @@ +commit 79f56c669f0f4d554cec3137d0a6aadf7c5f2bec +Author: Jim Fehlig +Date: Wed Jan 5 16:07:54 2011 -0700 + + Document HAP domain feature + + Add HAP feature to schema and documentation. + +Index: libvirt-0.8.7/docs/formatdomain.html.in +=================================================================== +--- libvirt-0.8.7.orig/docs/formatdomain.html.in ++++ libvirt-0.8.7/docs/formatdomain.html.in +@@ -437,6 +437,7 @@ + <pae/> + <acpi/> + <apic/> ++ <hap/> + </features> + ... + +@@ -456,6 +457,10 @@ +
ACPI is useful for power management, for example, with + KVM guests it is required for graceful shutdown to work. +
++
hap
++
Enable use of Hardware Assisted Paging if available in ++ the hardware. ++
+ + +

Time keeping

+Index: libvirt-0.8.7/docs/schemas/domain.rng +=================================================================== +--- libvirt-0.8.7.orig/docs/schemas/domain.rng ++++ libvirt-0.8.7/docs/schemas/domain.rng +@@ -1741,7 +1741,7 @@ + + + + + +@@ -1762,6 +1762,11 @@ + + + ++ ++ ++ ++ ++ + + + diff --git a/af521a01-hap3.patch b/af521a01-hap3.patch new file mode 100644 index 0000000..740f4fd --- /dev/null +++ b/af521a01-hap3.patch @@ -0,0 +1,36 @@ +commit af521a0182a0d6867796c65b1b0cd83fb14032a9 +Author: Jim Fehlig +Date: Wed Jan 5 15:20:01 2011 -0700 + + Add HAP to xen hypervisor capabilities + + xen-unstable c/s 16931 introduced a per-domain setting for hvm + guests to enable/disable hardware assisted paging. If disabled, + software techniques such as shadow page tables are used. If enabled, + and the feature exists in underlying hardware, hardware support for + paging is used. + + Xen does not provide a mechanism to discover the HAP capability, so + we advertise its availability for hvm guests on Xen >= 3.3. + +diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c +index ead8ee9..229ef3d 100644 +--- a/src/xen/xen_hypervisor.c ++++ b/src/xen/xen_hypervisor.c +@@ -2321,6 +2321,16 @@ xenHypervisorBuildCapabilities(virConnectPtr conn, + hv_minor > 0 ? + 0 : 1)) == NULL) + goto no_memory; ++ ++ /* Xen 3.3.x and beyond supports enabling/disabling ++ * hardware assisted paging. Default is off. ++ */ ++ if ((hv_major == 3 && hv_minor >= 3) || (hv_major > 3)) ++ if (virCapabilitiesAddGuestFeature(guest, ++ "hap", ++ 0, ++ 1) == NULL) ++ goto no_memory; + } + } + diff --git a/libvirt.changes b/libvirt.changes index ded6ac3..61f9062 100644 --- a/libvirt.changes +++ b/libvirt.changes @@ -1,3 +1,28 @@ +------------------------------------------------------------------- +Mon Jan 31 09:14:37 MST 2011 - jfehlig@novell.com + +- Remove explicit dependency on libyajl + libvirt.spec + bnc#668225 + +------------------------------------------------------------------- +Fri Jan 21 11:04:07 MST 2011 - jfehlig@novell.com + +- Retry JSON monitor 'cont' cmd on MigrationExpected error + 4301b95a-json-cont-cmd.patch + +------------------------------------------------------------------- +Tue Jan 18 14:57:18 MST 2011 - jfehlig@novell.com + +- Add support for specifying Hardware Assisted Paging (HAP) in + libvirt domain XML. + 48a5dccd-hap1.patch + 04197350-hap2.patch + af521a01-hap3.patch + 79f56c66-hap4.patch + 094c6f4a-hap-fix.patch + bnc#659665 + ------------------------------------------------------------------- Tue Jan 18 09:25:18 MST 2011 - jfehlig@novell.com diff --git a/libvirt.spec b/libvirt.spec index ea97824..7ef59d7 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -158,9 +158,6 @@ Recommends: logrotate Recommends: dnsmasq Recommends: open-iscsi Recommends: nfs-client -%if %{with_yajl} -Requires: libyajl -%endif %if %{with_hal} Requires: hal %endif @@ -173,6 +170,12 @@ Source0: %{name}-%{version}.tar.bz2 Source1: libvirtd.init # Upstream patches Patch0: a43c7338-dnsmasq-hostfile-fix.patch +Patch1: 48a5dccd-hap1.patch +Patch2: 04197350-hap2.patch +Patch3: af521a01-hap3.patch +Patch4: 79f56c66-hap4.patch +Patch5: 094c6f4a-hap-fix.patch +Patch6: 4301b95a-json-cont-cmd.patch # Need to go upstream Patch100: xen-name-for-devid.patch Patch102: clone.patch @@ -286,6 +289,12 @@ Authors: %prep %setup -q %patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 %patch100 -p1 %patch102 %patch103 -p1 diff --git a/xen-name-for-devid.patch b/xen-name-for-devid.patch index 5b04ade..c66707f 100644 --- a/xen-name-for-devid.patch +++ b/xen-name-for-devid.patch @@ -13,10 +13,10 @@ Date: Wed Jan 27 16:11:41 2010 -0700 This approach allows removing a disk when domain is inactive. We obviously can't search xenstore when the domain is inactive. -Index: libvirt-0.8.6/src/xen/xend_internal.c +Index: libvirt-0.8.7/src/xen/xend_internal.c =================================================================== ---- libvirt-0.8.6.orig/src/xen/xend_internal.c -+++ libvirt-0.8.6/src/xen/xend_internal.c +--- libvirt-0.8.7.orig/src/xen/xend_internal.c ++++ libvirt-0.8.7/src/xen/xend_internal.c @@ -89,6 +89,7 @@ xenDaemonFormatSxprOnePCI(virDomainHostd static int @@ -25,7 +25,7 @@ Index: libvirt-0.8.6/src/xen/xend_internal.c virDomainDeviceDefPtr dev, char *class, char *ref, -@@ -4052,7 +4053,7 @@ xenDaemonAttachDeviceFlags(virDomainPtr +@@ -4054,7 +4055,7 @@ xenDaemonAttachDeviceFlags(virDomainPtr sexpr = virBufferContentAndReset(&buf); @@ -34,7 +34,7 @@ Index: libvirt-0.8.6/src/xen/xend_internal.c /* device doesn't exist, define it */ ret = xend_op(domain->conn, domain->name, "op", "device_create", "config", sexpr, NULL); -@@ -4170,7 +4171,7 @@ xenDaemonUpdateDeviceFlags(virDomainPtr +@@ -4172,7 +4173,7 @@ xenDaemonUpdateDeviceFlags(virDomainPtr sexpr = virBufferContentAndReset(&buf); @@ -43,7 +43,7 @@ Index: libvirt-0.8.6/src/xen/xend_internal.c virXendError(VIR_ERR_OPERATION_INVALID, "%s", _("requested device does not exist")); goto cleanup; -@@ -4263,7 +4264,7 @@ xenDaemonDetachDeviceFlags(virDomainPtr +@@ -4265,7 +4266,7 @@ xenDaemonDetachDeviceFlags(virDomainPtr def, xml, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; @@ -52,7 +52,7 @@ Index: libvirt-0.8.6/src/xen/xend_internal.c goto cleanup; if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) { -@@ -6033,6 +6034,7 @@ error: +@@ -6037,6 +6038,7 @@ error: */ static int virDomainXMLDevID(virDomainPtr domain, @@ -60,7 +60,7 @@ Index: libvirt-0.8.6/src/xen/xend_internal.c virDomainDeviceDefPtr dev, char *class, char *ref, -@@ -6041,8 +6043,12 @@ virDomainXMLDevID(virDomainPtr domain, +@@ -6045,8 +6047,12 @@ virDomainXMLDevID(virDomainPtr domain, xenUnifiedPrivatePtr priv = domain->conn->privateData; char *xref; char *tmp; @@ -73,7 +73,7 @@ Index: libvirt-0.8.6/src/xen/xend_internal.c if (dev->data.disk->driverName && STREQ(dev->data.disk->driverName, "tap")) strcpy(class, "tap"); -@@ -6052,19 +6058,21 @@ virDomainXMLDevID(virDomainPtr domain, +@@ -6056,19 +6062,21 @@ virDomainXMLDevID(virDomainPtr domain, else strcpy(class, "vbd");