forked from pool/libvirt
90 lines
4.0 KiB
Diff
90 lines
4.0 KiB
Diff
|
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;
|