SHA256
1
0
forked from pool/libvirt

Add HAP support to libvirt domain XML

OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=90
This commit is contained in:
James Fehlig 2011-01-18 22:11:51 +00:00 committed by Git OBS Bridge
parent 6551d822aa
commit b62b15355b
8 changed files with 285 additions and 9 deletions

89
04197350-hap2.patch Normal file
View File

@ -0,0 +1,89 @@
commit 041973504f715bcff7de3b17cd258617244b79c4
Author: Jim Fehlig <jfehlig@novell.com>
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<<VIR_DOMAIN_FEATURE_APIC);
else if (STREQ(result->contents[i].key, "pae"))
defPtr->features = defPtr->features | (1<<VIR_DOMAIN_FEATURE_PAE);
+ else if (STREQ(result->contents[i].key, "hap"))
+ defPtr->features = defPtr->features | (1<<VIR_DOMAIN_FEATURE_HAP);
}
}
xen_string_string_map_free(result);
diff --git a/src/xenapi/xenapi_utils.c b/src/xenapi/xenapi_utils.c
index a7e2a4b..2ec5f9e 100644
--- a/src/xenapi/xenapi_utils.c
+++ b/src/xenapi/xenapi_utils.c
@@ -529,6 +529,8 @@ createVMRecordFromXml (virConnectPtr conn, virDomainDefPtr def,
allocStringMap(&strings, (char *)"apic", (char *)"true");
if (def->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;

32
094c6f4a-hap-fix.patch Normal file
View File

@ -0,0 +1,32 @@
commit 094c6f4a24165d2d07f64bbd70243b3306a34d5b
Author: Jim Fehlig <jfehlig@novell.com>
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) {

41
48a5dccd-hap1.patch Normal file
View File

@ -0,0 +1,41 @@
commit 48a5dccda905b5c6e8a02a37c093c42a9ef4e350
Author: Jim Fehlig <jfehlig@novell.com>
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
};

56
79f56c66-hap4.patch Normal file
View File

@ -0,0 +1,56 @@
commit 79f56c669f0f4d554cec3137d0a6aadf7c5f2bec
Author: Jim Fehlig <jfehlig@novell.com>
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 @@
&lt;pae/&gt;
&lt;acpi/&gt;
&lt;apic/&gt;
+ &lt;hap/&gt;
&lt;/features&gt;
...</pre>
@@ -456,6 +457,10 @@
<dd>ACPI is useful for power management, for example, with
KVM guests it is required for graceful shutdown to work.
</dd>
+ <dt><code>hap</code></dt>
+ <dd>Enable use of Hardware Assisted Paging if available in
+ the hardware.
+ </dd>
</dl>
<h3><a name="elementsTime">Time keeping</a></h3>
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 @@
</element>
</define>
<!--
- A set of optional features: PAE, APIC and ACPI support
+ A set of optional features: PAE, APIC, ACPI, and HAP support
-->
<define name="features">
<optional>
@@ -1762,6 +1762,11 @@
<empty/>
</element>
</optional>
+ <optional>
+ <element name="hap">
+ <empty/>
+ </element>
+ </optional>
</interleave>
</element>
</optional>

36
af521a01-hap3.patch Normal file
View File

@ -0,0 +1,36 @@
commit af521a0182a0d6867796c65b1b0cd83fb14032a9
Author: Jim Fehlig <jfehlig@novell.com>
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;
}
}

View File

@ -1,3 +1,15 @@
-------------------------------------------------------------------
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

View File

@ -173,6 +173,11 @@ 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
# Need to go upstream
Patch100: xen-name-for-devid.patch
Patch102: clone.patch
@ -286,6 +291,11 @@ Authors:
%prep
%setup -q
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch100 -p1
%patch102
%patch103 -p1

View File

@ -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");