[libvirt] [PATCH 2/4] Add support for HAP feature to xen drivers

Jim Fehlig jfehlig at novell.com
Wed Jan 5 23:32:40 UTC 2011


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(+), 0 deletions(-)

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;
-- 
1.7.3.1




More information about the libvir-list mailing list