From 041973504f715bcff7de3b17cd258617244b79c4 Mon Sep 17 00:00:00 2001 From: Jim Fehlig Date: Wed, 5 Jan 2011 15:16:57 -0700 Subject: [PATCH] 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. --- src/xen/xend_internal.c | 4 ++++ src/xen/xm_internal.c | 8 ++++++++ src/xenapi/xenapi_driver.c | 2 ++ src/xenapi/xenapi_utils.c | 2 ++ 4 files changed, 16 insertions(+) diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index 6ce0c3fe7d..d3633ee889 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 4d6b41b032..ec618aa428 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 6fff276806..fffa6170f8 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; -- GitLab